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

如何用C语言读取文件全部文本?一行代码实现及while(!feof(Fpointer))失效问题解决

解决C语言读取文件全部内容的问题

Hey,咱们先拆解下你遇到的问题:先是while(!feof(Fpointer))没读到全部内容的坑,然后是怎么用一行代码搞定整个文件的读取,顺便也帮你看看现有代码里的小问题。

为啥while(!feof(Fpointer))不好使?

*feof()*的逻辑很容易踩坑:它只有在你尝试读取已经越过文件末尾之后才会返回真,不是在到达末尾前就触发。所以用它当循环条件的话,最后一次读取会失败,但你还是会处理那次无效的读取结果,导致要么重复内容,要么出现乱码,这就是你没读到全部文本的原因。

一行代码读取整个文件的方案

要实现一行核心逻辑读取全部内容,思路是先拿到文件大小,分配对应内存,一次性读入:

#include <stdio.h>
#include <stdlib.h>

int main() {
    // 核心一行:打开文件、定位到末尾取大小、分配内存、读取内容
    char *content = (char*)malloc((fseek(fopen("file.txt", "rb"), 0, SEEK_END), ftell(fopen("file.txt", "rb"))) + 1) && fread(content, 1, ftell(fopen("file.txt", "rb")), fopen("file.txt", "rb")) ? content : (perror("读取失败"), NULL);
    
    if(content) {
        content[ftell(fopen("file.txt", "rb"))] = '\0'; // 手动加字符串结束符
        puts(content);
        free(content);
    }
    return 0;
}

不过说实话,这种写法为了凑一行重复打开了三次文件,有点冗余。如果不纠结严格一行,更优雅的写法是复用文件指针,但如果必须要一行核心读取逻辑,上面的写法是可行的。

你的现有代码需要修正的几个点

咱们再看看你写的代码,有几个容易踩的小问题:

  • 重复打开Wano.txt却没调用fclose,会造成文件资源泄漏,每次fopen后一定要对应关闭文件
  • 用float ask;接收用户选择不太合适,用户大概率输入整数,换成int ask;加scanf("%d", &ask);能避免浮点判断的误差
  • fscanf(stdin, "\n %s", add);只能读取不含空格的字符串,要是用户输入的任务有空格,就会被截断,建议换成fgets(add, sizeof(add), stdin);读取整行
  • 你手动调用三次fgets,只能读前三行,没法读取全部内容

如果要修改你的代码来实现读取全部文件内容,可以改成这样:

#include<stdio.h>
#include<stdlib.h>
#include<string.h>

int main() {
    int ask;
    char add[69];
    char *line = NULL;
    size_t len = 0;
    FILE*Fpointer=fopen("Wano.txt", "a+");
    
    // 先判断文件是否打开成功
    if(!Fpointer) {
        perror("打开文件失败");
        return 1;
    }

    printf("\nDo you want to add new task? (输入1表示是,其他表示否) ");
    scanf("%d",&ask);
    getchar(); // 吃掉scanf留下的换行符,避免影响后续fgets

    if(ask == 1) {
        printf("Enter Your Task : ");
        fgets(add, sizeof(add), stdin);
        // 去掉fgets自动读取的换行符(如果存在)
        add[strcspn(add, "\n")] = '\0';
        fprintf(Fpointer, "\n%s", add);
        fflush(Fpointer);

        // 移动文件指针到开头,准备读取全部内容
        fseek(Fpointer, 0, SEEK_SET);
        printf("\n文件全部内容:\n");
        // 正确的循环读取方式:直到getline返回-1表示到达末尾
        while(getline(&line, &len, Fpointer) != -1) {
            printf("%s", line);
        }
    } else {
        printf("\nFailed");
    }

    // 释放资源
    fclose(Fpointer);
    free(line);
    return 0;
}

这个版本修复了资源泄漏问题,能正确读取带空格的任务,还能完整读取文件的所有内容。

内容的提问来源于stack exchange,提问作者sugen 17

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.04.28 16:59:06