在C语言中,fwrite
和fprintf
都是用于文件操作的函数,但它们的用途和实现方式有显著区别:
1. 数据格式
-
fwrite
直接以二进制形式将数据写入文件,不进行任何格式转换。fwrite(buffer, sizeof(data_type), count, file_pointer);
- 示例:写入一个整数数组到文件,文件内容为二进制字节流(不可直接阅读)。
-
fprintf
以格式化文本形式写入数据,将数据转换为人类可读的字符(如ASCII)。fprintf(file_pointer, "格式化字符串", 参数列表);
- 示例:
fprintf(fp, "Value: %d\n", 42);
写入文本"Value: 42\n"
。
- 示例:
2. 主要用途
-
fwrite
适用于保存原始内存数据(如结构体、数组、二进制数据),适合需要高效读写或跨平台持久化数据的场景。- 优点:速度快,文件体积小。
- 缺点:文件内容不可直接阅读,需程序解析。
-
fprintf
适用于生成可读的文本文件(如日志、配置文件)。- 优点:内容可直接查看和编辑。
- 缺点:转换格式耗时,文件体积较大。
3. 数据恢复
-
fwrite
写入的数据
读取时需用fread
,且必须明确知道原始数据的类型和结构。
示例:写入结构体后,需用相同的结构体类型读取。 -
fprintf
写入的数据
读取时可使用fscanf
或文本解析工具(如逐行读取),但需处理格式一致性。
示例:若写入"%d %f"
,读取时需按相同格式解析。
4. 效率对比
-
fwrite
更快
省去了数据到文本的转换过程,适合大规模数据(如保存图像、音频等二进制文件)。 -
fprintf
较慢
需解析格式字符串并转换数据类型(如将整数42
转换为字符'4'
和'2'
)。
5. 示例对比
用 fwrite
写入整数:
int data = 42;
fwrite(&data, sizeof(int), 1, fp);
// 文件内容:二进制形式的 0x2A(假设小端序)。
用 fprintf
写入整数:
fprintf(fp, "%d", 42);
// 文件内容:字符 '4' 和 '2'(ASCII码 0x34 和 0x32)。
6. 关键区别总结
特性 | fwrite | fprintf |
---|---|---|
数据格式 | 二进制 | 格式化文本 |
用途 | 保存原始内存数据 | 生成可读文本 |
可读性 | 不可直接阅读 | 可直接阅读/编辑 |
效率 | 高(无格式转换) | 低(需转换数据) |
灵活性 | 需严格匹配数据类型和结构 | 支持多种格式的灵活输出 |
何时选择?
- 使用
fwrite
:
需要高效存储/读取程序内部数据(如游戏存档、序列化对象)。 - 使用
fprintf
:
需要生成配置文件、日志文件或其他人类可读的文件。