2012-03-30 67 views
7

我有這樣的代碼:格式化輸出流,IOS ::左和iOS ::右

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

您必須先清除adjustfield中的前一個值,然後才能設置新的值。

試試這個:

#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'也存在。 – 2012-03-30 17:23:57

+1

@Robᵩ:好點 - 添加到示例代碼。 – 2012-03-30 17:26:20

1

你想要的代碼發送到輸出流撤銷之前的std::setiosflags(std::ios::right)一個std::resetiosflags(std::ios::right)

1

看起來像是如果leftright標誌都置位,那麼先設置的標誌優先。如果我明確設置left之前重置right標誌,我得到你需要的輸出:

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