Форматирование выходного потока, ios :: left и ios :: right - PullRequest
8 голосов
/ 30 марта 2012

У меня есть этот код:

cout << std::setiosflags(std::ios::right);
cout << setw(3) << 1 << setw(3) << 2 << '\n'; // Output two values

cout << std::setiosflags(std::ios::left);
cout << setw(3) << 1 << setw(3) << 2 << '\n'; // Output two values

но вывод не приходит, как я ожидал. вместо:

  1  2
1  2  

это выходит:

  1  2
  1  2

В чем проблема? Я установил 'std :: ios :: left', но это не имеет значения?

Ответы [ 5 ]

17 голосов
/ 30 марта 2012

Если вы не чувствуете себя мазохистом, просто используйте:

// right justify by default.
cout << setw(3) << 1 << setw(3) << 2 << '\n';

// left justify
cout << std::left << setw(3) << 1 << setw(3) << 2 << '\n';

// right justify again.
cout << std::right << setw(3) << 1 << setw(3) << 2 << '\n';
8 голосов
/ 30 марта 2012

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

Попробуйте это:

#include <iostream>
#include <iomanip>
int main () {
  std::cout << std::resetiosflags(std::ios::adjustfield);
  std::cout << std::setiosflags(std::ios::right);
  std::cout << std::setw(3) << 1 << std::setw(3) << 2 << '\n';

  std::cout << std::resetiosflags(std::ios::adjustfield);
  std::cout << std::setiosflags(std::ios::left);
  std::cout << std::setw(3) << 1 << std::setw(3) << 2 << '\n';
}
7 голосов
/ 30 марта 2012

Использовать setf с маской (нет необходимости в повторных флагах)

using namespace std;
cout.setf(ios::right, ios::adjustfield);
cout << setw(3) << 1 << setw(3) << 2 << '\n'; // Output two values

cout.setf(ios::left, ios::adjustfield);
cout << setw(3) << 1 << setw(3) << 2 << '\n'; // Output two values
1 голос
/ 30 марта 2012

Похоже, если установлены оба флага left и right, приоритет имеет тот, который был установлен первым.Если я явно сброслю флаг right перед установкой left, я получу ожидаемый результат:

cout << std::setiosflags(std::ios::right);
cout << setw(3) << 1 << setw(3) << 2 << '\n'; // Output two values

cout << resetiosflags(std::ios::right);

cout << std::setiosflags(std::ios::left);
cout << setw(3) << 1 << setw(3) << 2 << '\n'; // Output two values
1 голос
/ 30 марта 2012

Ваш код хочет, чтобы std::resetiosflags(std::ios::right) был отправлен в выходной поток для отмены предыдущего std::setiosflags(std::ios::right).

...