17

私は最近、ストリームにアイテムが書き込まれるたびにios_base::widthおよび/またはsetwマニピュレータをリセットする必要があるという事実に悩まされていました。

つまり、これを行う必要があります。

while(whatever)
{
    mystream << std::setw(2) << myval;
}

これではなく:

mystream.width(2);
while(whatever)
{
    mystream << myval;
}

いいよ。

しかし、この設計上の決定がなされた理由を誰か知っていますか? 私が見逃しているという根拠はありますか、それともこれは標準の暗い隅にすぎませんか?

他のストリーム フォーマット修飾子 (リンクされた SO の質問で言及されているように) は「スティッキー」ですが、そうでsetwはありません。

4

2 に答える 2

6

どのマニピュレータが次の操作のみに影響を与えるかの決定は、共通の機能的ニーズをより適切に因数分解する傾向があるものについての論理的および経験的な観察に基づいているように思われるため、プログラマーが記述して正しく理解するのが容易になります。

次の点が関連していると思います。

  • some_stream << xほとんどの場合、正しく動作するはずです
  • 幅を設定するほとんどのコードは、すぐに、または直後に値をストリーミングするため、無関係なコードは、出力に影響を与える「保留中の」幅の値がないと想定できます。
  • setfill() 保留中の がない限り関連がないため、リストのトップにあるステートメント setw()に悪影響を与えることはありませんsome_stream << x
    • 幅が明示的に設定されている場合にのみ、プログラマーは、より大きな呼び出しコンテキストの知識に基づいて、文字の塗りつぶし状態も適切かどうかを検討できます/検討する必要があります
  • 一連の値が同じ埋め込み文字を使用することは非常に一般的です
  • 他のマニピュレータhexoct永続的ですが、それらの使用は通常、前の状態をポップするか、(厄介ですが簡単に) 10 進数に戻すコードのブロックで使用されます。

これからあなたの質問に答えるポイント...

  • 存在する場合setw()、不要な塗りつぶしを防ぐために、各ストリーミングステートメント間でリセットする必要があります...
于 2011-05-06T01:34:20.910 に答える
4

私の見方は次のとおりです。均一に適用したい場合は、いつでも以下のようなことができます。

int width =2;
while(whatever)
{
    mystream << std::setw(width) << myval;
}

しかし、あなたが言及したように粘着性がある場合:

mystream.width(2);
while(whatever)
{
    mystream << myval;
}

行ごとに異なる幅が必要な場合は、幅を設定し続ける必要があります。

したがって、基本的に両方のアプローチはほぼ同じであり、現在行っていることに応じて、好きか嫌いかを判断します。

于 2011-05-06T00:20:51.917 に答える