如何清除stringstream变量?


486

我已经尝试了几件事,

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

两者都不起作用。

Answers:


771

对于所有标准库类型,成员函数empty()都是查询,而不是命令,即表示“您是空的吗?” 而不是“请扔掉您的内容”。

所述clear()成员函数从继承ios并且被用于清除流,例如的错误状态,如果一个文件流具有错误状态设定到eofbit(结束文件),则调用clear()将设置错误状态返回goodbit(无差错) 。

要清除的内容stringstream,请使用:

m.str("");

是正确的,尽管使用:

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

从技术上讲效率更高,因为可以避免调用take的std::string构造函数const char*。但是,如今,任何一种编译器在两种情况下都应该能够生成相同的代码-因此,我将只使用可读性更高的代码。


105
当您忘记“ clear()”部分时,将发生以下情况。stackoverflow.com/q/2848087/635549
galath 2012年

8
@KshitijBanerjee我认为在C ++中,m.str()和m.str(“”)是两个不同的函数。m.str()调用一个不需要任何参数的函数,而m.str(“”)将调用一个接受const char *参数的函数。m.str()可能已实现为返回字符串的get函数,而m.str(“”)可能已实现为set函数。
Dinesh PR

4
正如galath所说,添加m.clear()也很重要。除了m.str(“”);。否则,如果在某个时候用空字符串填充字符串流,可能会遇到问题。
Sputnik

1
@anthropod是的,那是去年。从那以后我就开始工作了。
詹姆斯

1
哦,男孩是这个直觉。就像关于C ++的其他一切一样!
阳光明媚的月亮,

47

您可以清除错误状态并清空一行字符串流

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

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


3
与此处的所有其他答案相比,这是最有效,最优雅的方法。但是,std :: stringstream :: swap是c ++ 11的功能,该解决方案不适用于以前的c ++ 11编译器。
101010 2014年

4
功能在GNU仍下落不明的g ++ V4.8,看到stackoverflow.com/questions/24429441/...
约阿希姆·w ^

7
@ 101010:交换比移动分配更好吗?
Deduplicator 2015年

2
@AsetD:即使没有例外,您是否忘记了默认构造的临时文件?
Deduplicator

3
这是低效的。当我想重新使用原始SS时。它为我交换了一个空位。
张张


33

无论使用哪种编译器,这都应该是最可靠的方法:

m=std::stringstream();

2
我认为这更好,因为m.str(“”); 无论我尝试什么,都会导致我的字符串流被那个空值卡住。但是使用这个我没有这样的问题
gelatine1

3
我遇到了同样的问题,因为我mm.clear(); mm.str("");做到了。(没有C ++ 11,否则交换会更好)。
hochl

1
@hochl:为什么swap比移动分配更好?
Deduplicator

4
这并不适合所有情况。每次都会重新分配缓冲区,而mm.str(“”)不会。
Shital Shah

3
我冲洗字符串流对象的主要用例是保持一个线程本地字符串流对象在周围,以防止不必要地实例化字符串流-实例化一个新的字符串流对象会复制全局语言环境对象-从理论上讲这是快速的,并且只涉及增加一个原子,但是在我处理的并发级别上,它经常处于瘫痪状态。
Spacemoose

12

我一直在确定范围:

{
    std::stringstream ss;
    ss << "what";
}

{
    std::stringstream ss;
    ss << "the";
}

{
    std::stringstream ss;
    ss << "heck";
}

这比清除stringstream?
Robur_131

11

我的2美分:

这似乎在xcode和dev-c ++中对我有用,我有一个菜单形式的程序,如果按照用户的要求迭代执行,它将填充一个stringstream变量,该变量在第一次执行该代码时就可以正常工作运行,但下次用户将运行相同的代码时不会清除字符串流。但是下面的两行代码最终每次都会在填充字符串变量之前清除stringstream变量。(2小时的反复试验和Google搜索),顺便说一句,单独使用每一行都无法解决问题。

//clear the stringstream variable

sstm.str("");
sstm.clear();

//fill up the streamstream variable
sstm << "crap" << "morecrap";


-11

这些不会在gnu c ++中丢弃stringstream中的数据

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

以下确实为我清空了字符串流:

    m.str().clear();

7
我不确定这是否会奏效,因为同样的原因,bernhardrusch不会奏效。.str()函数返回一个副本,清除该副本不会执行任何操作。
Verdagon

1
此解决方案不适用于Microsoft Visual C ++。
扎克2014年

不正确 Clear将对流返回的字符串进行操作,而不是对流本身进行操作。
乔伊·卡森
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.