重置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;
,但我以十六进制格式获得了这两个值。如何重置弦乐?
如何重置弦乐?
格式标志很粘。
您可以保存旧格式标志以稍后再恢复:
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;
...
相关文章:
- 如何在openssl-ecc中获取十六进制格式的私钥
- 将"打开的CV图像"中的"颜色"转换为整数格式
- TDateTime格式在C++Builder中不会更改
- 如何防止clang格式在流运算符调用之间添加换行符<<
- 检查不带转换的扫描格式
- 当我尝试使用 sstream 和分面将 Boost Time_duration转换为字符串时,我没有得到所需的格式
- 是否可以从格式字符串中检索"width"
- 如何将用户定义的格式标志"add" basic_ostream?
- 揭开所有格式标志
- printf 的浮点格式标志 (%f) 仅适用于英文数字格式
- printf 格式说明符标志'0' %p,正确与否?
- 警告:'0'标志与'%p' gnu_printf格式一起使用
- 重置std :: stringstream格式标志
- 清洁格式标志检查的方法
- 为什么 fcntl() 标志值以八进制格式定义,以及此函数如何用于阻塞/非阻塞套接字?
- 在 libav格式中设置"re"标志
- 如何在 c++ 中设置标志的格式
- wstringstream默认格式标志
- 在g++中添加-M标志会导致文件格式不可识别错误
- C++还原流格式标志