使用C语言写入CSV文件时出现额外空行问题求助
解决C语言写入CSV时追加出现额外空行的问题
我来帮你搞定这个头疼的问题——你遇到的其实是C语言文件追加模式的一个常见坑,再加上文本编辑器(比如Vim)保存时会自动在文件末尾加换行的习惯,两者叠加就出现了多余空行。
问题根源
你用"a"模式打开文件做追加操作,但C标准有个硬性规定:以追加模式打开文件时,任何写操作都会强制把文件指针移到文件末尾。所以你之前尝试的fseek(f, -1, SEEK_END)完全没用,执行fprintf的瞬间,指针又被拉回了文件末尾。
当你在Vim里把光标停在最后一行的新行位置并保存时,文件末尾会多一个换行符\n(Windows环境下是\r\n)。这时候你的fprintf又输出了一个\n,两个换行符连在一起,自然就出现了空行。
解决方案:手动控制追加逻辑
我们需要放弃自动追加模式,改用"r+"模式打开文件,手动检查文件末尾的字符,决定是否需要添加换行。修改你的WriteEmployeeData函数如下:
#include <stdio.h> #include <string.h> #include <stdlib.h> #include "Project.h" void WriteEmployeeData(employee empF){ FILE *f; // 先尝试以读写模式打开文件(保留原有内容) f = fopen("employee.csv", "r+"); if (!f) { // 文件不存在,创建新文件 f = fopen("employee.csv", "w"); if (!f) { perror("Failed to open file"); return; } // 新文件直接写入数据,无需处理换行 fprintf(f,"%d,%s,%ld,%s,%d\n",empF.employee_id,empF.employee_name,empF.phno,empF.shift,empF.area_code); fclose(f); return; } // 文件存在,定位到末尾前一个字符,检查最后一个字符 if (fseek(f, -1, SEEK_END) == 0) { char last_char; // 读取最后一个字符 if (fread(&last_char, 1, 1, f) == 1) { // 如果最后一个字符不是换行/回车,先补一个换行 if (last_char != '\n' && last_char != '\r') { fprintf(f,"\n"); } } // 如果读取失败(比如文件是空的),直接写入即可 } // 写入员工数据 fprintf(f,"%d,%s,%ld,%s,%d\n",empF.employee_id,empF.employee_name,empF.phno,empF.shift,empF.area_code); fclose(f); }
代码逻辑说明
- 文件打开逻辑:先尝试用
"r+"模式打开(允许读写且不清空原有内容),失败则用"w"模式创建新文件。 - 末尾字符检查:定位到文件倒数第一个字符,读取后判断是否是换行符(兼容Windows的
\r):- 如果不是换行/回车,先写入一个换行,保证新数据和旧内容格式一致;
- 如果已经是换行符,直接写入数据,避免重复换行产生空行。
- 写入数据:最后正常输出员工信息,确保每一行结尾都有换行。
额外注意点
你提供的文件内容里有^M,这是Windows的回车符\r,说明文件是Windows格式的。上面的代码已经考虑了这种情况,所以不管是在Linux/macOS还是Windows下运行,都能正确处理换行问题。
内容的提问来源于stack exchange,提问作者RasenRhino
相关产品推荐
相关产品推荐

