如果我执行以下操作:
ifstream file;
file.open("somefile", ios::binary);
unsigned int data;
file >> data;
我的信息流始终设置为failbit
,data
将保持未初始化状态。但是,如果我改为阅读char
或unsigned char
,则可以使用该流。 perror()
告诉我“结果太大”。
我在Google上看到的唯一一件事是建议说operator>>
不应该用于二进制数据(更喜欢read()
),但我发现操作员更清洁,更容易使用 - - 并且它不需要铸造所有东西。
有人可以解释这个问题吗?
答案 0 :(得分:11)
iostream extraction operator (>>)尝试解释由空格分隔的数字字符串,而不是二进制数据。有许多不同的方法来编码二进制形式的无符号整数(例如2's complement representation中的32位little-endian byte order)。这就是为什么你必须使用read / write函数来操作这样的二进制缓冲区。
但是,没有什么能阻止您使用插入和提取运算符来实现您自己的类,以便以任何形式序列化二进制数据。这样的类可能会在内部使用ifstream对象的read函数。或者,boost serialization library可能已经完全符合您的要求。
答案 1 :(得分:-1)
应按照您的描述完成。但是,C ++标准设计师并不是很优雅。事实上,C ++的设计存在很多缺陷,即使C ++ 11和C ++ 14也有很多缺陷。
理想的C ++设计应该是:
1.对于文本文件:
ifstream fin_txt("input.txt");
int i;
float j;
double k;
fin_txt >> i >> j >> k;
这将读入3个字符串并解析为整数,float和double,并分别将它们存储到i,j和k中。
2.对于二进制文件:
ifstream fin_txt("input.bin", ios::binary);
int i;
float j;
double k;
fin_txt >> i >> j >> k;
这将读取4/8字节(取决于int是32位还是64位),4字节和8字节二进制数据,并分别存储到i,j和k中。
不幸的是,当前的设计是报告案例2的错误。也许这可以在C ++ 22中实现。