【发布时间】:2016-02-06 16:34:49
【问题描述】:
显然是这段代码:
std::ifstream filev(path, std::ios::binary|std::ios::in);
unsigned long int nData = 0;
filev.read((char*)&nData, sizeof(nData) );
正如@IgorTandetnik 建议的那样,由于文件头,特别是在Windows 上,执行结束时nData 将包含文件的大小。
现在我想知道为什么同一处理器上的这段代码在不同的 S.O 上给出不同的结果。
谁能给我解释一下为什么 MSVC 让这段代码工作?
【问题讨论】:
-
can be used ... to count the number of bytes不,不是。它所做的只是从文件中读取前 4 或 8 个字节,并将它们解释为整数的表示。您正在使用的特定文件格式可能恰好将文件大小存储在前几个字节中(或者某个特定文件的前几个字节恰好与其文件大小匹配纯属巧合),但对于任意文件通常并非如此. -
unsigned long int是32 bit large on Windows and 64 bit on Linux;这就是为什么相同的代码在不同平台上从相同文件中检索不同值的原因(换句话说,您的代码不可移植)。不过,鉴于您显示的数据,我看不出您如何最终获得0x3e4fc7a8的值;我怀疑你在这方面是错误的。无论如何,当您需要以可移植方式具有特定位大小的整数时,请使用uint32_tet al。 -
感谢您的帮助,您是对的,我已经根据您的建议编辑了问题,如果您从您的 cmets 中做出回答,我会将其标记为解决方案。
标签: visual-c++ gcc ifstream