setw()との取引は何ですか?
-
29-10-2019 - |
質問
私は最近、その事実に噛まれました ios_base::width
および/または setw
マニピュレーターはそうでなければなりません ストリームに書かれたすべてのアイテムでリセットされます.
つまり、あなたはこれをしなければなりません:
while(whatever)
{
mystream << std::setw(2) << myval;
}
これではなく:
mystream.width(2);
while(whatever)
{
mystream << myval;
}
いいよ。
しかし、この設計上の決定が下された理由を誰かが知っていますか?私が欠けているいくつかの理論的根拠はありますか、それともこれは標準の暗いコーナーですか?
他のストリームフォーマット修飾子(リンクされた質問で言及されているように)は「粘着性」ですが、 setw
ではありません。
解決
私が見る方法は、あなたがそれを均一に適用したいなら、いつでも以下のようなことをすることができます。
int width =2;
while(whatever)
{
mystream << std::setw(width) << myval;
}
しかし、あなたが言及しているように粘着性があった場合:
mystream.width(2);
while(whatever)
{
mystream << myval;
}
そして、すべての行の幅が異なる場合は、幅を設定し続ける必要があります。
したがって、本質的に両方のアプローチはほぼ同じです。私が今していることに応じて、私はそれらを望んでいるか嫌います。
他のヒント
次の操作のみに影響するマニピュレーターの決定は、共通の機能的ニーズをより良く考慮する傾向があるものについての論理的および経験的観察に基づいているように思われるため、プログラマーが書き込み、正しくなることが容易になります。
次のポイントは私を関連していると思います:
some_stream << x
ほとんどの場合正しく動作するはずです- 幅を設定するほとんどのコードはすぐにまたはその後すぐに値をストリーミングするため、無関係なコードは出力に影響する「保留中の」幅値がないと想定できます
setfill()
関連性はありません 保留中でない限りsetw()
, 、したがって、悪影響はありませんsome_stream << x
私たちのリストをトッピングするステートメント- 幅が明示的に設定されている場合にのみ、プログラマーは、より大きな呼び出しコンテキストの知識に基づいて、塗りつぶし文字の状態も適切かどうかを検討することができます/検討する必要があります
- 一連の値が同じ塗りつぶし文字を使用することは非常に一般的です
- 他のマニピュレーターのような
hex
とoct
永続的ですが、それらの使用は通常、以前の状態をポップするか(厄介だが簡単)、小数に戻るコードのブロックにあります
答えてくれるポイント あなたの質問...
- もしも
setw()
存在していた場合、不要な充填を防ぐために各ストリーミングステートメント間でリセットする必要があります...
所属していません StackOverflow