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

C语言中无法向文件追加内容的问题求助

问题排查与解决方法

你的代码核心问题是未检查文件打开是否成功,这会导致文件指针为NULL时后续写入操作静默失败,这也是usernames.txt无变化的关键原因。以下是具体修复步骤:

1. 强制添加文件打开错误检查

在每一次调用fopen后立即判断指针是否为NULL,如果是则输出错误信息并终止流程,避免无效操作:

FILE *pF = fopen("usernames.txt", "a+");
if (pF == NULL) {
    perror("Failed to open usernames.txt");
    return 1; // 或根据程序结构做对应错误处理
}

同样,对pUser的fopen也要做相同检查,防止后续操作在无效指针上执行。

2. 排查文件路径与权限问题

如果fopen返回NULL,perror会输出具体错误原因:

  • 若提示权限不足,需确保程序拥有当前目录的读写权限;
  • 若提示文件不存在,"a+"模式会自动创建文件,但如果父目录无写入权限则无法完成创建。

3. 可选:强制刷新缓冲区

虽然fclose会自动刷新缓冲区,但如果需要立即看到文件变化,可在fprintf后调用fflush强制写入磁盘:

fprintf(pF, "\n%s", userName);
fflush(pF);

修复后的完整代码片段

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

int main() {
    char userName[255], password[255];
    // 假设此处已正确获取userName和password的值

    FILE *pF = fopen("usernames.txt", "a+");
    if (pF == NULL) {
        perror("Failed to open usernames.txt");
        return EXIT_FAILURE;
    }
    fprintf(pF, "\n%s", userName);
    fflush(pF);

    char buf[255];
    // 用snprintf替代strcpy+strcat,避免缓冲区溢出
    snprintf(buf, sizeof(buf), "%s.txt", userName);

    FILE *pUser = fopen(buf, "w");
    if (pUser == NULL) {
        perror("Failed to open user file");
        fclose(pF); // 先关闭已打开的文件
        return EXIT_FAILURE;
    }
    fprintf(pUser, "%s\n%s", userName, password);

    printf("\nYour username has successfully been registered into the system!\n");

    fclose(pUser);
    fclose(pF);
    return EXIT_SUCCESS;
}

额外注意事项

  • 避免使用strcpy+strcat组合,改用snprintf更安全,可防止缓冲区溢出;
  • 确保userName和password的输入长度不超过缓冲区大小,避免溢出漏洞。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.05 00:12:14