由于我必须处理大量二进制文件,因此我想采用一种更抽象的方式来执行此操作,因此我必须一遍又一遍地执行相同的循环:

  • 写标题
  • 以给定顺序写入不同种类的块(具有不同的值集)
  • 写一个可选的关闭头

  • 现在,我想在小的构建块中分解这个问题,想象一下我是否可以编写类似DTD的XML之类的东西,定义在给定块之后或在给定语义内可能存在的内容,因此我可以从构建块而不是十六进制值之类的 Angular 来考虑我的文件,代码也将更加“惯用”且不那么隐秘。

    最后,该语言中的某些内容可以帮助我处理这个预期的二进制文件。

    最佳答案

    我不确定C++ 11的特定功能,但是对于一般的C++,流使文件I / O的使用更加容易。您可以重载流插入(<>)运算符以实现您的目标。如果您不太熟悉运算符重载,请参阅this site的第9章,它很好地解释了它,并提供了许多示例。这是用于在流上下文中重载<>运算符的特殊page

    请允许我说明一下我的意思。假设我们定义了几个类:

  • BinaryFileStream-表示您要写入和(可能)读取的文件。
  • BinaryFileStreamHeader-表示文件头。
  • BinaryFileStreamChunk-代表一个块。
  • BinaryFileStreamClosingHeader-表示结束 header 。

  • 然后,您可以在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类添加运算符重载,以将其数据转换为适当的二进制表示形式。

    您可以以类似的方式重载流提取运算符(>>),尽管解析可能需要一些额外的工作。

    希望这可以帮助。

    09-10 03:49
    查看更多