2012-03-30 5 views
7

У меня есть этот код:Форматирование выходного потока, ИОС :: левый и правый ИОС ::

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', но это не имеет никакого значения?

ответ

7

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

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

#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'; 
} 
15

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

// 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'; 
+1

+1. Обратите внимание, что 'std :: right' также существует. –

+1

@ Robᵩ: Хорошая точка - добавлен пример кода. –

1

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

1

Похоже, если установлены флаги 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 
6

Используйте SETF с маской (нет необходимости в resetiosflags)

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 
Смежные вопросы