Учитывая следующий код:
/*Formatting Output
**Goal: practice using cout to format output to console
**Print the variables in three columns:
**Ints, Floats, Doubles
*/
#include <iostream>
#include <iomanip>
using namespace std;
int main()
{
int a = 45;
float b = 45.323;
double c = 45.5468;
int aa = a + 9;
float bb = b + 9;
double cc = c + 9;
int aaa = aa + 9;
float bbb = bb + 9;
double ccc = cc + 9;
// 1st attempt :>
cout << "\n\n\n" << "// 1st attempt :>" << "\n";
cout << "12345678901234567890123456789012345678901234567890" << "\n";
cout << "Ints" << setw(15) << "Floats" << setw(15) << "Doubles" << "\n";
cout << a << setw(15) << b << setw(15) << c << "\n";
cout << aa << setw(15) << bb << setw(15) << cc << "\n";
cout << aaa << setw(15) << bbb << setw(15) << ccc << "\n";
// 2nd attempt :>
cout << "\n\n\n" << "// 2nd attempt :>" << "\n";
cout << "12345678901234567890123456789012345678901234567890" << "\n";
cout << std::left << std::setfill(' ') << std::setw(15) << "Ints" << setw(15) << "Floats" << setw(15) << "Doubles" << "\n";
cout << a << setw(15) << b << setw(15) << c << "\n";
cout << std::left << std::setfill(' ') << setw(15) << aa << setw(15) << bb << setw(15) << cc << "\n";
cout << aaa << setw(15) << bbb << setw(15) << ccc << "\n";
// 3rd attempt :>
cout << "\n\n\n" << "// 3rd attempt :>" << "\n";
cout << "12345678901234567890123456789012345678901234567890" << "\n";
cout << std::left << std::setfill(' ') << std::setw(15) << "Ints" << setw(15) << "Floats" << setw(15) << "Doubles" << "\n";
cout << std::left << std::setfill(' ') << std::setw(15) << a << setw(15) << b << setw(15) << c << "\n";
cout << std::left << std::setfill(' ') << std::setw(15) << aa << setw(15) << bb << setw(15) << cc << "\n";
cout << std::left << std::setfill(' ') << std::setw(15) << aaa << setw(15) << bbb << setw(15) << ccc << "\n";
cout << "12345678901234567890123456789012345678901234567890" << "\n";
cout << std::right << std::setfill(' ') << std::setw(15) << "Ints" << setw(15) << "Floats" << setw(15) << "Doubles" << "\n";
cout << std::right << std::setfill(' ') << std::setw(15) << a << setw(15) << b << setw(15) << c << "\n";
cout << std::right << std::setfill(' ') << std::setw(15) << aa << setw(15) << bb << setw(15) << cc << "\n";
cout << std::right << std::setfill(' ') << std::setw(15) << aaa << setw(15) << bbb << setw(15) << ccc << "\n";
return 0;
}
// https://repl.it/@Tredekka/Cpp-Understanding-stdsetw
... Я получаю следующий вывод:
gcc version 4.6.3
// 1st attempt :>
12345678901234567890123456789012345678901234567890
Ints Floats Doubles
45 45.323 45.5468
54 54.323 54.5468
63 63.323 63.5468
// 2nd attempt :>
12345678901234567890123456789012345678901234567890
Ints Floats Doubles
4545.323 45.5468
54 54.323 54.5468
6363.323 63.5468
// 3rd attempt :>
12345678901234567890123456789012345678901234567890
Ints Floats Doubles
45 45.323 45.5468
54 54.323 54.5468
63 63.323 63.5468
12345678901234567890123456789012345678901234567890
Ints Floats Doubles
45 45.323 45.5468
54 54.323 54.5468
63 63.323 63.5468
... примечание: я намеренно "несовместим" с кодом, "потому что" пытаюсь понять поведение кода <iomanip>
&& std::setw()
.
Если вы посмотрите на вывод с 1-й попытки, вы заметите, что «строковый» вывод строки заголовка смещен от «числового» вывода строк данных... и хотя он «в основном» выполняет цель выравнивания вещей в столбцах , это и не точно, и не последовательно.
Во второй попытке вы увидите, что я обнаружил, что если я добавлю к выводу строки:
<< std::left << std::setfill(' ') << setw(15)
... тогда я получаю строку, чтобы выглядеть правильно (как показано в заголовке и 2-й строке данных) ... но теперь вы заметите, что 1-я и 3-я строки данных очень неверны:
4545.323 45.5468
...
6363.323 63.5468
... как "использование/выполнение" ...
<< std::left << std::setfill(' ') << setw(15)
... повлиять на "будущие" выполнения setw()
?
Для полноты картины я показал в третьей попытке, что можно правильно и точно выровнять столбцы данных (левый или правый) с помощью <iomanip>
&& std::setw()
... но почему несоответствия?
ответ от (@WhozCraig) помог мне добраться туда, где я нахожусь, но не углубился достаточно глубоко, чтобы помочь мне понять: (a ) почему это «псевдо» работает || (б) почему после того, как вы заставили его работать правильно в «первый» раз, оно затем нарушает «псевдо» функциональность.)
Ints
- это 4 символа, а45
- 2, поэтому 1-й не выровнен. - person 463035818_is_not_a_number   schedule 14.04.2018setw()
должен эффективноleftPad
/выравнивать столбец по правому краю по умолчанию (а не так, как это было объяснено в учебнике, которому я следовал) ... это сказал, что он по-прежнему не устраняет странности, которые представляют собой 1-ю и 3-ю строки данных второй попытки.?. - person George 2.0 Hope   schedule 14.04.2018setw
,left
является постоянным: достаточно вызвать его один раз, и он запомнится. - person Daniel H   schedule 14.04.2018