如何打开所有标志?

时间:2016-02-21 22:30:31

标签: c++

我想用循环打开所有标志。我试着这样做,

#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();
}

但它给出了一个错误说&#34;从int到std :: ios_base :: fmtflags的无效转换。

我想知道为什么会出现这种错误以及如何修复它。

1 个答案:

答案 0 :(得分:2)

  

如何打开所有标志?

您无法打开所有I / O标志。一些I / O标志彼此冲突。例如,std::octstd::decstd::hex中只有一个可以处于活动状态。这同样适用于std::fixedstd::scientificstd::hexfloat。标准保证的唯一操作是设置单个标志。这可能意味着在设置I / O标志的新调用上禁用先前设置的标志。 (这必须意味着在std::octstd::decstd::hex的情况下。)

更糟糕的是,std::ios_base::fmtflags的实现是实现定义的。这意味着实现可以,例如,对格式标志使用64位实现,值之间有很多间隔。或许不是。