代码之家  ›  专栏  ›  技术社区  ›  CodingWithoutComments

如何清除Stringstream变量?

  •  431
  • CodingWithoutComments  · 技术社区  · 16 年前

    我已经试过几次了,

    std::stringstream m;
    m.empty();
    m.clear();
    

    这两个都不起作用。

    8 回复  |  直到 6 年前
        1
  •  693
  •   BartoszKP    9 年前

    对于所有标准库类型,成员函数 empty() 是一个查询,而不是一个命令,即它的意思是“你是空的吗?”不是“请扔掉你的东西”。

    这个 clear() 成员函数继承自 ios 并用于清除流的错误状态,例如,如果文件流的错误状态设置为 eofbit (文件结束),然后调用 清除() 将错误状态设置回 goodbit (没有错误)。

    用于清除 stringstream ,使用:

    m.str("");
    

    是正确的,尽管使用:

    m.str(std::string());
    

    技术上更有效,因为您避免调用 std::string 接受的构造函数 const char* . 但是现在的任何编译器都应该能够在这两种情况下生成相同的代码——所以我只使用更具可读性的代码。

        2
  •  39
  •   Nikos Athanasiou    11 年前

    您可以清除错误状态并在一行中清空strignstream

    std::stringstream().swap(m); // swap m with a default constructed stringstream
    

    这有效地将m重置为默认构造状态

        3
  •  33
  •   CodingWithoutComments    16 年前
    m.str("");
    

    似乎起作用了。

        4
  •  32
  •   NullUserException Mark Roddy    12 年前

    无论编译器如何,这都应该是最可靠的方法:

    m=std::stringstream();
    
        5
  •  11
  •   Azeem Rob Hyndman    7 年前

    我一直在审视它:

    {
        std::stringstream ss;
        ss << "what";
    }
    
    {
        std::stringstream ss;
        ss << "the";
    }
    
    {
        std::stringstream ss;
        ss << "heck";
    }
    
        6
  •  8
  •   Denis Reichelt    6 年前

    我的2分钱:

    在xcode和dev-c++中,这似乎对我有用,我有一个菜单形式的程序,如果按照用户的请求迭代执行,它将填充一个stringstream变量,该变量在代码第一次运行时可以正常工作,但下次用户运行相同代码时不会清除stringstream。但是下面的两行代码在填充字符串变量之前,每次最后都会清除stringstream变量。(2小时的试错和谷歌搜索),顺便说一句,单独使用每一行不会有什么效果。

    //clear the stringstream variable
    
    sstm.str("");
    sstm.clear();
    
    //fill up the streamstream variable
    sstm << "crap" << "morecrap";
    
        7
  •  0
  •   Alcino Dall Igna Junior    10 年前

    这是一个概念问题。

    Stringstream是一个流,因此其迭代器是向前的,无法返回。在输出字符串流中,需要使用flush()重新初始化它,就像在任何其他输出流中一样。

        8
  •  -7
  •   John    12 年前

    这些不会丢弃GNU C++中的STRIGSTATH流中的数据。

        m.str("");
        m.str() = "";
        m.str(std::string());
    

    以下内容确实为我清空了Stringstream:

        m.str().clear();