web-dev-qa-db-ja.com

C ++出力ストリームでの幅の設定

さまざまなフィールドの幅を設定して、C++で適切にフォーマットされたテーブルを作成しようとしています。 setw(n)を使用して、次のようなことを行うことができます

cout << setw(10) << x << setw(10) << y << endl;

またはios_base :: widthを変更します

cout.width (10);
cout << x;
cout.width (10);
cout << y << endl;

問題は、どちらの方法でもデフォルトの最小幅を設定できず、ストリームに何かを書き込むたびに変更する必要があることです。

同じ電話を何度も繰り返さなくてもできる方法を知っている人はいますか?前もって感謝します。

18
Andre Manoel

operator<<をオーバーロードし、内部でiostreamを自動的に呼び出すsetwオブジェクトを含むオブジェクトを作成できます。例えば:

class formatted_output
{
    private:
        int width;
        ostream& stream_obj;

    public:
        formatted_output(ostream& obj, int w): width(w), stream_obj(obj) {}

        template<typename T>
        formatted_output& operator<<(const T& output)
        {
            stream_obj << setw(width) << output;

            return *this;
        }

        formatted_output& operator<<(ostream& (*func)(ostream&))
        {
            func(stream_obj);
            return *this;
        }
};

これで、次のように呼び出すことができます。

formatted_output field_output(cout, 10);
field_output << x << y << endl;
19
Jason

私はこれがまだ同じ電話をかけていることを知っています、しかし私はあなたの質問から得ているものから他の解決策を知りません。

#define COUT std::cout.width(10);std::cout<<

int main()
{
    std::cout.fill( '.' );

    COUT "foo" << std::endl;
    COUT "bar" << std::endl;

    return 0;
}

出力:

..........foo
..........bar
1
ssell

関数を作成してみませんか?

擬似コード例:.

void format_cout(text, w) {
 cout << text << width(w);
}

それは少しくだらないですが、うまくいけばあなたはアイデアを得るでしょう。

0
Ray