为什么fstream.read工作而不是>>?

时间:2013-07-29 20:53:55

标签: c++ fstream

我想知道为什么我不能使用>>的{​​{1}}运算符从二进制文件中读取unsigned int。

std::ifstream

当我使用#include <fstream> int main(int argc, char* argv[]) { std::ifstream in(argv[1]); if(in.fail()) return -1; unsigned int atom_size = 0; in.read(reinterpret_cast<char*>(&atom_size), 4); in >> atom_size; return 0; } 时,我得到了我想要的值,但是当我使用in.read运算符时,我的atom_size变量不会改变。为什么?

2 个答案:

答案 0 :(得分:8)

显然你正在阅读二进制文件。 read命令将文件中请求的数字字节复制到您提供的指针所指示的内存中。 >>运算符期望找到要转换为整数的ASCII文本。这两个操作简直不一样。

答案 1 :(得分:3)

将二进制数据作为字符读取与将数据读取为整数之间存在差异。例如,数字 5为00000101。字符'5'为00110101。

>>运算符正在读取字符,因此当它看到00110101时,它会认为这是5的字符。如果您尝试读入int,那么>>会正确地将其转换为00000101并将该值存储在int中。但如果角色是例如像a这样的字母与有效的int不对应,>>将无声地失败(它不会崩溃,但会返回false)。

在您的二进制文件中,例如,数字5可能存储为00000101,但>>认为它应该将其读作字符(这是ENQ字符)。这不能转换为int,因此行in >> atom_size;将无声地失败。实际上,它会返回一个istream&,可以将其转换为bool,这样您就可以检查它是否会失败:

if(!(in >> atom_size)) {
  cout << "Failed to read into atom_size" << endl;
}