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

why fstream.read work and not >>?

本文关键字:gt fstream read 工作 为什么      更新时间:2023-10-16

我想知道为什么不能使用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;行将静默失败。实际上,它返回一个可以转换为boolistream&,这样您就可以检查它是否失败,如下所示:

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