我想知道为什么不能使用std::ifstream
的>>
运算符从二进制文件中读取无符号int。
#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变量不会改变。为什么?
显然您正在读取一个二进制文件。read
命令将请求的字节数从文件中复制到您提供的指针所指示的内存中。>>
运算符希望查找要转换为整数的ASCII文本。这两种操作根本不一样。
将二进制数据作为字符读取与将数据作为整数读取之间存在差异。例如,数字5为00000101。字符'5'为00110101。
>>
运算符正在读取个字符,因此当它看到00110101时,它假设这是5的字符。如果您尝试读取int
,那么>>
将正确地将其转换为00000101,并将该值存储在int中。但是,如果字符是例如像a
这样的字母,它与有效的int不对应,则>>
将静默失败(它不会崩溃,但会返回false
)。
例如,在二进制文件中,数字5可能存储为00000101,但>>
认为应该将其读取为字符(即ENQ字符)。这无法转换为int,因此in >> atom_size;
行将静默失败。实际上,它返回一个可以转换为bool
的istream&
,这样您就可以检查它是否失败,如下所示:
if(!(in >> atom_size)) {
cout << "Failed to read into atom_size" << endl;
}