由于我必须处理大量二进制文件,因此我想采用一种更抽象的方式来执行此操作,因此我必须一遍又一遍地执行相同的循环:
现在,我想在小的构建块中分解这个问题,想象一下我是否可以编写类似DTD的XML之类的东西,定义在给定块之后或在给定语义内可能存在的内容,因此我可以从构建块而不是十六进制值之类的 Angular 来考虑我的文件,代码也将更加“惯用”且不那么隐秘。
最后,该语言中的某些内容可以帮助我处理这个预期的二进制文件。
最佳答案
我不确定C++ 11的特定功能,但是对于一般的C++,流使文件I / O的使用更加容易。您可以重载流插入(<>)运算符以实现您的目标。如果您不太熟悉运算符重载,请参阅this site的第9章,它很好地解释了它,并提供了许多示例。这是用于在流上下文中重载<>运算符的特殊page。
请允许我说明一下我的意思。假设我们定义了几个类:
然后,您可以在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类添加运算符重载,以将其数据转换为适当的二进制表示形式。
您可以以类似的方式重载流提取运算符(>>),尽管解析可能需要一些额外的工作。
希望这可以帮助。