重置 std::stringstream 格式标志
Resetting std::stringstream format flags
我需要在我的控制台中打印十六进制和十进制值。我使用了下面的代码来做到这一点。
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;
但是我得到的是十六进制格式的两个值。如何重置字符串流?
How to reset 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;
假设您知道实际使用了哪个格式化标志,您可以只保存它们的原始值并在以后恢复它们。当要更改的格式化标志集很大并且可能有点不受函数控制时,基本上有两种方法,不幸的是,这两种方法都不是很便宜:
不要直接使用 std::stringstream
而是使用应用了格式标志的临时流:
{
std::ostream out(ss.rdbuf());
out << std::showbase << std::uppercase << std::hex << 15;
}
ss << 15;
您可以使用 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;
...
我需要在我的控制台中打印十六进制和十进制值。我使用了下面的代码来做到这一点。
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;
但是我得到的是十六进制格式的两个值。如何重置字符串流?
How to reset 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;
假设您知道实际使用了哪个格式化标志,您可以只保存它们的原始值并在以后恢复它们。当要更改的格式化标志集很大并且可能有点不受函数控制时,基本上有两种方法,不幸的是,这两种方法都不是很便宜:
不要直接使用
std::stringstream
而是使用应用了格式标志的临时流:{ std::ostream out(ss.rdbuf()); out << std::showbase << std::uppercase << std::hex << 15; } ss << 15;
您可以使用
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;
...