Установка ширины в выходном потоке C ++ - PullRequest
17 голосов
/ 30 августа 2011

Я пытаюсь создать аккуратно отформатированную таблицу на 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;

Проблема в том, что ни одна из альтернатив не позволяет мне установить минимальный уровень по умолчаниюwidth, и я должен менять ее каждый раз, когда что-то записываю в поток.

Кто-нибудь знает, как я могу это сделать, не повторяя один и тот же вызов бесчисленное количество раз?Заранее спасибо.

Ответы [ 3 ]

19 голосов
/ 30 августа 2011

Вы можете создать объект, который перегружает 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;
1 голос
/ 30 августа 2011

Я знаю, что это все еще делает тот же звонок, но я не знаю другого решения из того, что я получаю от вашего вопроса.

#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
0 голосов
/ 30 августа 2011

почему бы просто не создать функцию?

псевдокод, например

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

Это немного неряшливо, но, надеюсь, вы поняли идею.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...