为什么未关闭的文件大小为 4 字节

Why unclosed file size is 4 bytes

本文关键字:小为 字节 文件 为什么      更新时间:2023-10-16

为什么此代码创建大小为 4 字节的文件,尽管文件未关闭。

ofstream output("number.bin");
int16_t value = 2570;
output.write(reinterpret_cast<const char*>(&value), sizeof(value));

如果您了解十六进制表示法和 ASCII 编码,则更容易理解。

十进制2570的十六进制表示形式为0x0a0a。字节0x0a是换行符n的 ASCII 值。

由于以文本模式打开文件,系统可能会将单个换行符转换为与平台相关的换行符序列。在文本文件中的 Windows 换行符上是回车/换行符组合rn

因此,当您0x0a0a写入值时,就像您正在编写两个换行符,每个换行符将转换为两个字节,总长度为四个字节 (rnrn(。

要解决您的问题,您应该以二进制模式打开文件,其中写入文件的所有数据将按原样写入,无需任何转换。

ofstream output("number.bin", std::ios::binary);

在旧的 Mac 系统上,OS9 及更早版本,换行符表示为回车r。因此,在这样的系统上,写入的字节数是正确的,但文件中的数据似乎不正确(在文件中会0x0d0d(。

您以文本文件的形式打开了该文件,可能是在Windows上。十六进制中的数字 2570 是 0x0a0a,即两个0x0a字节,对应于两个换行符。在 Windows 中写入文本文件时,每个换行符由两个字节表示rn,因此您写入四个字节而不是两个字节。

以二进制形式打开文件以解决此问题:

ofstream output("number.bin", std::ios::binary);

为什么未关闭的文件大小为 4 字节

此行为特定于实现

根据我对 C++11 标准(参见 n3337(的理解,您无法可靠地预测行为。

这取决于您的操作系统(在 Linux 和 Windows 上可能不同(、您的文件系统(在 ext4、VFAT 和 ZFS 上可能不同(、您的标准C++库实现(在 Clang 标准库和 GCC 上可能不同(等。

因此涉及几层代码。每个都在添加实现详细信息。 最后,IO通常是缓冲的。您可能希望使用std::flush