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

如何实现文件创建/追加内容并读取显示?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;
}

关键细节唠一唠:

  1. 为啥用 "a+" 模式?
    • 单纯的 "a" 模式只能写不能读,完全满足不了你之后要读取内容的需求;"a+" 刚好兼顾追加写入和读取,完美匹配你的功能要求。
  2. 为啥换掉 gets()?
    • gets() 根本不检查输入长度,要是用户输入的内容超过你定义的content[100],直接就缓冲区溢出,程序崩溃都是轻的,还可能被恶意利用。fgets() 能指定最大读取长度,安全多了。
  3. 为什么要移动文件指针?
    • 你追加内容的时候,文件指针会自动跑到文件最后面,这时候直接读的话,刚一读就碰到EOF(文件结束符),自然啥都显示不出来。用rewind(fptr)把指针拽回开头,就能从头读到尾了。
  4. 错误处理有啥用?
    • 万一你输入的文件名是个不存在的路径,或者没有写权限,fopen会失败返回NULL,这时候perror()会告诉你具体是啥问题,比如“Permission denied”或者“No such file or directory”,调试起来超方便。

这样改完之后,就能完美实现「创建文件/追加内容 → 读取并显示全部内容」的功能啦!

内容的提问来源于stack exchange,提问作者An Mạnh

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.26 10:26:50