重置std :: stringstream格式标志

Resetting std::stringstream format flags

本文关键字:标志 格式 stringstream 重置 std      更新时间:2023-10-16

我需要在控制台中打印十六进制和十进制值。我使用以下代码来完成。

std::stringstream ss;
ss << "0x" << std::uppercase << std::hex << 15;    
std::cout << ss.str() << std::endl;
ss.str("");
ss.clear();
ss << 15;
std::cout << ss.str() << std::endl;

,但我以十六进制格式获得了这两个值。如何重置弦乐?

如何重置弦乐?

格式标志很粘。

您可以保存旧格式标志以稍后再恢复:

std::stringstream ss;
auto oldFlags = ss.flags(); // <<
ss << "0x" << std::uppercase << std::hex << 15;    
std::cout << ss.str() << std::endl;
ss.flags(oldFlags); // <<
ss << 15;
std::cout << ss.str() << std::endl;

假设您知道实际使用了哪个格式标志,则可以保存其原始值并以后还原它们。当更改格式标志的集合很大,并且可能有些无法控制功能时,不幸的是,两种方法都不是很便宜:

  1. 请勿直接使用std::stringstream,而是使用应用格式标志的临时流:

    {
        std::ostream out(ss.rdbuf());
        out << std::showbase << std::uppercase << std::hex << 15;
    }
    ss << 15;
    
  2. 您可以使用copyfmt()成员复制所有格式标志,然后还原这些标志:

    std::ostream aux(0); // sadly, something stream-like is needed...
    out.copyfmt(ss);
    out << std::showbase << std::uppercase << std::hex << 15;
    ss.copyfmt(aux);
    out << 15;
    

这两种方法都需要创建一个流,这是不幸的是,由于一些本质上是强制性的同步(主要用于创建std::locale成员)。

只使用

std::nouppercase
ss << std::uppercase;    
...
ss << std::nouppercase;
...