Выравнивание C++ при печати суда <<

Есть ли способ выровнять текст при печати использования 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
60
задан q-l-p 18 November 2017 в 07:18
поделиться

5 ответов

Манипуляторы ввода-вывода - это то, что вам нужно. В частности, setw . Вот пример со страницы справки:

// setw example
#include <iostream>
#include <iomanip>
using namespace std;

int main () {
  cout << setw (10);
  cout << 77 << endl;
  return 0;
}

Выравнивание поля слева и справа выполняется с помощью левого и правого манипуляторов.

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

9
ответ дан 24 November 2019 в 17:33
поделиться

См. также: Какой 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;
}
11
ответ дан 24 November 2019 в 17:33
поделиться

Стандартный для 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;
122
ответ дан 24 November 2019 в 17:33
поделиться

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

9
ответ дан 24 November 2019 в 17:33
поделиться

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

Artist  Title   Price   Genre   Disc    Sale    Tax Cash

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

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

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

4
ответ дан 24 November 2019 в 17:33
поделиться
Другие вопросы по тегам:

Похожие вопросы: