3

std::stringのように、カルマを使用してメモリを管理するコンテナーを生成する方法がわかります。しかし、バッファー ( char[N] ) が事前に割り当てられている場合はどうでしょうか?

  {
    using namespace boost::spirit::karma;
    {
      std::string buffer;
      generate(std::inserter(buffer, buffer.begin()), double_, 3.13);
      std::cout << ':' << buffer << ':' << std::endl;
    }
    {
      //////////////////////////////////////////////////////////////////////
      // How to make the following work? Is there a builtin output
      // iterator that just works?
#if defined(MAJIC)
      char buffer[1024];
      generate(buffer, double_, 3.13);
      std::cout << ':' << buffer << ':' << std::endl;
#endif
    }
  }

double を既存のバッファのアドレスに解析する方法を見つけたいと思います。この場合、バッファは十分な大きさであると仮定しても問題ありません。おそらく、根底にある質問は本当に - 出力反復子アダプターまたは使用できるネイティブ配列用のカルマの何かが既にありますか?

4

1 に答える 1

4

Karma 反復子ベースの API (ここ) は... 出力反復子を受け取ります。

アレイ用に 1 つだけ作成できます。

それに関する問題は、バッファ容量が決して不十分でないことを十分に確認する必要があることです:

    char buffer[1024];
    char* it = buffer;
    karma::generate(it, karma::double_ << karma::eol, 3.13);

    std::cout.write(buffer, std::distance(buffer, it));

バッファが NUL 終端されていると想定できないことに注意してください。生成されたサイズを使用します。

安全な使用array_sink:

Boost Iostream には、固定サイズのバッファに対しても安全な、より便利で一般的なアプローチがあります。

    char buffer[310];
    io::stream<io::array_sink> as(buffer);
    boost::spirit::ostream_iterator it(as);

特性を示すライブ デモを次に示します。

Live On Coliru

#include <boost/spirit/include/karma.hpp>
#include <boost/iostreams/device/array.hpp>
#include <boost/iostreams/stream.hpp>

namespace karma = boost::spirit::karma;
namespace io    = boost::iostreams;

void test(std::vector<int> const& v) 
{
    char buffer[310];
    io::stream<io::array_sink> as(buffer);
    boost::spirit::ostream_iterator it(as);

    using namespace karma;
    if (generate(it, int_ % ", " << eol, v))
    {
        std::cout << "Success: ";
        std::cout.write(buffer, as.tellp());
    } else
        std::cout << "Generation failed (insufficient capacity?)\n";
}

int main() {

    std::cout << "Should be ok: \n";
    std::vector<int> v(100, 1);
    test(v);

    std::cout << "This will exceed buffer capacity: \n";
    std::iota(v.begin(), v.end(), 42);
    test(v);
}

どのプリント

Should be ok: 
Success: 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1
This will exceed buffer capacity: 
Generation failed (insufficient capacity?)
于 2015-09-30T18:33:54.747 に答える