stringstream.read() 是否消耗流

Does stringstream.read() consume the stream?

本文关键字:是否 read stringstream      更新时间:2023-10-16

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

成员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基础字符序列。

该段落继续描述基础字符序列是什么,但它相当于:输入模式下的整个原始字符串和输出模式下的原始字符加上其他写入字符。

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

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

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

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