c++11 标准模板(STL)(std::basic_filebuf)(六)

定义于头文件 

template<

    class CharT,
    class Traits = std::char_traits

> class basic_filebuf : public std::basic_streambuf

std::basic_filebuf 是关联字符序列为文件的 std::basic_streambuf 。输入序列和输出序列都关联到同一文件,并为两种操作维护连接文件位置。

函数 underflow() 和 overflow()/sync() 进行文件和缓冲区的获取放置区之间的实际 I/O 。 CharT 不是 char 时,多数实现在文件存储多字节字符,并用 std::codecvt 平面进行宽/多字节字符转换。

亦为常用字符类型定义二个特化:

类型 定义
filebuf basic_filebuf
wfilebuf basic_filebuf


受保护成员函数

从关联文件读取,并令获取区的下一位置指针前进

std::basic_filebuf::uflow

protected:
virtual int_type uflow()

表现类似 underflow() ,除了若 underflow() 成功(不返回 Traits::eof() ),则令获取区的下一位置指针前进。换言之,消耗一个 underflow() 所获得的字符。

参数

(无)

返回值

成功情况下为读取并消耗的字符值,失败情况下为 Traits::eof() 。

回退输出序列以放回字符,不影响关联文件

std::basic_filebuf::pbackfail

protected:
virtual int_type pbackfail( int_type c = Traits::eof() )

 此受保护虚函数为公开函数 basic_streambuf::sungetc 和 basic_streambuf::sputbackc 所调用(继而为 basic_istream::unget 和 basic_istream::putback 所调用)。

1) 调用方请求将获取区后备一个字符(以无参数调用 pbackfail() ),该情况下,此函数于前一字节位置开始重读文件,并自减 basic_streambuf::gptr() ,例如通过调用 gbump(-1) 。

2) 调用方试图回放异于之前取得的字符(以需要放回的字符调用 pbackfail() ),该情况下

a) 首先检查是否有回放位置,若无则通过于前一字节位置开始重读文件,后备获取区。

a) 然后检查什么字符在回放位置。若其处保有的字符已等于 c ,以 Traits::eq(to_char_type(c), gptr()[-1]) 确定,则简单地自减 basic_streambuf::gptr() 。

b) 否则,若允许缓冲修改其自身的获取区,则自减 basic_streambuf::gptr() 并写入 c 到调整后的 gptr() 所指向的位置。

此函数决不修改文件,仅修改内存中缓冲区的获取区。

若文件未打开( is_open()==false ),则此函数立即返回 Traits::eof() 。

参数

c - 要放回的字符,或为指示请求后备缓冲区的 Traits::eof()

返回值

成功时为 c ,除非 c 为 Traits::eof() ,该情况下返回 Traits::not_eof(c) 。

失败时为 Traits::eof() 。

从放置区写字符到关联的文件

std::basic_filebuf::overflow

protected:
virtual int_type overflow ( int_type c = Traits::eof() );

从放置区写一些数据到关联字符序列(到文件)。

表现类似基类的 std::basic_streambuf::overflow ,除了要写入数据。首先用感染的 locale 的 std::codecvt::out 转换字符为外部(可能为多字节)表示,并存储于临时缓冲区中(分配所需大小),然后用文件 I/O 复制所有完全转换的字节到文件。

若 std::codecvt::always_noconv 为 true ,则可以跳过对 std::codecvt::out 的调用。

若转换因 std::codecvt_base::error 失败,则返回 Traits::eof() 而不尝试任何输出。

若未打开关联文件( is_open() == false ),则在做任何事前返回 Traits::eof() 。

参数

(无)

返回值

指示成功的 Traits::not_eof(c) 或指示失败的 Traits::eof() 。

你可能感兴趣的:(c++,标准库模板,basic_filebuf,关联字符序列为文件,受保护成员函数)