Why can#39;t I read fstream#39;s binary data with operatorgt;gt;?(为什么我不能用operator读取fstream的二进制数据?)
问题描述
如果我执行以下操作:
ifstream file;
file.open("somefile", ios::binary);
unsigned int data;
file >> data;
我的流将始终设置 failbit
而 data
将保持未初始化状态.但是,如果我改为读取 char
或 unsigned 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的二进制数据?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持编程学习网!
本文标题为:为什么我不能用operator>>读取fstream的二进制数据?
基础教程推荐
- 从 std::cin 读取密码 2021-01-01
- 如何“在 Finder 中显示"或“在资源管理器中显 2021-01-01
- 为 C/C++ 中的项目的 makefile 生成依赖项 2022-01-01
- 为什么语句不能出现在命名空间范围内? 2021-01-01
- Windows Media Foundation 录制音频 2021-01-01
- 管理共享内存应该分配多少内存?(助推) 2022-12-07
- 使用从字符串中提取的参数调用函数 2022-01-01
- 如何使图像调整大小以在 Qt 中缩放? 2021-01-01
- 在 C++ 中循环遍历所有 Lua 全局变量 2021-01-01
- 如何在不破坏 vtbl 的情况下做相当于 memset(this, ...) 的操作? 2022-01-01