在 C++ 中使用流操纵器解析 std::uint 类型

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

我正在尝试使用流操纵器解析文件。然而,由于 std::uint8_tstd::uint16_tstd::uint32_t 的 operator>> 重载来自 <istreams> 的是格式化输入函数,它读取字符串并在必要时将其转换为数字.所以它会解析 2323 而不是二进制表示 00000010 00000011515.

您可以使用 inputstream.read() 方法和 reinterpret_cast<>:

is.read(reinterpret_cast<char*>(data), sizeof(*data));

现在我的问题 - 是否可以实现覆盖 >> 运算符的默认行为,以便我可以使用 >> 运算符读取此类 std:uint 类型?我将如何实施它以及如何在运营商之间切换?如果不可能,您是否知道实现流操纵器来进行解析的好方法?

无法更改标准库提供的 operator>>(std::istream&, uintN_t&) 重载。

可以为您自己的流类型添加operator>>(my_binary_stream&, uintN_t&)重载,并让它们执行二进制I/O . (您可以轻松地重新使用标准库流对象来支持您的自定义二进制流,例如使用它们的 .read().write() 操作。)

Iostream >><< 运算符用于执行格式化的 i/o(想想 printfscanf)。可能有一种方法可以覆盖 iostream 层次结构的某些部分以执行您想要的操作,但我认为实际上并不期望 >><< 将用于二进制 i/o.

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

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

Further examples here.

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

正如我在上面的评论中指出的那样,请注意文件中数据的字节顺序。您可能还需要在 input/output 上执行字节交换。

对于完整的解决方案,您可以考虑 boost::serialization, which takes a slightly different approach