c++11 标准模板(STL)(std::basic_streambuf)(七)

basic_streambuf是C++标准库中的一个模板类,用于控制字符的输入和输出,包括获取区和放置区的管理。sputc函数用于写入单个字符,而xsputn用于写入字符序列。当缓冲区满时,这些函数可能调用overflow处理。iostream类如std::basic_istream和std::basic_ostream都基于basic_streambuf实现。
摘要由CSDN通过智能技术生成
定义于头文件 <streambuf>
template<

    class CharT,
    class Traits = std::char_traits<CharT>

> class basic_streambuf;

 类 basic_streambuf 控制字符序列的输入与输出。它包含下列内容并提供到它们的访问:

1) 受控制字符序列,又称为缓冲区,它可含有为输入操作缓冲的输入序列(又称为获取区),和/或为输出操作缓冲的输出序列(又称为放置区)。

2) 关联字符序列,又称作(对于输入)或(对于输出)。它可以是通过 OS API 访问的实体(文件、 TCP 接头、串行端口、其他字符设备),或者可以是能转译成字符源或池的对象( std::vector 、数组、字符串字面量)。

I/O 流对象 std::basic_istream 及 std::basic_ostream ,还有所有导出自它们的对象( std::ofstream 、 std::stringstream 等),都完全以 std::basic_streambuf 实现。

成员函数

放置区

写一个字符到放置区域,并令 next 指针前进

std::basic_streambuf<CharT,Traits>::sputc

int_type sputc( char_type ch );

写一个字符到输出序列。

若输出序列写位置不可用(缓冲区满),则调用 overflow(ch) 。

参数

ch-要写入的字符

返回值

被写入的字符,成功时用 Traits::to_int_type(ch) 转换成 int_type

失败时为 Traits::eof() (为 overflow() 所返回)。

调用示例

#include <iostream>
#include <sstream>
 
int main()
{
    std::ostringstream s;
    s.rdbuf()->sputc('a');
    std::cout << s.str() << '\n';
}

调用 xsputn()

std::basic_streambuf<CharT,Traits>::sputn, 
std::basic_streambuf<CharT,Traits>::xsputn

std::streamsize sputn( const char_type* s, std::streamsize count );

(1)

protected:
virtual std::streamsize xsputn( const char_type* s, std::streamsize count );

(2)

 1) 调用最终导出类的 xsputn(s, count)

2) 从首元素为 s 所指向的数组写 count 个字符到输出序列。如同以重复调用 sputc() 写入字符。在写入 count 字符后或调用 sputc() 会返回 Traits::eof() 时写入停止。

若放置区变满( pptr() == epptr() ),则此函数可调用 overflow() ,或以其他未指定手段达成调用 overflow() 的效果。

参数

(无)

返回值

成功写入的字符数。

注意

“以未指定手段达成 overflow() 的效果”容许无中间缓冲的大量 I/O :这是一些 iostream 的实现中, std::ofstream::write 简单地传递指针给 POSIX write() 系统调用的缘由。

调用示例

#include <iostream>
#include <sstream>

int main()
{
    std::ostringstream s1;
    std::streamsize sz = s1.rdbuf()->sputn("This is a test", 14);
    s1 << '\n';
    std::cout << "The call to sputn() returned " << sz << '\n'
              << "The output sequence contains " << s1.str();

    std::istringstream s2;
    sz = s2.rdbuf()->sputn("This is a test", 14);
    std::cout << "The call to sputn() on an input stream returned " << sz << '\n';
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值