Visual c++ 使用std::ifstream::read计算字符数

Visual c++ 使用std::ifstream::read计算字符数,visual-c++,gcc,ifstream,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上nda将包含文件的大小 现在我想知道为什么同一个处理器上的代码在不同的S.O.上

显然,这段代码:

std::ifstream filev(path, std::ios::binary|std::ios::in);
unsigned long int nData = 0;
filev.read((char*)&nData, sizeof(nData) );
正如@IgorTandetnik建议的那样,由于文件头的原因,用于计算二进制文件中存在的字节数,特别是在执行结束时的Windows上
nda
将包含文件的大小

现在我想知道为什么同一个处理器上的代码在不同的S.O.上给出不同的结果


有人能给我一个解释,为什么MSVC让这段代码工作吗?

这与文件大小无关(可能你的文件恰好在它的前4个字节中存储了它自己的大小,但对任意文件来说都不是这样,而且在任何情况下都无关紧要)


您的代码展示了实现定义的行为;换句话说,它是不可携带的。特别是,
unsigned long int
是,因此有时读取文件的前4个字节,有时读取前8个字节;自然地,当这些字节被解释为整数的二进制表示时,会产生不同的值

需要特定位大小的整数时使用


这仍然留下了一个事实,即整数的二进制表示本身是实现定义的,即使两个实现使用相同大小的整数。例如,如果您曾经在big-endian平台上运行过此代码(幸运的是,这些代码现在有点罕见),或者没有使用两个补码表示法(这些表示法实际上不存在),您会感到惊讶。

可以使用。。。要计算字节数
不,不是真的。它所做的只是从文件中读取前4或8个字节,并将它们解释为整数的表示形式。您正在使用的特定文件格式可能会将文件大小存储在前几个字节中(或者某个特定文件的前几个字节与文件大小完全一致),但这通常不适用于任意文件。
unsigned long int
是;这就是为什么相同的代码在不同的平台上从相同的文件检索不同的值(换句话说,您的代码是不可移植的)。但是,考虑到您显示的数据,我不知道您如何以
0x3e4fc7a8
的值结束;我怀疑你在这方面错了。无论如何,当你需要一个可移植的特定位大小的整数时使用。谢谢你的帮助,你是对的,我已经根据你的建议编辑了这个问题,如果你从你的评论中做出回答,我会将它标记为解决方案。