2012-03-30 15 views
7

ho questo codice:Formattazione il flusso di output, ios :: sinistra e ios :: diritto

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 

ma l'uscita doesnt venire come mi aspettavo. invece di:

1 2 
1 2 

questo viene fuori:

1 2 
    1 2 

Qual è il problema? Ho impostato 'std :: ios :: left' ma non fa differenza?

risposta

7

È necessario cancellare il valore precedente nel campo di regolazione prima di poterne impostare uno nuovo.

Prova questo:

#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

A meno che non ti senti masochista, basta usare:

// 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. Nota che esiste anche 'std :: right'. –

+1

@ Rob: buon punto - aggiunto al codice di esempio. –

1

Il codice vuole un std::resetiosflags(std::ios::right) inviato al flusso di output per annullare la precedente std::setiosflags(std::ios::right).

1

Sembra che se sono impostati entrambi i flag left e, quello impostato per primo ha la precedenza. Se la I ripristinasse esplicitamente right bandiera prima di impostare left, ho l'output che si aspettava:

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

Usa setf con una maschera (senza bisogno di 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 
Problemi correlati