由于我必须使用二进制文件很多,我想有一个更抽象的方法来做到这一点,我必须一遍又一遍地执行相同的循环:
现在我想在小构建块中解决这个问题,想象一下,如果我可以编写类似于DTD的XML,定义了在给定块之后或在给定语义之内可能存在的内容,所以我可以根据构建块而不是十六进制值来考虑我的文件,或者类似的东西,代码将更加“惯用”而且不那么神秘。
最后,语言中有哪些东西可以帮助我从这个预期的二进制文件?
答案 0 :(得分:3)
我不确定C ++ 11的具体功能,但对于C ++,一般来说,流使文件I / O更容易使用。您可以重载流插入(<<<<<<<<<&)和流提取(>>)运算符以实现您的目标。如果你不熟悉运算符重载,this site的第9章,它解释得很好,还有很多例子。这是重载<<<<<<<<<<和>>流中的运营商。
请允许我说明我的意思。假设我们定义了几个类:
然后,您可以重载BinaryFileStream中的流插入和提取操作符来写入和读取文件(或任何其他istream或ostream)。
...
#include <iostream> // I/O stream definitions, you can specify your overloads for
// ifstream and ofstream, but doing so for istream and ostream is
// more general
#include <vector> // For holding the chunks
class BinaryFileStream
{
public:
...
// Write binary stream
friend const std::ostream& operator<<( std::ostream& os, const BinaryFileStream& bfs )
{
// Write header
os << bfs.mHeader;
// write chunks
std::vector<BinaryFileStreamChunk>::iterator it;
for( it = bfs.mChunks.begin(); it != bfs.mChunks.end(); ++it )
{
os << (*it);
}
// Write Closing Header
os << bfs.mClosingHeader;
return os;
}
...
private:
BinaryFileStreamHeader mHeader;
std::vector<BinaryFileStreamChunk> mChunks;
BinaryFileStreamClosingHeader mClosingHeader;
};
你必须做的就是为BinaryFileStreamHeader,BinaryFileStreamChunk和BinaryFileStreamClosingHeader类提供运算符重载,将它们的数据转换为适当的二进制表示。
您可以以类似的方式重载流提取运算符(&gt;&gt;),但解析可能需要一些额外的工作。
希望这有帮助。