如何实现文件创建/追加内容并读取显示?C语言代码问题求助
解决C语言文件追加与读取显示的问题
嘿,我帮你揪出代码里的问题啦,主要这几个点导致你没法正常追加内容和读取显示:
fopen的打开模式没选对,要实现追加+可读得用"a+"模式才行;- 你用的
gets()函数超不安全,很容易触发缓冲区溢出,赶紧换成fgets(); - 追加内容后文件指针停在末尾,直接读取啥都读不到,得把指针移回文件开头;
- 还没加文件打开失败的错误处理,万一权限不够或者路径错了,你连啥原因都不知道。
下面是修正后的完整代码,我给你逐点解释清楚:
#include <stdio.h> #include <stdlib.h> #include <string.h> int main(int argc, char** argv) { char filename[100], content[100]; FILE *fptr; printf("File name: "); // 用scanf读取文件名,限制长度99避免缓冲区溢出 scanf("%99s", filename); // 清除scanf留下的换行符,不然会直接跳过后续的fgets输入 getchar(); printf("Enter content: "); // 用fgets替代不安全的gets,指定最大读取长度,避免溢出 fgets(content, sizeof(content), stdin); // 去掉fgets自动读取到的末尾换行符,不然追加内容会多一个空行 content[strcspn(content, "\n")] = '\0'; // "a+"模式:文件不存在就创建,存在就追加,同时支持读取操作 if ((fptr = fopen(filename, "a+")) == NULL) { perror("Failed to open file"); // 输出具体错误原因 exit(EXIT_FAILURE); } // 把内容追加到文件末尾 fprintf(fptr, "%s\n", content); // 强制刷新缓冲区,确保内容立刻写入文件 fflush(fptr); // 将文件指针移回文件开头,这样才能读取全部内容 rewind(fptr); printf("\n--- File content ---\n"); char ch; // 逐字符读取并显示文件里的所有内容 while ((ch = fgetc(fptr)) != EOF) { putchar(ch); } // 记得关闭文件,养成好习惯 fclose(fptr); return 0; }
关键细节唠一唠:
- 为啥用
"a+"模式?- 单纯的
"a"模式只能写不能读,完全满足不了你之后要读取内容的需求;"a+"刚好兼顾追加写入和读取,完美匹配你的功能要求。
- 单纯的
- 为啥换掉
gets()?gets()根本不检查输入长度,要是用户输入的内容超过你定义的content[100],直接就缓冲区溢出,程序崩溃都是轻的,还可能被恶意利用。fgets()能指定最大读取长度,安全多了。
- 为什么要移动文件指针?
- 你追加内容的时候,文件指针会自动跑到文件最后面,这时候直接读的话,刚一读就碰到
EOF(文件结束符),自然啥都显示不出来。用rewind(fptr)把指针拽回开头,就能从头读到尾了。
- 你追加内容的时候,文件指针会自动跑到文件最后面,这时候直接读的话,刚一读就碰到
- 错误处理有啥用?
- 万一你输入的文件名是个不存在的路径,或者没有写权限,
fopen会失败返回NULL,这时候perror()会告诉你具体是啥问题,比如“Permission denied”或者“No such file or directory”,调试起来超方便。
- 万一你输入的文件名是个不存在的路径,或者没有写权限,
这样改完之后,就能完美实现「创建文件/追加内容 → 读取并显示全部内容」的功能啦!
内容的提问来源于stack exchange,提问作者An Mạnh
相关产品推荐
相关产品推荐

