¿Cómo leer datos particulares de un archivo usando fread?

El siguiente código escribe los datos del estudiante en un archivo usando fwrite y lee los datos usando fread:

struct record { char name[20]; int roll; float marks; }student; #include void main() { int i; FILE *fp; fp=fopen("1.txt","wb"); //opening file in wb to write into file if(fp==NULL) //check if can be open { printf("\nERROR IN OPENING FILE"); exit(1); } for(i=0;i<2;i++) { printf("ENTER NAME, ROLL_ NO AND MARKS OF STUDENT\n"); scanf("%s %d %f",student.name,&student.roll,&student.marks); fwrite(&student,sizeof(student),1,fp); //writing into file } fclose(fp); fp=fopen("1.txt","rb"); //opening file in rb mode to read particular data if(fp==NULL) //check if file can be open { printf("\nERROR IN OPENING FILE"); exit(1); } while(fread(&student.marks,sizeof(student.marks),1,fp)==1) //using return value of fread to repeat loop printf("\nMARKS: %f",student.marks); fclose(fp); } 

** PROGRAMA DE SALIDA DE ARRIBA **

Como puede ver en la imagen de salida, también se imprimen marcas con algunos otros valores, mientras que para las marcas de salida deseadas solo se requieren valores con 91 y 94

¿Qué correcciones deben hacerse en el código anterior para obtener el resultado deseado?

Estás leyendo y escribiendo registros de diferentes longitudes, y por lo tanto tus lecturas te dan números de punto flotante vacíos. Si escribe sus registros como tres segmentos de una estructura, debe volver a leer toda la longitud de la estructura para ubicar los campos que le interesan.

 while(fread(&student, sizeof(student), 1, fp) == 1)) //using return value of fread to repeat loop printf("\nMARKS: %f",student.marks); 

Hacer operaciones fread de número de bytes de sizeof(student.marks) a la vez puede darte resultados falsos, dado cómo hiciste operaciones de fwrite en números de bytes de sizeof(student) .

Otra forma de pensar sobre esto es fingir que eres un editor de libros. Imprime o escribe un libro en una hoja de papel a la vez. Cuando quiera regresar y buscar el número de página en cada página, no leerá las páginas palabra por palabra. Eso te dará una respuesta rara / incorrecta. Lees toda la página para recuperar el número de página que deseas.

Investigue el número de bytes sizeof(student) fread -ing de sizeof(student) en cada iteración, escribiendo esos bytes en una estructura de student . Luego accede a las marks propiedad de esa estructura.