【问题标题】:What container can I use to write binary?我可以使用什么容器来编写二进制文件?
【发布时间】:2009-02-19 15:49:30
【问题描述】:

我想将一个 c 数组写入一个容器中,如果可能的话,我更愿意对其进行修改。 我正在考虑使用向量,但它似乎确实有一个 write(*pchararray, len);功能。 String 看起来是下一个最好的东西,但它也没有写功能?

【问题讨论】:

    标签: c++ containers


    【解决方案1】:

    给定

    char myarray[10];
    

    您可以使用 STL iterator

    vector <char> v;
    copy(myarray, myarray + 10, back_inserter(v));
    

    您可以使用构造函数

    vector <char> v(myarray, myarray + 10);
    

    您可以调整大小和复制

    vector<char> v(10);
    copy(myarray, myarray + 10, v.begin());
    

    (所有这些都对字符串起作用)

    感谢 cmets/其他答案 :)

    【讨论】:

    • 由于大小是已知的,我宁愿先调整向量的大小,然后直接复制到向量中,而不是使用 back_insert。只是为了避免不必要的调整大小和复制。
    • 为什么不使用二迭代器构造函数构造向量呢?它不那么冗长。
    • 优化:为了防止重复push_back()s造成不必要的重新分配,在copy()-ing之前保留(sizeof(myarray)/sizeof(myarray[0]))
    【解决方案2】:

    向量、字符串和许多其他容器为此目的都有一个“双迭代器”构造函数:

    char raw_data[100];
    std::vector<char> v(raw_data, raw_data + 100);
    std::string s(raw_data, raw_data + 100);
    

    【讨论】:

      【解决方案3】:

      容器选择取决于您对各个元素的使用。如果你的意思是将一个 c 字符数组复制到一个容器中,这就是你可以使用的:

      char buf[ n ];
      std::vector<char> vc(n); // Thanks to Éric 
      std::copy(buf, buf + n, vc.begin()); 
      

      【讨论】:

      • 此代码调用未定义的行为。您必须确保 vc.size() == n,或者使用 back_inserter。
      【解决方案4】:

      不确定你的“写”评论到底是什么意思,但是

      std::vector<char> charBuffer;
      

      在功能上等同于 c char(byte) 数组

      &charBuffer[0]
      

      为您提供连续的底层内存。

      所以现在你可以做

      charBuffer.resize(100);
      memcpy(&charBuffer[0], src, charBuffer.size());
      

      【讨论】:

      • 很高兴看到 Doug T 通过复制我的措辞和示例来增强他的答案!现在这就是我所说的社区精神......
      • @jkp:看起来他/帮助/你。
      • Erm - 我不确定 RichB 是怎么回事:他更改了答案的措辞并添加了一个显示调整大小和副本的示例:这两个都在我的答案中。感谢您的反对。
      • 我敢肯定没有其他人曾经想过这样的例子......通过获取第一个元素的地址将向量视为数组,谁会想到呢?当你有机会的时候,你应该为它申请专利。 ;) 也就是说,我实际上更喜欢你的回答。 std::copy 应该优先于 memcpy
      • 我更喜欢 jkp 的回答,但我看不出有什么让我感到不安的地方。你们俩使用的示例非常明显,编辑帖子以改进措辞或添加更多细节并没有犯罪。恰恰相反。
      【解决方案5】:

      您可以使用矢量。预先分配大小,然后寻址第一个字节:向量被保证是连续的,所以这总是有效的。

      std::vector<char> vBuffer;
      vBuffer.resize(nLength);
      std::copy(pStart, pEnd, &vBuffer[0]);
      

      【讨论】:

        【解决方案6】:

        你可以使用:

        string s( pchararray, len );  // constructor
        

        或者:

        string s;  s.append( pchararray, len ); // append example.
        

        如果需要,也可以使用 string::insert()。

        只要您指定长度,字符串就可以愉快地处理空字符 ('\0')。

        http://www.cplusplus.com/reference/string/string/

        【讨论】:

          【解决方案7】:

          在这种情况下,您应该更喜欢使用 memcpy(因为向量包含 POD 类型)而不是使用 std::copy,它会快很多。

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 2015-06-26
            • 1970-01-01
            • 2010-12-02
            • 2017-02-15
            • 2011-11-19
            • 2011-12-07
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多