2016-02-21 35 views
0

我希望把所有的標誌上有loop.I試圖像這樣做,如何打開所有標誌?

#include<iostream> 
using namespace std; 

void showflags() 
{ 
    // ios::fmtflags f; 
    long f=cout.flags(); 
    long i; 
    for(i=16384;i;i=i>>1) 
     if(i&f) 
      cout<<"1 "; 
     else cout<<"0 "; 
    cout<<endl; 
} 

void setallflag() 
{ 
    ios_base::fmtflags f,i=16384; 
    for(;i;i>>=1) 
     f=f|i; 
    cout.flag(f); 
} 

main() 
{ 
    showflags(); 
    setallflag(); 
    showflags(); 
} 

,但它給了我一個錯誤說「從int無效的轉換爲std ::的ios_base :: fmtflags。

我想知道爲什麼會出現這種錯誤,以及如何解決它。

+0

您需要投射。 –

+0

可能的將來重複的[我從來沒有初始化'f'和一切都是錯誤的](http://stackoverflow.com/questions/1597405/what-happens-to-a-declared-uninitialized-variable-in-c-does-它有價值) –

+1

你在這裏踩着危險的土地。格式標誌的值是[實現定義](http://en.cppreference.com/w/cpp/io/ios_base/fmtflags),所以你不應該嘗試以這種方式進行迭代,因爲它不能得到保證除了您特定的編譯器版本/操作系統/體系結構之外的任你最好明確自己實際需要的標誌。 – mindriot

回答

2

如何打開所有的標誌嗎?

你卡恩不要打開所有的I/O標誌。一些I/O標誌相互衝突。例如,只有std::oct,std::decstd::hex之一可以是活動的。這同樣適用於std::fixed,std::scientificstd::hexfloat。標準保證的唯一操作是設置單個標誌。這可能意味着先前設置的標誌在設置I/O標誌的新調用中被禁用。 (這一定意味着,在std::octstd::dec,或std::hex的情況下)。

更糟糕的是,中std::ios_base::fmtflags實施是實現定義的。這意味着一個實現可以使用格式標誌的64位實現,值之間有很多間距。或者可能不是。

+0

你在說cout.setf(ios ::大寫| ios :: boolalpha | ios :: hex | ios :: oct | ios :: dec | ios :: fixed | ios :: left | ios :: right | ios :: showpos | IOS :: showpoint | IOS :: showbase | IOS :: unitbuf | IOS ::科學| IOS ::內部);」這是不可能的,但我已經編寫了一個程序來知道哪些標記已打開,並用此行顯示了預期的輸出。 – Reshad

+0

@Reshad - 我說的完全相反。該標準不支持'output_stream :: setf(option_A | option_B)',更不用說'output_stream :: setf(option_A | option_B | ... | option_Z)'。標準支持的唯一東西是'output_stream :: setf(specific_option)',其中'specific_option'表示標準中提到的單個位標誌之一。 –

+0

錯誤顯示在我嘗試在setallflags函數中分配我的值的行中,爲什麼是這樣。 – Reshad