用 fopen 写 CSV 应使用 "w" 模式,手动处理引号与转义(如内部双引号变两个、含逗号/换行符时加双引号),换行统一用 "\n",写完需检查 fflush 和 fclose 返回值。

用 fopen 打开 CSV 文件时,必须用 "w" 或 "wb" 模式
CSV 是纯文本格式,"w" 就够用;用 "wb" 反而可能在 Windows 下导致换行符异常(\r\n 被二次转换)。如果文件已存在,"w" 会清空重写——这是预期行为,不是 bug。
常见错误是误用 "a" 模式追加但忘了写表头,或用 "r+" 却没处理文件不存在的 case。实际写 CSV 几乎不需要读写混合模式。
-
fopen("data.csv", "w")—— 安全、标准、跨平台 - 路径含中文或空格?确保运行环境支持当前 locale,否则优先用 ASCII 路径名
- 打开失败必须检查返回值:
if (fp == NULL) { perror("fopen"); return -1; }
写入字段时,fprintf 要手动处理引号和逗号转义
CSV 规范要求:字段含逗号、换行符或双引号时,必须用双引号包裹,且内部双引号要变成两个双引号(" → "")。fprintf 不自动做这事,得自己判断。
别直接 fprintf(fp, "%s,%s,%d\n", a, b, c)——只要 a 或 b 含逗号,Excel 就会错列。
立即学习“C语言免费学习笔记(深入)”;
- 简单场景(确定无特殊字符):用
fprintf(fp, "\"%s\",%d,\"%s\"\n", name, age, city) - 通用写法:写个辅助函数,对每个字符串调用
csv_escape()再拼接 - 数值类型(
int,double)不用引号,但若想统一格式(如保留小数位),仍需控制输出,比如%.2f
换行符用 \n 就够了,别写 \r\n
Windows 记事本能正确识别 \n 为换行(从 Win10 开始),Excel、LibreOffice、Python pandas.read_csv 全部兼容。硬写 \r\n 反而在 Linux/macOS 下导致空行。
唯一例外是:你明确知道目标程序(某个老旧工业软件)只认 \r\n,才需要条件编译或运行时检测平台。
- 统一用
\n—— 简单、安全、符合 POSIX 文本文件定义 -
fprintf(fp, "%s\n", row)中的\n是文本内容,不是二进制字节,无需担心 - 用
"w"模式时,C 标准库在 Windows 下会自动把\n映射为\r\n(文本模式行为),你不用管
关闭文件前记得 fflush 和 fclose,尤其写入量大时
不 fclose 会导致缓冲区残留数据没写入磁盘,文件看似生成但内容不全;不 fflush 在某些嵌入式或低内存环境可能让 fclose 失败后无法捕获错误。
典型错误是只写 fclose(fp) 却忽略返回值,而磁盘满、权限不足等都会让 fclose 返回 EOF。
- 推荐写法:
if (fflush(fp) != 0 || fclose(fp) != 0) { perror("write/csv close"); } - 写入循环中不要每行都
fflush,会严重拖慢速度;批量写完再刷一次即可 - 如果程序中途 crash,未关闭的文件句柄不会自动释放,但现代 OS 会在进程退出时回收——只是数据丢了
\n)的处理:它合法但必须被双引号包裹,否则会破坏行结构。很多 C 实现只防逗号,漏掉这个,结果 Excel 打开一半就错位。

















