0

我正在尝试使用流操纵器解析文件。但是,由于std::uint8_t, std::uint16_t, std::uint32_tfrom的 operator>> 重载<istreams>是一个格式化的输入函数,它会读取一个字符串,并在必要时将其转换为一个数字。所以它会解析2323而不是二进制00000010 00000011表示515

您可以使用以下inputstream.read()方法执行此操作reinterpret_cast<>

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

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

4

2 回答 2

0

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

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

于 2015-09-24T11:34:08.173 回答
0

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您可以为(or )编写自己的包装器FILE*并实现所需的运算符(只需让它们调用适当的readwrite方法)。

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

对于一个完整的解决方案,您可以考虑boost::serialization,这需要稍微不同的方法

于 2015-09-24T11:34:55.440 回答