【问题标题】:Does stringstream.read() consume the stream?stringstream.read() 是否消耗流?
【发布时间】:2013-11-15 22:38:32
【问题描述】:

我无法从文档中看出std::stringstream.read() 的工作原理。它是否消耗流?

换句话说:

std::stringstream ss;
char buffer[6];

ss << "Hello world!";
ss.read(buffer, 6);

std::cout << ss.str(); // Is this "Hello world!" or just "world!"

【问题讨论】:

  • 可以试试这个,对吧?
  • 触摸@KerrekSB。但还有更多要理解的。无论流位置如何,str() 函数都会返回底层缓冲区,而随后对 read() 的调用将继续推进流(参见下面的答案)。测试我的示例代码给了我一个错误的印象。

标签: c++ stringstream


【解决方案1】:

成员std::istream::read() 将流位置向前移动它返回的字符数。我想,这就是“消费流”的意思。从ss 读取6 个字符后,下一个读取的字符将是w

但是,字符串流的内部缓冲区仍然是整个字符串,即str() 的结果不受读取位置的影响:std::stringstream::str() 返回所有字符。在 27.8.2.3 [stringbuf.members] 第 1 段中它说:

basic_string&lt;charT,traits,Allocator&gt; str() const;

返回:一个basic_string 对象,其内容等于basic_stringbuf 底层字符序列。 ...

该段继续描述底层字符序列是什么,但它相当于:输入模式下的整个原始字符串和输出模式下的原始字符加上额外的书面字符。

【讨论】:

  • 你确定吗?我刚刚在compileonline.com/compile_cpp0x_online.php 上尝试了我的 sn-p 并得到“Hello world!”这似乎表明流位置没有提前。除非我什么都不懂。
  • @chowey:请阅读整个答案,而不仅仅是第一段:阅读位置将被推进,但str() 仍将返回整个字符串。关于确定:上面的引用来自 C++ 标准(ISO/IEC 14882-2011)。如果实现有偏差,则不符合标准。
  • 谢谢,我现在正在跟踪。
【解决方案2】:

是的,它消耗流。
但是 str() 函数在缓冲区中返回完整的字符串。
您可以使用 ss.rdbuf()->in_avail() 来获取 read/>操作后可用的数据大小:

ss << "Hello world!";
ss.read(buffer, 6);

std::cout << ss.rdbuf()->in_avail(); // 6 characters available ("world!").

【讨论】:

    【解决方案3】:

    read 是一个未格式化的输入函数;它从内部缓冲区中提取指定数量的字符到您提供的字节数组中。在这种情况下,它将缓冲区中的 6 个字符提取到 buffer 中。所以buffer的内容就是"Hello "

    write 则相反。 write 将从提供的字节数组中插入指定数量的字符到输出流的内部缓冲区中。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2018-03-16
      • 2012-10-27
      • 2020-09-06
      • 1970-01-01
      • 2021-10-15
      • 2012-05-07
      • 2015-12-06
      • 1970-01-01
      相关资源
      最近更新 更多