【问题标题】:Output returns null results when read from a file从文件读取时输出返回空结果
【发布时间】:2021-08-19 14:25:42
【问题描述】:

我正在尝试创建一个信息系统,但每当我尝试打印输出时,它只会打印出我输入的最后一件事。这是我正在使用的功能。

void displayStudents(){
    
    FILE *fp;
    fp = fopen("studentlist.txt", "rb");
    if(!fp){
        printf("File could not be opened.\n");
    }else{

        studentInfo s;

        while(fread(&s, sizeof(studentInfo), 1, fp) && !feof(fp)){
            printf("Student Number: %i\n", s.studentNumber);
            printf("Last Name: %s\n", s.lastName);
            printf("First Name: %s\n", s.firstName);
            printf("Course: %s\n", s.course);
            printf("Year Level: %i\n", s.yearLevel);
            printf("Age: %i\n", s.age);
            printf("Sex: %c\n", s.sex);
            printf("Final Grade: %i\n", s.finalGrade);
            printf("\n\n");
        }

        fclose(fp);
    }

}

studentInfo 是一个包含以下内容的结构体...

struct studentInfo{
    int studentNumber;
    char lastName[15];
    char firstName[15];
    char course[15];
    int yearLevel;
    int age;
    char sex;
    int finalGrade;
};
typedef struct studentInfo studentInfo;

程序的输出如下:

Student Number: 0
Last Name:
First Name:
Course:
Year Level: 0
Age: 0
Sex:
Final Grade: 0


Student Number: 0
Last Name:
First Name:
Course:
Year Level: 0
Age: 0
Sex:
Final Grade: 0


Student Number: 3
Last Name: Rambo
First Name: Ra
Course: CS
Year Level: 1
Age: 10
Sex: F
Final Grade: 89

我尝试注册 3 名学生,但它只打印最后的信息,而不是之前的信息。我希望它能够显示我输入的所有学生信息。

【问题讨论】:

  • 文件扩展名.txt 表示您的输入文件是文本文件。但是,您使用fread 的事实意味着您的输入文件是二进制文件,而不是文本文件。请向我们展示您的输入文件的内容。
  • 哦,我明白了,所以我使用了错误的文件类型。谢谢!现在可以使用了~
  • "File could not be opened.\n" 是无用错误消息的典型示例,您将其写入错误的流。试试const char *path = "studentlist.txt"; if( (fp = fopen(path, "rb")) == NULL ){ perror(path);...
  • 在while循环条件下对feof的调用完全没有意义。

标签: c file structure


【解决方案1】:

我意识到我正在将二进制文件放入文件中,并且只是将其作为.txt 读取,因此它从未成功过。这就是为什么我只是将我的文件类型从.txt 更改为.bin,这样它就会读取并且确实如此。当我应该完成rb 时,我通常也像阅读任何其他文本一样阅读 bin 文件。我的错。

【讨论】:

  • 这个解释似乎并不完整。您是否有多个输入文件,一个名为mystudents.txt,一个名为mystudents.bin,您是否加载了错误的输入文件?还是您只有一个输入文件,并且您只是重命名了该文件?
  • 在您最近的编辑之后,答案对我来说仍然没有意义。您声称问题在于您将文件作为文本文件读取,但问题中的代码包含fp = fopen("studentlist.txt", "rb"); 行,它以二进制模式打开文件(由于b)。此外,问题中的代码使用fread,这意味着它被读取为未格式化(非文本)数据。因此,据我所知,您的问题或答案都包含虚假信息,因为它们似乎相互矛盾。文件名(.txt.bin)应该无关紧要。
  • 除了将文件从 .txt 重命名为 .bin 之外,您确定没有进行任何其他更改吗?
  • @AndreasWenzel 我没有,事实证明我一直在用二进制写,但我把它当作普通文本阅读,这就是它不起作用的原因。
  • 哦,是的,你的解释更有意义。对不起,我对这些术语不是很精通,我才刚刚开始理解这一点。可悲的是,没有人给出更全面的答案,所以我只是把我所做的一切都对我有用,希望能帮助其他可能遇到类似情况的人。
猜你喜欢
  • 1970-01-01
  • 2014-05-06
  • 2014-09-17
  • 2018-11-21
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多