【问题标题】:How to clear all sticky manipulators on (string)stream?如何清除(字符串)流上的所有粘性操纵器?
【发布时间】:2015-09-18 09:32:14
【问题描述】:

我正在以通常的方式清除std::stringstream

std::ostringstream ss;
for(...; ...; ...) {
    ... // Use ss.
    if(some_condition_to_reset_stringstream) {
        ss.str(std::string());
        ss.clear();
    }
    ... // Use ss some more.
}

不幸的是,这不会清除任何粘性操纵器(std::hexstd::setfill 等)。

有没有办法重置整个std::stringstream,包括任何 IO 操纵器?还是我必须单独手动重置每个操纵器(希望在此过程中不要忘记任何一个)?

【问题讨论】:

  • 把字符串流扔掉,重新构造一个。
  • @MatteoItalia 字符串流在解析循环中使用,必须在某些迭代中重置,但不是全部。所以不幸的是,我不能每次都构建一个新的。
  • @zennehoy:您可以保存初始标志并通过std::ostringstream::flags 简单地重置它们。请注意,如果要还原所有更改,还必须保存 ::fill::width::precision

标签: c++ iostream iomanip


【解决方案1】:

显然在 C++11 中应该可以交换字符串流:

if(some_condition_to_reset_stringstream) {
    std::ostringstream().swap(ss);
}

不幸的是,我没有支持此功能的编译器 (g++ 4.8.2),因此我无法测试这是否会清除粘性操纵器(我不明白为什么它不应该,但一旦实现)。

仍在寻找替代方案,因为我的编译器不支持它:)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2018-07-07
    • 2010-09-06
    • 1970-01-01
    • 1970-01-01
    • 2015-12-05
    • 1970-01-01
    • 2011-06-05
    相关资源
    最近更新 更多