質問

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

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

はx ^ 5 + 1と同じである[1 0 0 0 0 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の出力全体を単一の文字として扱うように見え、実際には出力文字列のサイズを説明するようには見えません。私があなたを示した出力からわかるように、GF2X出力の左側は揃っていますが、右側は存在しませんが、通常はSETWは出力の右側を揃えるようです。

役に立ちましたか?

解決

出力演算子を変更することができます。私はそれがこのようなものを書いていると想像しています(私はこのGF2Xクラスについて何も知らないので、これは部分的にPsueo-code:

です。
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または他の方法を使用して)、を出力して文字列を出力するように修正することができます。オペレーターを変更することがオプションではない場合は、最初にオブジェクトを文字列に変換してその文字列をストリームに出力するように別のヘルパー関数を使用する必要があります。

実際には、boost::lexical_castはあなたにとって最後にするので、ここでは本当に便利になるでしょう。

cout << setw(35) << boost::lexical_cast<std::string>(GF2X);
.

他のヒント

一時OSTRINGSTREAMオブジェクトを使用して出力を保持してから、指定された文字列(変数名省略)にSETWを使用できます。

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

これは最初の文字だけではなく、OSTREAMオブジェクト全体をフォーマットし、適切な出力を与えます。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top