我已经尝试了好几种方法,

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

这两种方法都行不通。


当前回答

还有许多其他“有效”的答案,但它们通常会进行不必要的复制或重新分配内存。

交换流意味着您需要丢弃其中一个流,从而浪费内存分配。分配一个默认构造的流也是一样, 在字符串缓冲区中为字符串赋值(通过stringstream::str或stringbuf::str)可能会丢失字符串已经分配的缓冲区。

清除字符串流的规范方法是:

void clear(std::stringstream &stream)
{
   if (stream.rdbuf()) stream.rdbuf()->pubseekpos(0);
}

获取流缓冲区中数据大小的规范方法是:

std::size_t availSize() (const std::stringstream& stream)
{
   if (stream.rdbuf())
      return std::size_t(
         stream.rdbuf()->pubseekoff(0, std::ios_base::cur, std::ios_base::out));
   else
      return 0;
}

将数据从流复制到其他一些预先分配的缓冲区,然后将其清除的规范方法是:

std::size_t readAndClear(std::stringstream &stream, void* outBuf, std::size_t outSize)
{
   auto const copySize = std::min(availSize(stream), outSize);
   if (!copySize) return 0; // takes care of null stream.rdbuf()

   stream.rdbuf()->sgetn(outBuf, copySize);
   stream.rdbuf()->pubseekpos(0); // clear the buffer

   return copySize;
}

我希望这是一个规范的答案。语言律师,欢迎加入。

其他回答

我的观点是:

this seemed to work for me in xcode and dev-c++, I had a program in the form of a menu that if executed iteratively as per the request of a user will fill up a stringstream variable which would work ok the first time the code would run but would not clear the stringstream the next time the user will run the same code. but the two lines of code below finally cleared up the stringstream variable everytime before filling up the string variable. (2 hours of trial and error and google searches), btw, using each line on their own would not do the trick.

//clear the stringstream variable

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

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

这应该是最可靠的方式,不管编译器:

m=std::stringstream();

还有许多其他“有效”的答案,但它们通常会进行不必要的复制或重新分配内存。

交换流意味着您需要丢弃其中一个流,从而浪费内存分配。分配一个默认构造的流也是一样, 在字符串缓冲区中为字符串赋值(通过stringstream::str或stringbuf::str)可能会丢失字符串已经分配的缓冲区。

清除字符串流的规范方法是:

void clear(std::stringstream &stream)
{
   if (stream.rdbuf()) stream.rdbuf()->pubseekpos(0);
}

获取流缓冲区中数据大小的规范方法是:

std::size_t availSize() (const std::stringstream& stream)
{
   if (stream.rdbuf())
      return std::size_t(
         stream.rdbuf()->pubseekoff(0, std::ios_base::cur, std::ios_base::out));
   else
      return 0;
}

将数据从流复制到其他一些预先分配的缓冲区,然后将其清除的规范方法是:

std::size_t readAndClear(std::stringstream &stream, void* outBuf, std::size_t outSize)
{
   auto const copySize = std::min(availSize(stream), outSize);
   if (!copySize) return 0; // takes care of null stream.rdbuf()

   stream.rdbuf()->sgetn(outBuf, copySize);
   stream.rdbuf()->pubseekpos(0); // clear the buffer

   return copySize;
}

我希望这是一个规范的答案。语言律师,欢迎加入。

这是一个概念问题。

Stringstream是一个流,所以它的迭代器是向前的,不能返回。在输出stringstream中,需要flush()来重新初始化它,就像在任何其他输出流中一样。

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

clear()成员函数继承自ios,用于清除流的错误状态,例如,如果一个文件流的错误状态设置为eofbit(文件结束),那么调用clear()将错误状态设置为goodbit(无错误)。

要清除stringstream的内容,使用:

m.str("");

是正确的,尽管使用:

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

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