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

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

这两种方法都行不通。


当前回答

这是一个概念问题。

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

其他回答

这是一个概念问题。

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

m.str("");

似乎有用。

我一直在定义它的范围:

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

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

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

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

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;
}

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