使用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 int
是 32 bit large on Windows and 64 bit on Linux,所以有时您读取文件的前 4 个字节,而其他时候读取前 8 个字节;当然,当这些字节被解释为整数的二进制表示时,这会导致不同的值。
当您需要特定位大小的整数时使用 unit32_t
et al。
这仍然留下一个事实,即整数的二进制表示本身是实现定义的,即使两个实现使用相同大小的整数也是如此。例如,如果你曾经 运行 大端平台上的这段代码(幸运的是,这些天这些天很少见),或者不使用二进制补码表示的平台(那些是几乎不存在)。
显然是这段代码:
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 int
是 32 bit large on Windows and 64 bit on Linux,所以有时您读取文件的前 4 个字节,而其他时候读取前 8 个字节;当然,当这些字节被解释为整数的二进制表示时,这会导致不同的值。
当您需要特定位大小的整数时使用 unit32_t
et al。
这仍然留下一个事实,即整数的二进制表示本身是实现定义的,即使两个实现使用相同大小的整数也是如此。例如,如果你曾经 运行 大端平台上的这段代码(幸运的是,这些天这些天很少见),或者不使用二进制补码表示的平台(那些是几乎不存在)。