使用std :: ifstream :: read来计算字符数

时间:2016-02-06 16:34:50

标签: visual-c++ gcc ifstream

显然这段代码:

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使这段代码有效吗?

1 个答案:

答案 0 :(得分:1)

这与文件大小没有任何关系(你的文件可能会在前4个字节中存储自己的大小,但是对于任意文件都不是这样,并且任何情况都在这一点上。)

您的代码展示了实现定义的行为;换句话说,它是非便携式的。特别是,$spec = array( 'name' => $this->getName(), 'required' => true, ); 32 bit large on Windows and 64 bit on Linux,所以你有时读取文件的前4个字节,其他时间读取前8个字节;当然,当这些字节被解释为整数的二进制表示时,这会产生不同的值。

当需要特定位大小的整数时,请使用unit32_t et al

这仍然留下这样的事实:即使两个实现使用相同大小的整数,整数的二进制表示本身也是实现定义的。例如,如果您在big-endian平台上运行此代码(幸运的是,这些日子有些罕见),或者没有使用双补码表示的代码,您会感到惊讶(那些几乎不存在。)