保存在文件中的记录
records stored in a file
在" somefile.dat "中存储了10条记录,但是下面的程序打印了11个名字。什么走错了吗?
void main()
{
struct student
{
char name[30], rollno[6];
}stud;
FILE *fp = fopen(“somefile.dat”,”r”);
while(!feof(fp))
{
fread(&stud, sizeof(stud), 1 , fp);
puts(stud.name);
}
}
feof
函数导致循环比预期的多进入一次。要了解完整的解释,请阅读这里:
为什么"while (!feof (file))"总是错的?
feof()
仅当您尝试在文件末尾或之后读取时返回true。
当你读了最后一个数据,你仍然在文件的有效区域。
当在下一次迭代中检查条件时,它仍然是相同的。因此,您将再次读取,这次是在文件末尾之后。因此,您读取0个字符,将"nothing"输入到字符串中(因此它保持不变),并再次打印它。只有在此之后(因为您通过了文件的末尾),feof()
才会返回true。
可以:
void main()
{
struct student
{
char name[30], rollno[6];
}stud;
FILE *fp = fopen(“somefile.dat”,”r”);
while(!feof(fp))
{
fread(&stud, sizeof(stud), 1 , fp);
puts(stud.name);
if ( feof(fp) )
break;
}
}
feof()的目的不是检查下一次读是否到达文件的末尾。feof()的目的是区分读取错误和到达文件末尾。如果fread()返回0,则调用feof/error来采取一些操作。
话虽如此,你应该替换这个:
FILE *fp = fopen(“somefile.dat”,”r”);
while(!feof(fp))
{
fread(&stud, sizeof(stud), 1 , fp);
puts(stud.name);
}
与这个: FILE *fp = fopen(“somefile.dat”,”r”);
fread(&stud, sizeof(stud), 1 , fp);
while(!feof(fp))
{
puts(stud.name);
fread(&stud, sizeof(stud), 1 , fp);
}
相关文章:
- 创建 Spdlog 异步文件记录器时遇到困难
- 分段错误:从文件中访问csv记录时转储了核心
- C++ 仅读取输入文件中的部分(不是全部)数据以添加到记录中
- c++ - 将大文件记录处理到 cpp 容器的最有效方法
- GDB / C++ - 根据循环条件将多个变量记录到输出文件中
- 在OSX中使用CGDisplayStream存储屏幕记录的特定文件路径
- 如何在文本文件中搜索员工记录(按名称)并仅显示其详细信息?
- 在二进制文件中删除记录
- C++同时记录到控制台和日志文件
- 如何让 doxygen 记录 .tcc 文件中定义的模板类?
- 为什么 fstream 打印出文件的最后一条记录
- QT控制台:记录所有stdin和stdout要文件
- 文件仅读取1个记录,然后到达文件的末尾,即使还有其他记录
- 将记录添加到文件中并将其读回
- C - 如何在文本文件中搜索学生记录
- 在特定字段中关键字搜索后,从文本文件中提取多个记录
- C 11中线程之间的共享文件记录
- 在数据库文件中创建10条空白记录
- 在C++中,文件中的下一条记录被非法更新
- Python的氧:一个段落记录文件和包