为什么未关闭的文件大小为 4 字节
Why unclosed file size is 4 bytes
为什么此代码创建大小为 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
- 将Integer转换为4字节的unsined字符矢量(按大端字节顺序)
- 如何在C++(Arduino)中将浮点数组转换为字节数组
- C++如何将字符数组转换为字节向量(向量<byte>)
- Valgrind 大小为 8 且地址 0x5b7e520 的读取无效,在大小为 16 的块内为 0 字节 free'd
- 如何将 CString 转换为字节 [] 数组?
- 使用 ESP8266/8285 将字符串从 Web 服务器转换为字节数组
- 为什么未关闭的文件大小为 4 字节
- 编译时将字符*转换为字节
- 将uint64_t转换为字节时从不同大小的整数强制转换为指针
- 将 char[] 数组转换为字节,然后将字节转换为 int,反之亦然
- 在 c++ 中将字符串转换为字节
- C++/CX 如何从 IRandomAccessStream^ 转换为字节并返回.(UWP)
- 如何在C++中将十六进制字符串转换为字节字符串?
- C/C++ - 将浮点数转换为字节数组,以便字节保持排序
- BitBlt转换为字节数组并从c ++解析为c#
- 将整数向量转换为字节数组向量,然后调用每个字节数组
- 如何在C++中将整数转换为字节,以便 Unity 在通过 UDP 传输后能够理解它们
- 如何将字符串转换为字节数组
- 如何将任何值转换为字节数组并将其附加到字节列表
- 将uint64_t转换为8字节的小端长