2

NTL ライブラリ (数論ライブラリ) を使用して出力をフォーマットしようとしています。オブジェクトの 1 つは GF2X オブジェクトで、係数の文字列として表される多項式です。簡単な例:

GF2X a = GF2X(5,1);
a++;
cout<<a;

[1 0 0 0 0 1]x^5 + 1 と同じ結果が得られます。私の質問は、setw を使用してこの出力をフォーマットすることです。さまざまな長さの GF2X オブジェクトを出力し、数値を前に付け、文字列を追加できるようにしたいと考えています。出力を次のようにしたいと思います。

  1:    [x x x x x x x x]       string here
 15:    [x x x]                 string here

setw を使用している場合は、これがおそらく期待されるはずです。ただし、コードを使用すると(変数名は簡単にするために省略されています):

    cout << setw(3)<< int <<": "<< setw(35) << GF2X << setw(15) << string << endl;

このような出力が得られます(コンパクトにするために一部の空白を削除しました)

  1:            [x x x x x x x x]   string here
 15:            [x x x]   string here

つまり、 setw 関数は の出力全体<<GF2Xを 1 つの文字として扱っているように見え、実際には出力文字列のサイズを考慮していないようです。私が示した出力からわかるように、GF2X 出力の左側は整列されていますが、右側は整列されていませんが、通常、setw は出力の右側を整列しているように見えます。

4

2 に答える 2

2

出力演算子を変更することでそれを行うことができます。このように書かれていると思います(このGF2Xクラスについては何も知らないので、これは部分的に擬似コードです:

std::ostream & operator<<(std::ostream & os, const GF2X & x)
{
    os << '[';
    for (int i=0; i<x.num_elements; ++i)
        os << x.get_element(i) << ' ';
    return os << ']';
}

問題は、setw が最初の '[' でのみ動作し、オブジェクト全体では動作しないことです (オブジェクト全体が何であるかはわかりません)。全体を文字列に書き込み (stringstream またはその他の手段を使用)、文字列出力することで、演算子を修正できます。演算子を変更できない場合は、別のヘルパー関数を使用して最初にオブジェクトを文字列に変換し (stringstream を使用)、その文字列をストリームに出力する必要があります。

実際にboost::lexical_castは、ここであなたにとって非常に便利です。

cout << setw(35) << boost::lexical_cast<std::string>(GF2X);
于 2012-07-29T19:17:05.783 に答える
0

一時的な ostringstream オブジェクトを使用して出力を保持し、提供された文字列に対して setw を使用できます (変数名は省略されます)。

    ostringstream oss;
    oss << GF2X;
    cout << setw(3) << x << ": "<< setw(35) << oss.str() << setw(15) << string <<endl;

これにより、最初の文字だけでなく、ostream オブジェクト全体がフォーマットされ、適切な出力が得られます。

于 2012-07-29T19:29:12.403 に答える