fread()无法正常工作?

时间:2014-05-18 11:20:46

标签: c

我有这个代码,用于从文本文件中读取,将信息存储在bin文件中,然后从bin文件中读取信息并将其投影到屏幕上。 我对bin文件的写入都是正确的,除非我将tempStudents打印到屏幕时它总是说明文本文件中的LAST选项。所以就好像唯一的学生就是最后一个学生。

#include<stdlib.h>
#include<stdio.h>

struct student {
    char name[200];
    float marks;
};



int main() {

    FILE * txtFile;
    struct student tempStudent;
    // File pointer to binary file
    FILE * binFile;
    int searchNum;

    if ((txtFile = fopen("/Users/Ash/Desktop/Lab 8B/input.txt", "r")) == NULL) {
        printf("Can not open file input.txt\n");
    }
    else {
        FILE * binFile;
        binFile = fopen("/Users/Ash/Desktop/Lab 8B/binFile.bin","w+b");


        while (fscanf(txtFile,"%s %f", tempStudent.name, &(tempStudent.marks)) == 2) {
            fwrite(tempStudent.name,sizeof(char),sizeof(tempStudent.name),binFile);
            fwrite(&tempStudent.marks,sizeof(int),1,binFile);


        }
        printf("Please enter the student you want to search for\n");
        printf("For example if you want the first student type 1\n");
        scanf("%d", &searchNum);
        int i = 0;

        for (i = 0; i <= searchNum; i++)
        {
            fread(tempStudent.name, 60, sizeof(char),binFile);
            fread(&tempStudent.marks,60, sizeof(int),binFile);
        }
        // write code that reads in the student structure that the user asked for
        // from the binary file and store it in the variable tempStudent


        printf("The student name retreived is: %s\n", tempStudent.name);
        printf("The student mark retreived is: %.2f\n", tempStudent.marks);
        fclose(binFile);

        fclose(txtFile);
    }

    return 0;

}

3 个答案:

答案 0 :(得分:0)

文件类似于当前位置。将二进制数据写入文件后,此位置结束。当您(尝试)读取此状态下的bin数据时fread将不读任何内容。

Check the return values!

答案 1 :(得分:0)

您正在将60*sizeof(int)个字节的数据写入单个float元素:

struct student {
    char name[200];
    float marks;
};

struct student tempStudent;

fread(&tempStudent.marks,60,sizeof(int),binFile);

当然,您不能期望此代码能够正常运行!!!

答案 2 :(得分:0)

你总是在寻找一个人:

for (i = 0; i <= searchNum; i++)

如果你想要第一个学生(searchNum = 1),那么你实际上会做两次阅读。通常这会让你“比我打算阅读的价值多一个”。

更重要的是,如果您正在从文件中读取和写入,则需要确保从正确的位置开始。为此,您拥有fseek()功能。而不是进行大量的读/写操作,只需确保在读或写之前就在正确的位置。

更重要的是,你似乎有你的名字和标记的可变长度记录 - 这使整个事情变得一团糟。一些建议:

  1. 使记录长度保持不变 - 通过这种方式,您可以fseek到特定记录,而无需先读取所有以前的记录。
  2. 在阅读和写入文件的同时非常小心;考虑首先将所有输入写入文件,关闭文件,然后打开阅读
  3. 确保您读取正确的字节数...不要只是硬连线“60”。
  4. 了解fseek()。谷歌吧。