- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我的函数获取一个 std::ostream& stream
作为输入参数,将数据发送到其中,然后返回 stream
。在函数中,我想操作流的标志,但想在离开函数时恢复它们:
stream << "| 1:" << 3.1234567890 << "|" ;
stream << std::endl;
// geting the flags up to now
std::ios_base::fmtflags f = stream.flags();
// setting the flags the way we like it
stream << std::fixed << std::setprecision(9);
stream << "| 2:" << 3.1234567890 << "|" ;
stream.setf(f);
stream << std::endl;
stream << "| 3:" << 3.1234567890 << "|" ;
现在输出(令人惊讶地)是:
| 1:3.12346|
| 2:3.123456789|
| 3:3.123456789|
一旦我将 stream
设置为 std::cout
。显然,我无法使用 stream.setf(f)
恢复标志。为什么?正确的做法是什么?
最佳答案
std::ios_base::flags
是您正在寻找的功能,两者阅读和恢复。 std::ios_base::setf
只会设置标志;它不会取消任何设置(并且它可以创建一些非常奇怪的值在多位标志中,如 base 和 float 格式)。在此外,您可能希望保存和恢复精度(这不是标志的一部分)并且可能是填充字符。通常的做法是使用类似的东西:
class SaveIOFmt
{
std::basic_ios<char>& myOwner;
std::basic_ios<char>::fmtflags myFlags;
int myPrecision;
char myFill;
SaveIOFmt( SaveIOFmt const& );
SaveIOFmt& operator=( SaveIOFmt const& );
public:
SaveIOFmt( std::basic_ios<char>& owner )
: myOwner( owner )
, myFlags( owner.flags() )
, myPrecision( owner.precision() )
, myFill( owner.fill() )
{
}
~SaveIOFmt()
{
myOwner.fill( myFill );
myOwner.precision( myPrecision );
myOwner.flags( myFlags );
}
};
然后你所做的就是在顶部定义这个类的一个实例你的代码,当你离开时一切都会恢复,无论你如何离开。
关于c++ - 保存、操作和恢复 std::ios_base::fmtflags,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24658863/
避免永久修改流的 fmtflags 是一种好习惯吗? 比如我写的函数就是 std::ios_base::fmtflags flags = std::cout.setf(std::ios_base::b
在 STD 库文件 ios_base.h 中,我们看到以下内容: enum _Ios_Fmtflags { _S_boolalpha = 1L << 0, _S_dec =
我的函数获取一个 std::ostream& stream 作为输入参数,将数据发送到其中,然后返回 stream。在函数中,我想操作流的标志,但想在离开函数时恢复它们: stream & my
我是一名优秀的程序员,十分优秀!