gpt4 book ai didi

C文件处理记录搜索: last record displayed twice

转载 作者:行者123 更新时间:2023-11-30 17:41:30 25 4
gpt4 key购买 nike

我用c编写了简单的代码,将学生信息(学号、姓名、类(class)、费用、部门)存储在文本文件student.txt中——代码片段:

FILE *fp;
fp=fopen("student.txt","r");
//Input details from user and ..
//store it in student.txt
fprintf(fp,"%d %s %s %d %s ",s.rollno,s.name,s.course,s.fee,s.dept);

我编写了以下代码来检索并打印文件中的所有记录,并且它检索了最后一条记录两次!

while (!feof(fp))
{
fscanf(fp,"%d%s%s%d%s",&s.rollno,s.name,s.course,&s.fee,s.dept);

printf("%d %s %s %d %s\n",s.rollno,s.name,s.course,s.fee,s.dept);

}

//OUTPUT :
46 mustafa be 12000 cse
41 Sam BE 32000 CSE
42 Howard BE 25000 EE
44 Sheldon BE 25000 CSE
44 Sheldon BE 25000 CSE

为什么最后一条记录(Sheldon..)从文件中读取两次(尽管我检查过,它只在文件中写入一次)。请帮忙,真的很困难。

最佳答案

只有在您尝试读取文件末尾之外的内容后,流的 EOF 指示符才会设置。因此,除非您已经尝试走得太远,否则使用 feof() 进行的测试将不起作用。

您可以在 ISO C11 标准中看到此行为,其中规定了 fgetc:

If the end-of-file indicator for the stream is set, or if the stream is at end-of-file, the end-of-file indicator for the stream is set and the fgetc function returns EOF.

换句话说,第一次为流设置 EOF 标志是当您尝试读取文件中最后一个字符之外的第一个字符时。

您的情况是文件指针位于文件末尾,刚刚成功读取了最后一个字符。考虑到 fscanf() 能够跳过前导空格等,它比上面的稍微复杂一些,但基本上,下一个 fscanf() 将读取超出文件末尾的内容在扫描任何项目之前。

并且,当您到达文件末尾时,feof() 尚未成立。然后,您的代码将尝试 fscanf ,它将失败(并设置 EOF 标志),并且 printf 将再次输出以前的内容(因为 fscanf 没有更改它们)。

由于 fscanf 返回成功扫描的项目数,因此您可以选择以下内容:

while (fscanf (fp, "%d%s%s%d%s", blah, blah) == 5) {
printf (blah, blah);
}
// check feof here to deside if EOF or bad input line.

有关完整示例,请参阅以下程序:

#include <stdio.h>

int main (void) {
int rollno, fee;
char name[100], course[100], dept[100];
FILE *fp = fopen ("qq.in", "r");
if (fp == NULL) {
puts ("Cannot open file");
return 1;
}
while (fscanf (fp, "%d%s%s%d%s", &rollno, name, course, &fee, dept) == 5) {
printf ("%d %s %s %d %s\n", rollno, name, course, fee, dept);
}
fclose (fp);
return 0;
}

关于C文件处理记录搜索: last record displayed twice,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21071127/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com