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

标签 c++ binary stream fstream

如果我执行以下操作:

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

unsigned int data;

file >> data;

我的流将始终设置 failbit 并且 data 将保持未初始化状态。但是,如果我改为读取 charunsigned char ,则流很好。 perror() 告诉我“结果太大”。

我在 Google 上看到的唯一内容是一个建议说 operator>> 不应该用于二进制数据(更喜欢 read()),但我发现操作符更干净,更易于使用——并且不需要强制转换所有内容。

谁能解释一下这个问题?

最佳答案

iostream extraction operator (>>)尝试解释由空格分隔的数字字符串,而不是二进制数据。有许多不同的方法可以对二进制形式的无符号整数进行编码(例如,2's complement representation 中的 32 位 little-endian byte order )。这就是为什么你必须使用 read/write对此类二进制缓冲区进行操作的函数。

但是,没有什么能阻止您实现自己的类,以便使用插入和提取运算符以您希望的任何形式序列化二进制数据。这样的类可能会在内部使用 ifstream 对象的读取函数。或者,boost serialization library可能已经完全符合您的要求。

关于c++ - 为什么我不能用 operator>> 读取 fstream 的二进制数据?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4151840/

相关文章:

python - 如何从 Windows 上的 Gstreamer 子进程读取二进制数据?

javascript - 在 JavaScript 中存储非常大的二进制数的最佳方法是什么?

java - 从另一个进程的输出流读取

iphone - iOS将音频从一台iOS设备传输到另一台iOS设备

javascript - 使用 fetch 或 new Request() 创建的请求具有未定义的主体

c++ - 如何知道我们是在控制台还是窗口应用程序中?

c++ - 如何将列添加到多维 vector (C++)?

c++ - 截断或调整文件大小以修改其结尾

c++ - 在 visual studio 2015 community c++ 中,如何修复警告 C4838 : conversion from 'unsigned int' to 'int' requires a narrowing conversion

c++ - 制作 AES3 (AES-2003) 的 CRC 表