我想用循环打开所有标志。我试着这样做,
#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的无效转换。
我想知道为什么会出现这种错误以及如何修复它。
答案 0 :(得分:2)
如何打开所有标志?
您无法打开所有I / O标志。一些I / O标志彼此冲突。例如,std::oct
,std::dec
和std::hex
中只有一个可以处于活动状态。这同样适用于std::fixed
,std::scientific
和std::hexfloat
。标准保证的唯一操作是设置单个标志。这可能意味着在设置I / O标志的新调用上禁用先前设置的标志。 (这必须意味着在std::oct
,std::dec
或std::hex
的情况下。)
更糟糕的是,std::ios_base::fmtflags
的实现是实现定义的。这意味着实现可以,例如,对格式标志使用64位实现,值之间有很多间隔。或许不是。