重置的std :: stringstream的格式标志

问题描述 投票:1回答:3

我需要打印十六进制,十进制在我的控制台。我用下面的代码来做到这一点。

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;

但我正在逐渐以十六进制格式两个值。如何重置字符串流?

c++ stringstream
3个回答
2
投票

如何重置字符串流?

格式标志粘。

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

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;

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;

这两种方法都需要创建一个流是,不幸的是,不是真快,由于几个主要的强制性同步(主要是为创建std::locale成员)。


0
投票

只要使用

std::nouppercase

ss << std::uppercase;    
...

ss << std::nouppercase;

...
© www.soinside.com 2019 - 2024. All rights reserved.