为什么我不能用operator>>读取fstream的二进制数据?

2024-08-14C/C++开发问题
5

本文介绍了为什么我不能用operator>>读取fstream的二进制数据?的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着跟版网的小编来一起学习吧!

问题描述

如果我执行以下操作:

ifstream file;
file.open("somefile", ios::binary);

unsigned int data;

file >> data;

我的流将始终设置 failbitdata 将保持未初始化状态.但是,如果我改为读取 charunsigned char ,则流很好.perror() 告诉我结果太大".

My stream will always set the failbit and the data will remain uninitialized. However, if I read a char or unsigned char instead, the stream is fine. perror() is telling me "result too large".

我在 Google 上看到的唯一建议是 operator>> 不应该用于二进制数据(首选 read()),但我发现操作符更简洁、更易于使用——而且不需要强制转换所有内容.

The only thing I saw on Google was a suggestion saying that operator>> shouldn't be used for binary data (prefer read()), but I find the operator to be cleaner and easier to use -- and it doesn't require casting everything.

有人能解释一下这个问题吗?

Can someone explain this issue?

推荐答案

iostream 提取运算符 (>>) 尝试解释由空格分隔的数字字符串,而不是二进制数据.有许多不同的方法可以对二进制形式的无符号整数进行编码(例如,32 位 2 的补码表示 在 little-endian 字节顺序).这就是为什么您必须使用 read/write 函数对此类二进制缓冲区进行操作.

The iostream extraction operator (>>) attempts to interpret numerical strings separated by whitespace, not binary data. There are many different ways to encode an unsigned integer in binary form (e.g. a 32-bit 2's complement representation in little-endian byte order). That's why you must use the read/write functions to operate on such binary buffers.

然而,没有什么可以阻止您使用插入和提取运算符实现自己的类,以您希望的任何形式序列化二进制数据.这样的类可能会在内部使用 ifstream 对象的读取函数.或者,boost 序列化库 可能已经包含正是你想要的.

However, nothing prevents you from implementing your own class for serializing binary data in whatever form you wish using the insertion and extraction operators. Such a class would likely use the read function of an ifstream object internally. Alternatively, the boost serialization library may already hold exactly what you want.

这篇关于为什么我不能用operator>>读取fstream的二进制数据?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持跟版网!

The End

相关推荐

无法访问 C++ std::set 中对象的非常量成员函数
Unable to access non-const member functions of objects in C++ std::set(无法访问 C++ std::set 中对象的非常量成员函数)...
2024-08-14 C/C++开发问题
17

从 lambda 构造 std::function 参数
Constructing std::function argument from lambda(从 lambda 构造 std::function 参数)...
2024-08-14 C/C++开发问题
25

STL BigInt 类实现
STL BigInt class implementation(STL BigInt 类实现)...
2024-08-14 C/C++开发问题
3

使用 std::atomic 和 std::condition_variable 同步不可靠
Sync is unreliable using std::atomic and std::condition_variable(使用 std::atomic 和 std::condition_variable 同步不可靠)...
2024-08-14 C/C++开发问题
17

在 STL 中将列表元素移动到末尾
Move list element to the end in STL(在 STL 中将列表元素移动到末尾)...
2024-08-14 C/C++开发问题
9

为什么禁止对存储在 STL 容器中的类重载 operator&()?
Why is overloading operatoramp;() prohibited for classes stored in STL containers?(为什么禁止对存储在 STL 容器中的类重载 operatoramp;()?)...
2024-08-14 C/C++开发问题
6