由于我必须大量使用二进制文件,所以我希望有一种更抽象的方法来实现这一点,我必须一遍又一遍地执行相同的循环:
现在我想在小的构建块中分解这个问题,想象一下,如果我可以为XML编写类似于DTD的东西,在给定块之后或者在给定语义内的定义,这样我就可以从构建块而不是十六进制值之类的角度来考虑我的文件,代码也会更加“地道”,也不会那么神秘。
最后,语言中有什么东西可以帮助我处理这个前景中的二进制文件?
发布于 2013-07-15 04:18:53
我不确定C++11的特定特性,但是对于一般的C++,流使文件I/O更容易使用。您可以重载流插入(<<)和流提取(>>)操作符以完成您的目标。如果您不太熟悉操作符重载,请参阅本站的第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类,将它们的数据转换成适当的二进制表示。
您可以以类似的方式重载流提取操作符(>>),尽管解析可能需要一些额外的工作。
希望这能有所帮助。
https://stackoverflow.com/questions/17646142
复制相似问题