C ++ выравнивание при печати cout <<

Есть ли способ выровнять текст при печати с помощью std::cout ? Я использую вкладки, но когда слова слишком большие, они больше не будут выровнены.

 Sales Report for September 15, 2010 Artist Title Price Genre Disc Sale Tax Cash Merle Blue 12.99 Country 4% 12.47 1.01 13.48 Richard Music 8.49 Classical 8% 7.81 0.66 8.47 Paula Shut 8.49 Classical 8% 7.81 0.72 8.49 

Стандартным способом ISO C ++ является использование #include и использование io-манипуляторов, таких как std::setw . Однако, тем не менее, эти io-манипуляторы являются реальной болью для использования даже для текста и просто непригодны для форматирования чисел (я полагаю, вы хотите, чтобы ваши долларовые суммы совпадали с десятичной точкой, имели правильное количество значимых цифр и т. Д. .). Даже для простых текстовых меток код будет выглядеть примерно так для первой части вашей первой строки:

 // using standard iomanip facilities cout << setw(20) << "Artist" << setw(20) << "Title" << setw(8) << "Price"; // ... not going to try to write the numeric formatting... 

Если вы можете использовать библиотеки Boost , запустите (не ходите) и вместо этого используйте библиотеку Boost.Format . Он полностью совместим со стандартными iostreams и дает вам все преимущества для легкого форматирования с помощью строки форматирования printf / Posix, но без потери мощности и удобства самих iostreams. Например, первые части ваших первых двух строк выглядят примерно так:

 // using Boost.Format cout << format("%-20s %-20s %-8s\n") % "Artist" % "Title" % "Price"; cout << format("%-20s %-20s %8.2f\n") % "Merle" % "Blue" % 12.99; 

См. Также: Какую библиотеку CI / O следует использовать в коде на C ++?

 struct Item { std::string artist; std::string c; integer price; // in cents (as floating point is not acurate) std::string Genre; integer disc; integer sale; integer tax; }; std::cout << "Sales Report for September 15, 2010\n" << "Artist Title Price Genre Disc Sale Tax Cash\n"; FOREACH(Item loop,data) { fprintf(stdout,"%8s%8s%8.2f%7s%1s%8.2f%8.2f\n", , loop.artist , loop.title , loop.price / 100.0 , loop.Genre , loop.disc , "%" , loop.sale / 100.0 , loop.tax / 100.0); // or std::cout << std::setw(8) << loop.artist << std::setw(8) << loop.title << std::setw(8) << fixed << setprecision(2) << loop.price / 100.0 << std::setw(8) << loop.Genre << std::setw(7) << loop.disc << std::setw(1) << "%" << std::setw(8) << fixed << setprecision(2) << loop.sale / 100.0 << std::setw(8) << fixed << setprecision(2) << loop.tax / 100.0 << "\n"; // or std::cout << boost::format("%8s%8s%8.2f%7s%1s%8.2f%8.2f\n") % loop.artist % loop.title % loop.price / 100.0 % loop.Genre % loop.disc % "%" % loop.sale / 100.0 % loop.tax / 100.0; } 

IO-манипуляторы – вот что вам нужно. в частности. Вот пример со страницы справки:

 // setw example #include  #include  using namespace std; int main () { cout << setw (10); cout << 77 << endl; return 0; } 

Обоснование поля влево и вправо выполняется с помощью left и right манипуляторов.

Также взгляните на setfill . Ниже приведено более полное руководство по форматированию вывода C ++ с помощью io-манипуляторов .

Здесь будет полезной функция setw манипулятора.

Другим способом выравнивания столбцов является следующее:

 using namespace std; cout.width(20); cout << left << "Artist"; cout.width(20); cout << left << "Title"; cout.width(10); cout << left << "Price"; ... cout.width(20); cout << left << artist; cout.width(20); cout << left << title; cout.width(10); cout << left << price; 

Мы должны оценить максимальную длину значений для каждого столбца. В этом случае значения столбца «Исполнитель» не должны превышать 20 символов и т. Д.

В то время, когда вы излучаете самую первую строку,

 Artist Title Price Genre Disc Sale Tax Cash 

для достижения «выравнивания» вы должны знать «заранее», насколько широким должен быть каждый столбец (иначе выравнивание невозможно). После того, как вы знаете необходимую ширину для каждого столбца (существует несколько возможных способов достижения этого в зависимости от того, откуда ваши данные), то функция setw упомянутая в другом ответе, поможет или (более жестоко 😉 вы можете испускать тщательно вычисленное количество лишних пробелов (неуклюже, конечно) и т. д. В любом случае я не рекомендую вкладки, так как у вас нет реального контроля над тем, как окончательное устройство вывода будет отображать их вообще.

Вернемся к основной проблеме, если у вас есть значение каждого столбца в некотором виде vector , например, вы можете сделать первый прогон форматирования, чтобы определить максимальную ширину столбца, например (не забудьте принять во внимание ширина заголовка для столбца тоже, конечно).

Если ваши строки идут «один за другим», а выравнивание имеет решающее значение, вам придется кэшировать или буферизовать строки по мере их поступления (в памяти, если они подходят, в противном случае на диске, который вы позже «переможете», и перечитывать с самого начала), следя за тем, чтобы обновлять вектор «максимальной ширины каждого столбца» по мере поступления строк. Вы не можете выводить ничего (даже заголовки!), Если сохранение выравнивания имеет решающее значение, пока вы не увидите самую последнюю строку (если вы каким-то волшебным образом не знаете ранее о ширинах столбцов, конечно ;-).

Interesting Posts

Читайте из файла, начиная с конца, подобно хвосту

Как загрузить несколько файлов с помощью Wget из Cygwin для Windows

Удаление символов строки строки из строки Java

Как предотвратить кэширование страницы html5?

Запустить командную строку в качестве администратора

text-overflow: многоточие не работает на IE

Работа с несколькими графиками в TensorFlow

Используйте настраиваемую панель контекстных действий для выбора текста WebView

Запуск Java7 в Chrome для Mac OS X (требуется 64-битный?

Программно отображает представление из подключаемого модуля Eclipse

Подстановка данных. Таблица по 2-му столбцу только из 2-х столбчатого ключа, с использованием двоичного поиска, а не сканирования вектора

Windows 7: Файл используется при удалении файла

Как преобразовать массив байтов в шестнадцатеричную строку и наоборот?

Ручное резервное копирование драйверов

Firefox скрывает все, кроме области содержимого браузера

Давайте будем гением компьютера.