【发布时间】:2023-05-21 14:41:01
【问题描述】:
尝试使用 fprintf() 以二进制模式存储 int,但无论我在 fopen() 中指定哪种模式,它都仅以文本格式写入 int 值。另一方面,当我使用fwrite 代替fprintf 时,它以二进制格式存储int。那么我们可以在二进制模式下使用fprintf吗?
#include <stdio.h>
int main()
{
FILE *fp;
fp = fopen("abc.bin", "wb");
int num = 69;
fprintf(fp, "%d", num);
fclose(fp);
return 0;
}
另外,如果我们谈论其他 I/O 函数,它们中的哪一个将在二进制模式下完美工作?是否有任何关于此类行为的正式记录?
我在mingw下的windows平台上工作。
【问题讨论】:
-
fprintf和%d总是将整数转换为字符序列。这就是它所做的定义。如果您想以原始二进制形式写入数据,请使用fwrite。 -
所以要以原始二进制形式实际存储数据,我们可以使用除
fwrite之外的任何其他函数吗? -
fwrite是用于写入原始二进制数据的stdio函数。请注意,使用"w"与"wb"打开文件之间的差异相当小。它实际上只影响如何在 Windows 系统上处理换行符。在 Unix 系统上没关系。 -
对二进制数据使用
"wb"更安全。它保证您的数据不会被更改。在 Windows 系统上使用"w"的风险在于,如果您编写一个看起来像换行符的字节,则存在在其前面插入回车符的风险。不幸的是,Windows 很早就在如何处理行尾问题上做出了错误的选择,但现在就是这样。 -
公平地说,Windows 并没有发明 cr/lf 行尾序列。大多数 DEC 操作系统都使用它,而 Unix 使用单个换行符。因此,在 Unix 变得像今天这样流行之前,Windows 做了 DEC 所做的事情。对包含二进制数据的文件使用
"wb",对文本文件使用"w",不会有任何问题。
标签: c file-io integer binaryfiles fwrite