使用std::ifstream::read来统计字符的个数

Use std::ifstream::read to count the number of character

显然是这段代码:

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

这与文件大小没有任何关系(有可能您的文件碰巧在其前 4 个字节中存储了自己的大小,但对于任意文件而言并非如此,并且在任何情况下都无关紧要).

您的代码展示了实现定义的行为;换句话说,它是不可携带的。特别是,unsigned long int32 bit large on Windows and 64 bit on Linux,所以有时您读取文件的前 4 个字节,而其他时候读取前 8 个字节;当然,当这些字节被解释为整数的二进制表示时,这会导致不同的值。

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

这仍然留下一个事实,即整数的二进制表示本身是实现定义的,即使两个实现使用相同大小的整数也是如此。例如,如果你曾经 运行 大端平台上的这段代码(幸运的是,这些天这些天很少见),或者不使用二进制补码表示的平台(那些是几乎不存在)。