重置std :: stringstream格式标志

时间:2016-12-26 12:55:06

标签: c++ stringstream

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

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;

但我得到的是Hex格式的两个值。如何重置stringstream?

3 个答案:

答案 0 :(得分:2)

  

如何重置stringstream?

格式标记是粘性的。

您可以保存旧格式标志以便以后恢复它们:

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 :(得分:0)

假设您知道实际使用了哪个格式化标志,您可以保存其原始值并稍后恢复它们。当改变的格式化标志集很大并且可能在某种程度上超出了函数的控制范围时,基本上有两种方法,不幸的是,它们并不是非常便宜:

  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;
    
  3. 由于一些基本上强制性的同步(主要用于创建std::locale成员),两种方法都需要创建一个流,但遗憾的是,该流并不是很快。

答案 2 :(得分:0)

只需使用

std::nouppercase

ss << std::uppercase;    
...

ss << std::nouppercase;

...