gpt4 book ai didi

c++ - 在 C++ 流中检索标志

转载 作者:塔克拉玛干 更新时间:2023-11-03 06:58:24 24 4
gpt4 key购买 nike

如何在 C++ 流中使用标志?我知道 ios_base::flags(),但是当我 cout 或比较它们时,即使使用新标志,它们也不会更改值。一个简单的程序:

#include <iostream>
using namespace std;

int main(){
cout << cout.flags() << endl;//4098
cout << std::hex << cout.flags() << endl;// 0x1002
return 0;
}

不会更改输出的默认值(至少对我而言)4098。

我的最终目标是将流与标志进行比较以查看设置了哪些,不要设置新的。任何人都可以告诉我如何执行此操作的示例吗?

最佳答案

使用这段代码:

cout << std::hex << cout.flags() << endl;

允许编译器按以下顺序对其求值:

ios_base::fmtflags f = cout.flags();  // store value before applying std::hex
cout << hex;
cout << f;
cout << endl;

因此,您不能保证以这种方式“看到”标志更改。但是,这不是未定义的行为。

标志是一种“位掩码类型”,它被定义为具有某些属性——实际使用的类型是实现定义的,但整数、枚举和 std::bitsets 都是可能的。您可以使用普通的位操作运算符:^、&、| 和 ~:

bool is_hex(std::ios_base &s) {
return (s.flags() & s.basefield) == s.hex;
}
// is_oct is identical, except with s.oct

// Nothing set in basefield means "determine base from input" for istreams,
// and ostreams use base 10. This makes is_dec harder to write.

bool is_anybase(std::istream &s) {
return (s.flags() & s.basefield) == 0;
}

bool is_dec(std::istream &s) {
std::ios_base::fmtflags base = s.flags() & s.basefield;
return base == dec;
}
bool is_dec(std::ostream &s) {
std::ios_base::fmtflags base = s.flags() & s.basefield;
return (base == dec) || (base == 0);
}
// Purposeful overload ambiguity on std::iostream.
// In 0x, we could write:
bool is_dec(std::iostream &s) = delete;

例如,std::hex 是这样工作的:

std::ios_base& hex(std::ios_base &s) {
s.setf(s.hex, s.basefield);
return s;
}

setf 的作用:

ios_base::fmtflags fmtflags = s.hex;    // first parameter
ios_base::fmtflags mask = s.basefield; // second parameter
s.flags((s.flags() & ~mask) | (fmtflags & mask));

关于c++ - 在 C++ 流中检索标志,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6286967/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com