Я попытался найти много сообщений об этом, и я все еще не могу понять это. скажем, у меня есть цикл, где он читает строки из текстового файла, а затем отображает их на экране. Я хочу, чтобы каждый фрагмент данных был выровнен, но проблема в том, что данные могут быть разными, поэтому использование статического значения в 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) должен быть нестационарным. Я также пробовал левый правый, и это тоже не работает.
Вот как я решил эту проблему, если вы используете std :: string:
cout << left << setw(10) << account << setw(10) << fruit << setw(10 + strlen(fruit2.c_str()) - strlen(fruit.c_str())) << fruit2 << endl;
Он учитывает длину строки при форматировании. Вы можете выбрать произвольное смещение, если имена фруктов не слишком длинны ("клубника" вместо "яблок" нарушает формат с помощью
setw(10)
У вас просто отсутствует флаг std :: ios_base :: left.
std::cout << std::setw(10) << std::setiosflags(std::ios_base::left)
<< "x" << "y" << std::endl;
Это мало или вообще не имеет смысла - если вы действительно получаете этот результат, это звучит как проблема с вашим компилятором. Я написал довольно демо, похожее на то, что у вас есть в вопросе:
#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
Каждый элемент выравнивается по правому краю в своем поле, как и следовало ожидать из спецификации.