调用`stringstream :: str()`来获取真正合法的内容吗?

时间:2017-04-11 09:35:55

标签: c++ string iostream stringstream

前期历史记录:我正在尝试确保某些函数foo(std::stringstream&)使用流中的所有数据。

previous question的答案表明,使用stringstream::str()是获取字符串流内容的正确方法。我也看到它用于将任意类型转换为string,如下所示:

std::stringstream sstr;
sstr << 10;
assert(sstr.str() == std::string("10"));  // Conversion to std::string for clarity.

然而,“内容”的概念有些模糊。例如,请考虑以下代码段:

#include <assert.h>
#include <sstream>
#include <iostream>

int main() {
  std::stringstream s;
  s << "10 20";
  int x;
  s >> x;
  std::cout << s.str() << "\n";
  return 0;
}

On Ideone(以及我的系统)此代码段打印10 20,这意味着从stringstream读取不会修改str()返回的内容。所以,我的假设是str()返回一些内部缓冲区,它最多可以stringstream(或者,可能是其内部rdbuf,默认情况下为stringbuf来处理“该缓冲区中的当前位置”。这是一个known thing

查看stringbuf::overflow()函数(如果空间不足则重新分配缓冲区),我可以看到:

  

这可能会修改输入和输出受控序列的指针(最多为eback,gptr,egptr,pbase,pptr,epptr的六个)。

所以,基本上,没有理论保证写入stringstream不会分配更大的缓冲区。因此,即使使用stringstream::str()int转换为string也存在缺陷:我的第一个代码段中的assert(sstr.str() == std::string("10"))可能会失败,因为内部缓冲区不能保证精确到必要的大小

问题:获取stringstream的“内容”的正确方法是什么,其中“内容”被定义为“可以从鲷鱼消耗的所有字符”?

当然,人们可以阅读char-by-char,但我希望找到一个不那么详细的解决方案。我对从stringstream(我的第一个片段)中读取的内容感兴趣,因为我从未看到它失败。

1 个答案:

答案 0 :(得分:0)

您可以使用(def prop-sorted-first-less-than-last (prop/for-all [v (gen/not-empty (gen/vector gen/int))] (let [s (sort v)] (< (first s) (last s))))) (tc/quick-check 100 prop-sorted-first-less-than-last) ;; => {:result false, :failing-size 0, :num-tests 1, :fail [[3]], :shrunk {:total-nodes-visited 5, :depth 2, :result false, :smallest [[0]]}} 函数(继承自UPDATE px set px.FX_RATE_INVRS = isnull(EX.currencyrate,0) from #TMP_GT_PROCESSED_JDI_TST px left join ExchangeRate EX on EX.basecurrencycode = px.currency )来查找当前输入位置。如果返回-1,则不再使用其他字符。否则,您可以使用<div *ngIf="(todaysdate | date:'MMM dd' == duedate | date:'MMM dd')"> List </div> 返回tellg()中未使用的字符。