Установка ширины в потоке вывода С++
Я пытаюсь создать аккуратно отформатированную таблицу на С++, установив ширину разных полей. Я могу использовать setw (n), делая что-то вроде
cout << setw(10) << x << setw(10) << y << endl;
или изменить ios_base:: width
cout.width (10);
cout << x;
cout.width (10);
cout << y << endl;
Проблема заключается в том, что ни одна из альтернатив не позволяет мне установить минимальную ширину по умолчанию, и я должен менять ее каждый раз, когда я что-то буду писать в поток.
Кто-нибудь знает, как я могу это сделать, не повторяя один и тот же звонок бесчисленное количество раз?
Спасибо заранее.
Ответы
Ответ 1
Вы можете создать объект, который перегружает 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;
Ответ 2
Я знаю, что это по-прежнему вызывает тот же звонок, но я не знаю другого решения из того, что я получаю от вашего вопроса.
#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
Ответ 3
Почему бы просто не создать функцию?
псевдокод, например
void format_cout(text, w) {
cout << text << width(w);
}
Это немного лоскутное, но, надеюсь, вы получите эту идею.