我正在尝试使用流操纵符解析文件。然而,由于<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
,它采用了稍微不同的方法。