我想知道为什么我不能使用>>
的{{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变量不会改变。为什么?
答案 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;
}