在C ++ 11中定义二进制文件的结构

时间:2013-07-15 03:00:52

标签: c++ c++11 binaryfiles

由于我必须使用二进制文件很多,我想有一个更抽象的方法来做到这一点,我必须一遍又一遍地执行相同的循环:

  • 写一个标题
  • 按给定顺序编写不同类型的块(具有不同的值集)
  • 写一个可选的结束标题

现在我想在小构建块中解决这个问题,想象一下,如果我可以编写类似于DTD的XML,定义了在给定块之后或在给定语义之内可能存在的内容,所以我可以根据构建块而不是十六进制值来考虑我的文件,或者类似的东西,代码将更加“惯用”而且不那么神秘。

最后,语言中有哪些东西可以帮助我从这个预期的二进制文件?

1 个答案:

答案 0 :(得分:3)

我不确定C ++ 11的具体功能,但对于C ++,一般来说,流使文件I / O更容易使用。您可以重载流插入(<<<<<<<<<&)和流提取(>>)运算符以实现您的目标。如果你不熟悉运算符重载,this site的第9章,它解释得很好,还有很多例子。这是重载<<<<<<<<<<和>>流中的运营商。

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

  1. BinaryFileStream - 表示您尝试写入和(可能)读取的文件。
  2. BinaryFileStreamHeader - 表示文件头。
  3. BinaryFileStreamChunk - 代表一个块。
  4. BinaryFileStreamClosingHeader - 表示结束标题。
  5. 然后,您可以重载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;),但解析可能需要一些额外的工作。

    希望这有帮助。