定义于头文件 <streambuf>
template< class CharT, |
类 basic_streambuf
控制字符序列的输入与输出。它包含下列内容并提供到它们的访问:
1) 受控制字符序列,又称为缓冲区,它可含有为输入操作缓冲的输入序列(又称为获取区),和/或为输出操作缓冲的输出序列(又称为放置区)。
2) 关联字符序列,又称作源(对于输入)或池(对于输出)。它可以是通过 OS API 访问的实体(文件、 TCP 接头、串行端口、其他字符设备),或者可以是能转译成字符源或池的对象( std::vector 、数组、字符串字面量)。
I/O 流对象 std::basic_istream 及 std::basic_ostream ,还有所有导出自它们的对象( std::ofstream 、 std::stringstream 等),都完全以 std::basic_streambuf 实现。
成员函数
获取区
获得获取区中立即可用的字符数
std::basic_streambuf<CharT,Traits>::in_avail
std::streamsize in_avail(); |
返回获取区中可用的字符数。若读位置可用,则等效地返回 egptr() - gptr() ,获取区的大小。此情况下,返回能从缓冲区释出而不调用 underflow() 的字节数。
若获取区为空,则调用 showmanyc() 确定关联字符序列中可用的字节数。此情况下,返回值是能从缓冲区释出,同时保证 underflow() 不会返回 Traits::eof
的字节数。
参数
(无)
返回值
非阻塞读取的可用字符数(从关联字符序列读取的获取区大小),或若只要 showmanyc() 能告知关联序列中无可用字符则为 -1 。
令输入序列前进,读取一个字符而不再次前进
std::basic_streambuf<CharT,Traits>::snextc
int_type snextc(); |
令输入序列前进一个字符,并读取一个字符。
函数调用 sbumpc() 令输入序列前进。若该函数返回表示已耗尽输入序列的 Traits::eof() ,且 uflow() 无法取得更多数据,则返回 Traits::eof() 。否则调用 sgetc() 以读取字符。
参数
(无)
返回值
下个字符的值。若已耗尽输入序列,则返回 Traits::eof() 。
从输入序列读取一个字符并令序列前进
std::basic_streambuf<CharT,Traits>::sbumpc
int_type sbumpc(); |
读取一个字符并令输入序列前进一个字符。
若输入序列读位置不可用,则返回 uflow() 。否则返回 Traits::to_int_type(*gptr()) 。
参数
(无)
返回值
获取指针所指向的字符的值,或若读位置不可用则为 Traits::eof() 。
令输入序列前进,如同通过调用 sbumpc() 并舍弃结果
stossc (C++98 中弃用)(C++17 中移除 |
从输入序列读取一个字符,而不令序列前进
std::basic_streambuf<CharT,Traits>::sgetc
int_type sgetc(); |
从输入序列读取一个字符。
若输入序列读位置不可用,则返回 underflow() 。否则返回 Traits::to_int_type(*gptr()) 。
参数
(无)
返回值
获得指针所指向的字符的值。
调用示例
#include <iostream>
#include <sstream>
int main()
{
std::stringstream stream("Hello, world");
std::cout << "sgetc() returned '" << (char)stream.rdbuf()->sgetc() << "'\n";
std::cout << "peek() returned '" << (char)stream.peek() << "'\n";
std::cout << "get() returned '" << (char)stream.get() << "'\n";
}
输出
调用 xsgetn()
std::basic_streambuf<CharT,Traits>::sgetn,
std::basic_streambuf<CharT,Traits>::xsgetn
std::streamsize sgetn( char_type* s, std::streamsize count ); | (1) | |
protected: | (2) |
1) 调用最终派生类的 xsgetn(s, count)
。
2) 从输入序列读取 count
个字符,并存储它们到 s
所指向的字符数组。如同用以连续调用 sbumpc() 读取字符。即若少于 count
个字符立即可用,则函数调用 uflow() 以提供更多字符,直至返回 Traits::eof() 。
容许派生自 std::basic_streambuf
的类提供此函数的更高效实现。
参数
s | - | 指向 char_type 数组起始的指针 |
count | - | 要写入的最大字符数 |
返回值
成功读取的字符数。若它小于 count
,则输入序列已抵达结尾。
注意
关于“更高效实现”的规则容许大量无中间缓冲的 I/O :这是一些 iostream 的实现中 std::ifstream::read 简单地传递指针给 POSIX read()
系统调用的原因。