使用c++中的流操作符解析std::uint类型

Parse std::uint types using stream manipulators in C++

本文关键字:std uint 类型 操作符 c++ 使用      更新时间:2023-10-16

我正在尝试使用流操纵符解析文件。然而,由于<istreams>std::uint8_t, std::uint16_t, std::uint32_t的操作符>>重载是一个格式化的输入函数,它读取字符串,必要时将其转换为数字。因此,它将解析2323,而不是二进制表示00000010 00000011515

您可以使用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(例如printfscanf)。可能有一种方法可以覆盖iostream层次结构的某些部分来做您想做的事情,但我认为>><<并不真正期望用于二进制I/o。

使用iostreams的二进制i/o通常使用read()write()方法执行,并且需要您以二进制模式打开文件:

 fstream f;
 f.open ("data.bin", ios::in | ios::out | ios::binary);

这里有更多的例子。

您可以为fstream(或FILE*)编写自己的包装器并实现所需的操作符(只需让它们调用适当的readwrite方法)。

正如我在上面的注释中所指出的,要小心文件中数据的尾端顺序。您可能还需要在输入/输出上执行字节交换。

对于一个完整的解决方案,您可以考虑boost::serialization,它采用了稍微不同的方法。