как выровнять разные длины вывода C ++

0

Я попытался найти много сообщений об этом, и я все еще не могу понять это. скажем, у меня есть цикл, где он читает строки из текстового файла, а затем отображает их на экране. Я хочу, чтобы каждый фрагмент данных был выровнен, но проблема в том, что данные могут быть разными, поэтому использование статического значения в setw не работает. например, здесь есть текстовый файл

000000  apples      pears     2.00
000001  oranges     bannana   1.00

так я хочу, чтобы он смотрел на экран, но мой экран выглядит так

000000  apples      pears     2.00
000001 oranges    banana   1.00

он видит, что апельсины на 1 дольше, чем яблоки, а затем он перемещает его на 1 влево. он делает то же самое с бананом и грушами

как выровнять его, как в первом примере (как это выглядит в текстовом файле)

это то, что я использую:

cout << account << setw(10) << fruit << setw(10) << fruit2 << setw(10) << money << endl;

Я чувствую, что setw (10) должен быть нестационарным. Я также пробовал левый правый, и это тоже не работает.

  • 0
    Рассмотрите возможность использования boost.format
  • 0
    Я не могу использовать boost, потому что у него не может быть дополнительных библиотек
Показать ещё 1 комментарий
Теги:
console-application
io
alignment

3 ответа

0
Лучший ответ

Вот как я решил эту проблему, если вы используете std :: string:

cout << left << setw(10) << account << setw(10) << fruit << setw(10 + strlen(fruit2.c_str()) -  strlen(fruit.c_str())) << fruit2 << endl;   

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

setw(10)
  • 0
    Это именно то, что мне было нужно. Спасибо, это работает сейчас!
0

У вас просто отсутствует флаг std :: ios_base :: left.

std::cout << std::setw(10) << std::setiosflags(std::ios_base::left)
      << "x" << "y" << std::endl;
0

Это мало или вообще не имеет смысла - если вы действительно получаете этот результат, это звучит как проблема с вашим компилятором. Я написал довольно демо, похожее на то, что у вас есть в вопросе:

#include <iostream>
#include <iomanip>
#include <string>
#include <iterator>

struct account {
    std::string acct;
    std::string fruit;
    std::string fruit2;
    double qty;

    friend std::ostream &operator<<(std::ostream &os, account const &a) {
        return os << a.acct << std::setw(10) 
                << a.fruit << std::setw(10)
                << a.fruit2 << std::setw(5)
                << a.qty;
    }   
};

int main() { 
    account accts[] = {
        { "0000", "apples", "pears", 2.0 },
        { "0001", "oranges", "banana", 1.0 }
    };

    std::copy_n(accts, 2, std::ostream_iterator<account>(std::cout, "\n"));
}

Результат получается согласованно, как и любой, кто понимал setw:

0000    apples     pears    2
0001   oranges    banana    1

Каждый элемент выравнивается по правому краю в своем поле, как и следовало ожидать из спецификации.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню