C语言读取.txt文件时最后一个字符串重复的问题求解
解决C语言读取文件最后字符串重复的问题
嘿,这个坑我当初学C的时候也踩过!大概率是你用feof()的方式不对,或者循环判断逻辑出了问题。先给你拆解最常见的问题场景,再给你对应的解决办法。
问题根源:对feof()的误解
很多新手会写出这样的循环代码:
while (!feof(fp)) { fscanf(fp, "%s", buffer); printf("%s\n", buffer); }
但feof()的工作逻辑不是"预判是否到了文件末尾",而是只有当你尝试读取超出文件末尾的内容后,它才会返回真。也就是说:
- 当你读完最后一个字符串时,
feof()还是返回false,循环会再执行一次 - 这时候
fscanf会读取失败,但缓冲区里还存着上一次读取的最后一个字符串 - 你继续打印缓冲区内容,就出现了"最后一个字符串重复输出"的情况
推荐解决方案:用读取函数的返回值做循环条件
这是最简洁也最靠谱的方式,因为fscanf、fgets这类读取函数本身会返回读取状态,直接用它来判断是否继续循环即可。
示例1:用fscanf读取字符串
#include <stdio.h> #include <stdlib.h> int main() { FILE *fp = fopen("your_file.txt", "r"); if (fp == NULL) { perror("Failed to open file"); return EXIT_FAILURE; } char buffer[1024]; // 建议用足够大的缓冲区,避免溢出 // fscanf读取成功一个字符串时返回1,到达末尾或出错时返回EOF while (fscanf(fp, "%s", buffer) == 1) { printf("%s\n", buffer); } fclose(fp); return EXIT_SUCCESS; }
示例2:用fgets读取整行
如果你的文件是按行存储的,用fgets更合适:
#include <stdio.h> #include <stdlib.h> int main() { FILE *fp = fopen("your_file.txt", "r"); if (fp == NULL) { perror("Failed to open file"); return EXIT_FAILURE; } char buffer[1024]; // fgets读取成功返回缓冲区地址,到达末尾或出错返回NULL while (fgets(buffer, sizeof(buffer), fp) != NULL) { printf("%s", buffer); // fgets会保留换行符,不用额外加\n } fclose(fp); return EXIT_SUCCESS; }
备选方案:正确使用feof()
如果你一定要保留feof()的逻辑,那得先执行读取操作,再判断是否读取失败:
#include <stdio.h> #include <stdlib.h> int main() { FILE *fp = fopen("your_file.txt", "r"); if (fp == NULL) { perror("Failed to open file"); return EXIT_FAILURE; } char buffer[1024]; while (1) { int read_result = fscanf(fp, "%s", buffer); if (read_result == EOF) { // 区分是到达文件末尾,还是读取出错 if (feof(fp)) { // 正常结束,不用额外处理 } else { perror("Error reading file"); } break; } printf("%s\n", buffer); } fclose(fp); return EXIT_SUCCESS; }
核心总结:别把feof()当成循环的入口条件,要让读取函数的返回值来决定是否继续循环,这样就能彻底避免最后一个字符串重复的问题啦。
内容的提问来源于stack exchange,提问作者GGS
相关产品推荐
相关产品推荐

