在Unix服务器上向文件写入额外零字节的流 为什么在Visual C++中运行本地Windows机器时,下面的代码写了四字节,而当我上传到我学校的UNIX服务器时,却写了4个额外的字节? unsigned long temp = 1025; ofstream file("test", ofstream::binary); file.write((char*)&temp, sizeof(temp));

在Unix服务器上向文件写入额外零字节的流 为什么在Visual C++中运行本地Windows机器时,下面的代码写了四字节,而当我上传到我学校的UNIX服务器时,却写了4个额外的字节? unsigned long temp = 1025; ofstream file("test", ofstream::binary); file.write((char*)&temp, sizeof(temp));,c++,file-io,xxd,C++,File Io,Xxd,以下是本地使用xxd的结果:0104 0000 以下是Unix服务器上的结果:0104 0000 我打开文件的模式是否有问题?long具有实现定义的大小。您的Windows系统使用32位(4字节)的long(即使64位Windows也使用32位long;否则在64位操作系统上很少见),而我所知道的大多数(如果不是全部)64位类UNIX系统都有64位(8字节)的long。由于您正在写入sizeof(temp)字节,并且temp是无符号长的,因此在不同的系统上会得到不同的输出大小(如果您从小端计算机

以下是本地使用xxd的结果:
0104 0000

以下是Unix服务器上的结果:
0104 0000


我打开文件的模式是否有问题?

long
具有实现定义的大小。您的Windows系统使用32位(4字节)的
long
(即使64位Windows也使用32位
long
;否则在64位操作系统上很少见),而我所知道的大多数(如果不是全部)64位类UNIX系统都有64位(8字节)的
long
。由于您正在写入
sizeof(temp)
字节,并且
temp
无符号长的
,因此在不同的系统上会得到不同的输出大小(如果您从小端计算机移动到大端计算机,也可能会遇到字节顺序问题)


如果需要一致的大小,则使用“代码> >代码>的固定宽度类型,例如<代码> UTI32×TT < /COD>或<代码> UTIN 64×T/<代码> .< /P>是迂腐的,C++中任何数据类型的大小是C++编译器的特性,而不是操作系统的特征。没有什么能阻止编译器在Windows上提供64位长。值得注意的是,C++标准只对基本整数类型的最小大小有严格的规范。该标准还保证类型的大小不会大于上一个整数类型。这意味着

char
short
int
long
long
完全有可能(尽管不太可能)具有相同的大小,并且至少是64位的。要了解更多信息,您需要将它们(大多数32位系统所共有的)与进行比较。@NeilButterworth:除了最终,如果您使用任何基于
long
s的Windows API,那么如果您的编译器使用64位
long
s,而WinAPI调用仍然需要32位
long
s(除非编译器在执行修复时遇到额外的麻烦,否则在运行时适配器层中包装WinAPI调用,你有什么)。是的,这是可能的,但很明显,OP不在这些奇怪的案例中,正如他们的程序行为所证明的那样。这就是为什么我说“要学究化”:-)