ofstream 将额外的零字节写入 Unix 服务器上的文件
ofstream writing extra zero bytes to file on Unix server
为什么下面的代码在我本地 Windows 机器上使用 Visual C++ 运行 写入四个字节,而当我上传到我学校的 Unix 服务器时写入额外的 4 个 0 字节?
unsigned long temp = 1025;
ofstream file("test", ofstream::binary);
file.write((char*)&temp, sizeof(temp));
这是在本地使用 xxd 的结果:0104 0000
这是 Unix 服务器上的结果:0104 0000 0000 0000
我打开文件的模式有问题吗?
long
具有实现定义的大小。您的 Windows 系统使用 32 位(4 字节)long
(甚至 64 位 Windows 使用 32 位 long
;否则在 64 位操作系统上很少见),而我知道的大多数(如果不是全部)64 位类 UNIX 系统都有 64 位(8 字节)long
s。由于您正在写出 sizeof(temp)
个字节,而 temp
是 unsigned long
,您将在不同的系统上获得不同的输出大小(如果您从小端移动,您也可能会遇到字节顺序问题到大端机器)。
如果您需要一致的尺寸,请使用 <cstdint>
中的固定宽度类型,例如uint32_t
或 uint64_t
.
为什么下面的代码在我本地 Windows 机器上使用 Visual C++ 运行 写入四个字节,而当我上传到我学校的 Unix 服务器时写入额外的 4 个 0 字节?
unsigned long temp = 1025;
ofstream file("test", ofstream::binary);
file.write((char*)&temp, sizeof(temp));
这是在本地使用 xxd 的结果:0104 0000
这是 Unix 服务器上的结果:0104 0000 0000 0000
我打开文件的模式有问题吗?
long
具有实现定义的大小。您的 Windows 系统使用 32 位(4 字节)long
(甚至 64 位 Windows 使用 32 位 long
;否则在 64 位操作系统上很少见),而我知道的大多数(如果不是全部)64 位类 UNIX 系统都有 64 位(8 字节)long
s。由于您正在写出 sizeof(temp)
个字节,而 temp
是 unsigned long
,您将在不同的系统上获得不同的输出大小(如果您从小端移动,您也可能会遇到字节顺序问题到大端机器)。
如果您需要一致的尺寸,请使用 <cstdint>
中的固定宽度类型,例如uint32_t
或 uint64_t
.