C 语言写入文件
更新时间:2026-08-26。本文是
languages/c/主题入门层第 62 篇。读文件是"输入",写文件是"输出"——日志、配置、结果数据,都要靠写操作落到磁盘。fputc写一个字符、fputs写一个字符串、fprintf格式化输出,三兄弟各司其职。别忘了:写操作的结果,要检查;写完,要关。
本文要回答的问题
- 三个写函数各适合什么场景?
- 写失败怎么知道?
- 为什么有时候关了文件数据才出现?
一、fputc:写一个字符
c
#include <stdio.h>
FILE *fp = fopen("out.txt", "w");
if (fp == NULL) return 1;
fputc('H', fp);
fputc('i', fp);
fclose(fp);返回值:成功返回写的字符,失败返回 EOF。
二、fputs:写一个字符串
c
fputs("hello, world\n", fp); // 写整个字符串注意 fputs 不会自动加换行——puts 会加,fputs 不会,跟 fgets 读入带换行是配套的对称设计。
三、fprintf:格式化输出到文件
c
int id = 1001;
char name[] = "alice";
double score = 95.5;
fprintf(fp, "id=%d, name=%s, score=%.1f\n", id, name, score);fprintf 与 printf 的格式串完全一致,只是第一个参数是 FILE*。这是最常用的写函数:日志、配置、报表,都是格式化输出。
四、检查写入结果
写文件会失败吗?会——磁盘满、权限不足、文件被删。不检查就发现不了:
c
if (fputs("hello\n", fp) == EOF) {
perror("write failed");
/* 处理错误 */
}| 函数 | 成功 | 失败 |
|---|---|---|
fputc | 返回字符 | EOF |
fputs | 非负值 | EOF |
fprintf | 写出的字符数 | 负数 |
写日志/写数据前先想一句:如果这块没写进去,程序能不能发现? 不能就补上检查。
五、覆盖 vs 追加
模式决定了写的行为:
c
fopen("log.txt", "w"); // 覆盖:每次运行从零开始
fopen("log.txt", "a"); // 追加:接着上次继续写(日志标准做法)日志、审计这类跨运行累积的数据用 "a";导出、快照用 "w"。误用 "w" 清空历史日志是运维事故高发区(fopen 模式表里强调过)。
六、缓冲:fclose 时数据才落盘
stdio 默认全缓冲:写入的数据先进内存缓冲区,攒够或 fclose/fflush 时才真正写磁盘:
c
fprintf(fp, "partial\n");
// 此时磁盘上可能还没有!
fflush(fp); // 立即落盘调试时"写了但文件里没有"——别慌,先 fclose 或 fflush。崩溃时缓冲区数据会丢,重要数据考虑及时 fflush。机制详见stdio 缓冲原理。
七、常见坑对照
| 坑 | 现象 | 对策 |
|---|---|---|
| 忘检查写入 | 磁盘满静默丢数据 | 关键写入检查 EOF |
"w" 误用 | 历史数据被清 | 累积数据用 "a" |
| 忘 fclose | 缓冲数据丢失 | 用完即关 |
| fputs 以为带换行 | 输出粘连 | 显式加 \n |
| 崩溃丢数据 | 缓冲没落盘 | 关键点 fflush |
八、与本站主线衔接
- 模式选择与打开关闭,见fopen 与 fclose;
- 从文件读数据,见字符与行读取;
- 格式化细节(宽度、精度),见printf 格式串详解。
一句话总结
fputc 写字符、fputs 写字符串(不带换行)、fprintf 格式化输出——写操作返回 EOF 表示失败要检查,"w" 覆盖、"a" 追加,fclose/fflush 时才真正落盘——写文件三件事:选对模式、检查结果、记得关闭。