2017-09-07 11 views
0

なぜiomanip /固定幅の持続

#include <iostream> 
#include <iomanip> 

int main() 
{ 
    std::cout << std::fixed << std::setw(4) << std::setprecision(0); 
    std::cout << 4; 
    std::cout << 4; 
} 

印刷

" 44 

(引用符を無視し、それはちょうど右のフォーマットを取得することです) なく

" 4 4 

はいますか?

iostreamの「修飾子」は、明示的に変更またはリセットされるまで、ストリーム上に永続的に存在すると考えました。私は、すべてのフィールドの幅が等しくなるように、特定のプレフィックスで印刷するのに必要な数の数字を持っています。印刷するたびに修飾語を再適用する必要がありますか?非常に効率的ではないようです。

+1

一部の修飾語は永続的であり、効率的であるかどうかにかかわらず、現在変更されていない可能性があるため、現在は無関係です。 –

答えて

3

残念なことに、残念なことに、あなたは少し古風で、見た目には最も重要な設計目標がない標準の領域の1つに行きました。

これはiostreamsライブラリAFAIAAとしての歴史が間違いなく、当初標準ライブラリになったSTLの一部ではありませんでした。

すべてのstd::ios_baseメンバーと関連マニピュレータに関する注釈を読む価値があります。

例えば:

http://en.cppreference.com/w/cpp/io/ios_base/width

いくつかのI/O機能は、STDを参照して、返す前に(0)幅を呼び出す:: setw(これは、次のI/Oに影響を与えるこの分野での結果

この修飾子が入力と出力に与える正確な影響は、個々の入出力機能によって異なり、各オペレータ< <に記述され、演算子>>オーバーロードのページが個別に表示されます。先取りし

をしかし、それはちょうど<挿入虚辞>だ!!!

A:yup。

+0

ああ、私はちょうど何かが足りないと思った。ありがとう。 – Roel

+0

もう1つの質問かもしれません。幅(0)を呼び出さないsetw()(例えばsetw_persistent())の独自のバージョンを作ることは可能でしょうか?私は、ここで説明されているように<<のカスタムオーバーロードを行うことになりますhttps://stackoverflow.com/questions/29337774/how-are-iomanip-functions-implementedしかし、私は、setw()のオーバーロードは何ですかストリームで? – Roel

+0

@Roelもしあなたが周りを遊ぶ価値のある人なら、あなたや私よりも賢い人がすでにそれを増やしてくれたでしょう。それは時間を無駄にする価値のないものの一つです。インターフェイスを学び、それを使うだけでなく、boost :: formatのような表現力豊かなものを使うことをお勧めします。 私は、ストリーミングオペレータの全体が、何年も前に、人々がよく知る前に、ひどく思いついたと思います。 –

関連する問題