首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在C++ 11中定义二进制文件的结构

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

Stack Overflow用户
提问于 2013-07-15 03:00:52
回答 1查看 1.2K关注 0票数 1

由于我必须大量使用二进制文件,所以我希望有一种更抽象的方法来实现这一点,我必须一遍又一遍地执行相同的循环:

  • 写标题
  • 按给定的顺序编写不同类型的块(具有不同的值集)
  • 写入可选的关闭标头

现在我想在小的构建块中分解这个问题,想象一下,如果我可以为XML编写类似于DTD的东西,在给定块之后或者在给定语义内的定义,这样我就可以从构建块而不是十六进制值之类的角度来考虑我的文件,代码也会更加“地道”,也不会那么神秘。

最后,语言中有什么东西可以帮助我处理这个前景中的二进制文件?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2013-07-15 04:18:53

我不确定C++11的特定特性,但是对于一般的C++,流使文件I/O更容易使用。您可以重载流插入(<<)和流提取(>>)操作符以完成您的目标。如果您不太熟悉操作符重载,请参阅本站的第9章,它对此进行了很好的解释,并给出了大量示例。下面是用于在流上下文中重载<<和>>运算符的特定的>>。

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

  1. BinaryFileStream -它表示您试图写入和(可能)读取的文件。
  2. BinaryFileStreamHeader -它表示文件头。
  3. BinaryFileStreamChunk --它代表一个块。
  4. BinaryFileStreamClosingHeader --它表示结束标题。

然后,您可以在BinaryFileStream中重载流插入和提取操作符,以写入和读取文件(或任何其他istream或ostream)。

代码语言:javascript
复制
...
#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类,将它们的数据转换成适当的二进制表示。

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

希望这能有所帮助。

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/17646142

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档