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

C语言读取.txt文件时最后一个字符串重复的问题求解

解决C语言读取文件最后字符串重复的问题

嘿,这个坑我当初学C的时候也踩过!大概率是你用feof()的方式不对,或者循环判断逻辑出了问题。先给你拆解最常见的问题场景,再给你对应的解决办法。

问题根源:对feof()的误解

很多新手会写出这样的循环代码:

while (!feof(fp)) {
    fscanf(fp, "%s", buffer);
    printf("%s\n", buffer);
}

但feof()的工作逻辑不是"预判是否到了文件末尾",而是只有当你尝试读取超出文件末尾的内容后,它才会返回真。也就是说:

  1. 当你读完最后一个字符串时,feof()还是返回false,循环会再执行一次
  2. 这时候fscanf会读取失败,但缓冲区里还存着上一次读取的最后一个字符串
  3. 你继续打印缓冲区内容,就出现了"最后一个字符串重复输出"的情况

推荐解决方案:用读取函数的返回值做循环条件

这是最简洁也最靠谱的方式,因为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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.19 04:02:48