C语言向CSV文件写入内容重复执行仅保留单条记录问题排查
问题背景
实现了支持用户输入、自定义加解密逻辑的C语言程序,核心加解密功能运行正常,但在写入CSV存储文件时出现异常:
- 首次运行程序可正常写入内容,第二次运行结束后,本应存在两行记录的CSV文件仅保留1行最新内容
- 两次运行的终端均提示写入成功,无运行时报错
核心问题代码片段:
main() { char pwd[100]; printf("Enter Password To Be Encrypted: "); scanf("%[^\n]s", pwd); printf("The encrypted password is: "); encrypt(&pwd); printf("\n The decrypted password is: "); decrypt(&pwd); FILE *fp; fp = fopen("storeroom.csv", "w"); fprintf(fp, "placeholder , placeholder\n"); printf("\n Details successfully written to the file\n\n"); fclose(fp); }
故障原因
异常由fopen文件打开模式使用错误直接导致:
- 代码中使用
"w"模式打开目标CSV文件,该模式为覆盖写入模式:若目标文件已存在,会直接清空文件内所有原有内容,再从文件起始位置写入新数据。因此每次程序运行执行写入操作时,上一次运行存入的内容都会被提前清空,最终文件只会保留最后一次运行写入的1行记录,和观察到的现象完全一致。
修复方案
将fopen的打开模式参数从"w"替换为"a"(追加写入模式)即可解决问题。"a"模式的特性是:打开已存在的目标文件时,不会清空原有内容,文件指针默认定位到现有内容的最末尾,新写入的内容会直接追加在原有内容之后,可实现多次运行累积写入多行记录的需求。
修改后的核心文件操作代码如下:
FILE *fp; // 替换为追加写入模式 fp = fopen("storeroom.csv", "a"); // 建议补充文件打开校验,避免空指针触发程序崩溃 if (fp == NULL) { perror("Open storeroom.csv failed"); return 1; } fprintf(fp, "placeholder , placeholder\n"); printf("\n Details successfully written to the file\n\n"); fclose(fp);
实用提示:如果CSV需要固定表头,可以在打开文件时增加判断,仅当文件不存在(首次创建)时写入表头,后续追加内容时跳过表头写入,避免文件中出现重复表头行打乱格式。
内容的提问来源于stack exchange,提问作者user18025483
相关产品推荐
相关产品推荐

