You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

读取文件时获取到重复数据,求代码错误原因及排查思路

问题分析与解决

你的问题出在使用!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); // 操作完成后一定要关闭文件,避免资源泄漏

额外小提醒

  1. 永远要检查fopen()的返回值,如果文件打开失败(比如权限不足、路径错误),fPointer会是NULL,不检查的话后续操作会直接崩溃。
  2. feof()不是用来控制循环的,它的正确用法是在读取失败后,判断是到达了文件末尾还是发生了读取错误(比如磁盘故障)。

内容的提问来源于stack exchange,提问作者Tamir Abutbul

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.13 08:49:29