如何用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
相关产品推荐
相关产品推荐

