3

我想知道为什么我不能使用>>an 的运算符std::ifstream从二进制文件中读取 unsigned 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 变量不会改变。为什么 ?

4

2 回答 2

8

显然你正在读取一个二进制文件。该read命令从字面上将请求的字节数从文件复制到您提供的指针指示的内存中。>>操作员希望找到要转换为整数的 ASCII 文本。这两个操作根本不一样。

于 2013-07-29T20:55:58.153 回答
3

将二进制数据作为字符读取与将数据作为整数读取是有区别的。例如,数字5 是 00000101。字符“5”是 00110101。

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

例如,在您的二进制文件中,数字 5 可能存储为 00000101,但>>认为它应该将其读取为字符(即 ENQ 字符)。这不能转换为 int,因此该行将in >> atom_size;静默失败。实际上,它返回 aistream&可以转换为 a bool,因此您可以检查它是否失败,如下所示:

if(!(in >> atom_size)) {
  cout << "Failed to read into atom_size" << endl;
}
于 2013-07-29T21:11:01.737 回答