在Unix服务器上向文件写入额外零字节的流 为什么在Visual C++中运行本地Windows机器时,下面的代码写了四字节,而当我上传到我学校的UNIX服务器时,却写了4个额外的字节? unsigned long temp = 1025; ofstream file("test", ofstream::binary); file.write((char*)&temp, sizeof(temp));
以下是本地使用xxd的结果:在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是无符号长的,因此在不同的系统上会得到不同的输出大小(如果您从小端计算机
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不在这些奇怪的案例中,正如他们的程序行为所证明的那样。这就是为什么我说“要学究化”:-)