如何使用fread从文件中读取特定数据?

时间:2017-04-10 18:01:35

标签: c file-handling fwrite fread

以下代码使用fwrite将student的数据写入文件并使用fread读取数据:

 struct record
{
    char name[20];
    int roll;
    float marks;
}student;

#include<stdio.h>
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);


}

**OUTPUT OF ABOVE PROGRAM**

正如您在输出图像中看到的那样,还会打印带有其他值的标记,而对于所需的输出标记,仅需要值为91和94的

在上面的代码中需要进行哪些更正以获得所需的输出?

2 个答案:

答案 0 :(得分:0)

根据您对fread个字节数的sizeof(student.marks)操作,您一次执行fwritesizeof(student)个字节数的操作可能会给您带来虚假结果。

另一种思考方式是假装你是图书出版商。您可以一次在一张纸上打印或书写一本书。当您想要返回并在每页上找到页码时,您不会一次只读一页。这会给你一个奇怪/错误的答案。您在整个页面中阅读以获取所需的页码。

调查fread - 每次迭代的sizeof(student)个字节数,将这些字节写入student结构。然后访问该结构的marks属性。

答案 1 :(得分:0)

您正在读取和写入不同长度的记录,因此您的读取将为您提供空的浮点数。如果将记录编写为结构的三个段,则必须回读结构的整个长度以找到您感兴趣的字段。

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