2012-03-30 20 views
7

mam ten kod:Formatowanie strumienia wyjściowego, ios :: ios :: lewy i prawy

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 

ale wyjście robi przyjść jak się spodziewałem. zamiast:

1 2 
1 2 

to wychodzi:

1 2 
    1 2 

Na czym polega problem? Ustawiłem "std :: ios :: left", ale to nie ma znaczenia?

Odpowiedz

7

Musisz wyczyścić poprzednią wartość w polu dopasowania, zanim będzie można ustawić nową.

Spróbuj tego:

#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

ile czujesz masochistyczne, wystarczy użyć:

// 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. Zauważ, że istnieje również 'std :: right'. –

+1

@ Robᵩ: Dobry punkt - dodany do przykładowego kodu. –

1

Kod chce std::resetiosflags(std::ios::right) wysłana do strumienia wyjściowego, aby cofnąć poprzednią std::setiosflags(std::ios::right).

1

Wygląda na to, że jeśli ustawione są obie flagi left i right, pierwszeństwo ma ta, która została ustawiona jako pierwsza. Gdybym jawnie zresetować right flagę przed ustawieniem left, mam wyjście z oczekiwaniami:

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

Używaj setf z maską (nie ma potrzeby 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 
Powiązane problemy