gpt4 book ai didi

c++ - 保存、操作和恢复 std::ios_base::fmtflags

转载 作者:行者123 更新时间:2023-11-30 02:45:16 25 4
gpt4 key购买 nike

我的函数获取一个 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/

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