读取文件时获取到重复数据,求代码错误原因及排查思路
问题分析与解决
你的问题出在使用!feof(fPointer)作为循环条件上——这是C语言文件操作里一个非常容易踩的经典坑!
为什么会重复输出?
feof()函数的工作逻辑和你想的不一样:它只有在你尝试读取越过文件末尾的时候,才会返回真。也就是说,当你的代码读到最后一行"what to write\n"时,此时文件指针已经到了末尾,但feof()还没被触发(因为你还没尝试去读末尾之后的内容),所以循环会再执行一次。
第二次循环里,fgets()尝试读取已经到末尾的文件,会读取失败(返回NULL),但你并没有检查这个返回值,而是直接把singleLine里上次读取的残留内容又用puts()输出了一遍,这就导致了内容被显示两次的问题。
修正后的代码
正确的做法是把fgets()的返回值作为循环条件——因为fgets()在成功读取时返回指向缓冲区的指针,到达文件末尾或读取失败时返回NULL,这样能精准控制循环的结束时机:
fPointer = fopen("fileName.txt" , "r"); // 打开文件准备读取 // 别忘了检查文件是否成功打开!避免空指针操作 if (fPointer == NULL) { perror("Failed to open file"); return 1; } char singleLine [100]; // 先执行读取操作,再判断是否继续循环 while(fgets(singleLine, 100, fPointer) != NULL){ puts(singleLine); } fclose(fPointer); // 操作完成后一定要关闭文件,避免资源泄漏
额外小提醒
- 永远要检查
fopen()的返回值,如果文件打开失败(比如权限不足、路径错误),fPointer会是NULL,不检查的话后续操作会直接崩溃。 feof()不是用来控制循环的,它的正确用法是在读取失败后,判断是到达了文件末尾还是发生了读取错误(比如磁盘故障)。
内容的提问来源于stack exchange,提问作者Tamir Abutbul
相关产品推荐
相关产品推荐

