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

时间:2015-09-24 11:10:03

标签: c++ c++11 inputstream manipulators

我正在尝试使用流操纵器解析文件。但是,作为运营商&gt;&gt;来自std::uint8_t的{​​{1}},std::uint16_tstd::uint32_t的重载是格式化的输入函数,它读取字符串并在必要时将其转换为数字。因此,它会将<istreams>解析为23,而不会将二进制表示23解析为00000010 00000011

您可以使用515方法使用inputstream.read()

执行此操作

reinterpret_cast<>

现在我的问题 - 是否可以实现覆盖&gt;&gt;的默认行为运算符所以我可以使用&gt;&gt;读取这样的std:uint类型运营商?我该如何实现它,如何在运算符之间切换?如果不可能你知道一种很好的方法来实现流操纵器来进行解析吗?

2 个答案:

答案 0 :(得分:0)

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

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

答案 1 :(得分:0)

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

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

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

Further examples here

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

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

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