stringstream.read()是否使用流?

时间:2013-11-15 22:38:33

标签: c++ stringstream

我无法从文档中了解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!"

3 个答案:

答案 0 :(得分:5)

成员std::istream::read()使流返回的字符数增加。我想,这就是“消耗流”的意思。从ss读取6个字符后,下一个字符将是w

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

  

basic_string<charT,traits,Allocator> str() const;

     

返回:basic_string对象,其内容等于basic_stringbuf基础字符序列。 ...

该段落继续描述底层字符序列是什么,但它相当于:输入模式下的整个原始字符串和原始字符以及输出模式中的其他书写字符。

答案 1 :(得分:1)

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

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

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

答案 2 :(得分:-1)

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

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