使用c++中的流操作符解析std::uint类型
Parse std::uint types using stream manipulators in C++
我正在尝试使用流操纵符解析文件。然而,由于<istreams>
的std::uint8_t
, std::uint16_t
, std::uint32_t
的操作符>>重载是一个格式化的输入函数,它读取字符串,必要时将其转换为数字。因此,它将解析23
到23
,而不是二进制表示00000010 00000011
到515
。
您可以使用inputstream.read()
方法和reinterpret_cast<>
:
is.read(reinterpret_cast<char*>(data), sizeof(*data));
现在我的问题-是否有可能实现覆盖>>操作符的默认行为,以便我可以使用>>操作符读取此类std: int类型?如何实现它,如何在操作符之间切换?如果这是不可能的,你知道一个很好的方法来实现一个流操纵器来做解析吗?
不
可以更改标准库提供的operator>>(std::istream&, uintN_t&)
重载。
您可以为您自己的流类型添加operator>>(my_binary_stream&, uintN_t&)
重载,并让它们执行二进制I/O。(你可以很容易地重用标准库流对象来支持你的自定义二进制流,例如使用它们的.read()
和.write()
操作。)
Iostream >>
和<<
操作符用于执行格式化的i/o(例如printf
和scanf
)。可能有一种方法可以覆盖iostream层次结构的某些部分来做您想做的事情,但我认为>>
和<<
并不真正期望用于二进制I/o。
使用iostreams的二进制i/o通常使用read()
和write()
方法执行,并且需要您以二进制模式打开文件:
fstream f;
f.open ("data.bin", ios::in | ios::out | ios::binary);
这里有更多的例子。
您可以为fstream
(或FILE*
)编写自己的包装器并实现所需的操作符(只需让它们调用适当的read
和write
方法)。
正如我在上面的注释中所指出的,要小心文件中数据的尾端顺序。您可能还需要在输入/输出上执行字节交换。
对于一个完整的解决方案,您可以考虑boost::serialization
,它采用了稍微不同的方法。
- 使用std::multimap迭代器创建std::list
- C++中std::resize(n)和std::shrink_to_fit之间的区别
- 来自 std::list 的迭代器 .end() 按预期返回"0xcdcdcdcdcdcdcdcd"但 .begin()
- C++17复制构造函数,在std::unordereded_map上进行深度复制
- 如何导出包含具有"std::unique_ptr"值的"std::map"属性的
- 从持续时间构造std::chrono::system_clock::time_point
- std::具有相同基类的类的变体
- std::向量与传递值的动态数组
- 使用std::vector的OpenCL矩阵乘法
- std::map<struct,struct>::find 找不到匹配项,但是如果我循环通过 begin() 到 end(),我在那里看到匹配项
- std::condition_variable::wait()如何评估给定的谓词
- 如何获取std::result_of函数的返回类型
- std::原子加载和存储都需要吗
- 将对象移动到std::shared_ptr
- POCO::PostgreSQL:如何将std::vector支持添加到`Binder::bind`
- 使用一个考虑到std::map中键值的滚动或换行的键
- 如何从 std::atomic 中提取指针 T<T>?
- 为什么 std::unique 不调用 std::sort?
- 如何将 std::unordered_multimap<uint, T> 转储到 std::vector<T>?
- 使用c++中的流操作符解析std::uint类型