basic_stringbuf 类

描述对 Elem 类型的元素(其字符特征由类 Tr 确定)与数组对象中存储的元素序列之间的来回传输进行控制的流缓冲区。

语法

template <class Elem, class Tr = char_traits<Elem>,
    class Alloc = allocator<Elem>>
class basic_stringbuf : public basic_streambuf<Elem, Tr>

参数

Alloc
allocator 类。

Elem
字符串的基本元素的类型。

Tr
字符串的基本元素上专用的字符特征。

备注

对象根据需要进行分配、扩展和释放以适应序列中的更改。

类 basic_stringbuf<ElemTrAlloc> 的对象将来自其构造函数的 ios_base::openmode 参数的副本作为其 stringbuf 模式 mode 进行存储:

  • 如果 mode & ios_base::in 不是零,则输入缓冲区可以访问。 有关详细信息,请参阅 basic_streambuf 类

  • 如果 mode & ios_base::out 不是零,则输出缓冲区可以访问。

构造函数

构造函数 说明
basic_stringbuf 构造 basic_stringbuf 类型的对象。

Typedef

类型名称 说明
allocator_type 该类是模板参数 Alloc 的同义词。
char_type 将类型名与 Elem 模板参数关联。
int_type 使 basic_filebuf 范围中的此类型等效于 Tr 范围中具有相同名称的类型。
off_type 使 basic_filebuf 范围中的此类型等效于 Tr 范围中具有相同名称的类型。
pos_type 使 basic_filebuf 范围中的此类型等效于 Tr 范围中具有相同名称的类型。
traits_type 将类型名与 Tr 模板参数关联。

成员函数

成员函数 说明
overflow 将新字符插入到已满缓冲区时可以调用的受保护虚函数。
pbackfail 受保护虚拟成员函数尝试将元素放回到输入缓冲区中,随后使它成为当前元素(由下一个指针指向)。
seekoff 受保护虚拟成员函数尝试更改受控制流的当前位置。
seekpos 受保护虚拟成员函数尝试更改受控制流的当前位置。
str 设置或获取字符串缓冲区中的文本,而无需更改写入位置。
swap
underflow 从输入流中提取当前元素的受保护虚拟成员函数。

要求

标头:<sstream>

命名空间: std

basic_stringbuf::allocator_type

该类是模板参数 Alloc 的同义词。

typedef Alloc allocator_type;

basic_stringbuf::basic_stringbuf

构造 basic_stringbuf 类型的对象。

basic_stringbuf(
    ios_base::openmode _Mode = ios_base::in | ios_base::out);

basic_stringbuf(
    const basic_string<Elem, Tr, Alloc>& str,
    ios_base::openmode _Mode = ios_base::in | ios_base::out);

参数

_Mode
ios_base::openmode 中的枚举之一。

str
类型 basic_string 的对象。

备注

第一个构造函数将 null 指针存储在控制输入缓冲区和输出缓冲区的所有指针中。 有关详细信息,请参阅 basic_streambuf 类的备注部分。 它还将 _Mode 存储为 stringbuf 模式。 有关详细信息,请参阅 basic_stringbuf 类的备注部分。

第二个构造函数分配字符串对象 str 控制的序列副本。 如果 _Mode & ios_base::in 是非零值,则其将输入缓冲区设置为在序列的开头开始读取。 如果 _Mode & ios_base::out 是非零值,则其将输出缓冲区设置为在序列的开头开始写入。 它还将 _Mode 存储为 stringbuf 模式。 有关详细信息,请参阅 basic_stringbuf 类的备注部分。

basic_stringbuf::char_type

将类型名与 Elem 模板参数关联。

typedef Elem char_type;

basic_stringbuf::int_type

使 basic_filebuf 范围中的此类型等效于 Tr 范围中具有相同名称的类型。

typedef typename traits_type::int_type int_type;

basic_stringbuf::off_type

使 basic_filebuf 范围中的此类型等效于 Tr 范围中具有相同名称的类型。

typedef typename traits_type::off_type off_type;

basic_stringbuf::overflow

将新字符插入到已满缓冲区时可以调用的受保护虚函数。

virtual int_type overflow(int_type _Meta = traits_type::eof());

参数

_Meta
要插入到缓冲区的字符或 traits_type::eof

返回值

如果该函数不成功,它将返回 traits_type::eof。 否则,它将返回 traits_type::not_eof(_ Meta)。

备注

如果 _Meta 不等于 traits_type::eof,则受保护虚拟成员函数尝试将元素 traits_type::to_char_type(_Meta) 插入输出缓冲区。 它可以用多种方法执行此操作:

  • 如果写入位置可用,它可将元素存储到写入位置并增加输出缓冲区的下一个指针。

  • 它可以通过为输出缓冲区分配新的或额外的存储空间,提供写入位置。 以这种方式扩展输出缓冲区还会扩展任何关联的输入缓冲区。

basic_stringbuf::pbackfail

受保护虚拟成员函数尝试将元素放回输入缓冲区,随后使它成为当前元素(由下一个指针指向)。

virtual int_type pbackfail(int_type _Meta = traits_type::eof());

参数

_Meta
要插入到缓冲区的字符或 traits_type::eof

返回值

如果该函数不成功,它将返回 traits_type::eof。 否则,它将返回 traits_type::not_eof(_ Meta)。

备注

如果 _Meta 等于 traits_type::eof,那么要推送回的元素在当前元素之前实际上已是流中的一个元素了。 否则,则由 byte = traits_type::to_char_type(_ Meta) 替换该元素。 该函数可以用多种方法放回元素:

  • 如果放回的位置可用,且存储在该位置的元素等于 byte,它可以递减输入缓冲区中的下一个指针。

  • 如果放回的位置可用且 stringbuf 模式允许更改序列(mode & ios_base::out 是非零值),则该函数可以将 byte 存储到放回位置并递减输入缓冲区中的下一个指针。

basic_stringbuf::pos_type

使 basic_filebuf 范围中的此类型等效于 Tr 范围中具有相同名称的类型。

typedef typename traits_type::pos_type pos_type;

basic_stringbuf::seekoff

受保护虚拟成员函数尝试更改受控制流的当前位置。

virtual pos_type seekoff(
    off_type _Off,
    ios_base::seekdir _Way,
    ios_base::openmode _Mode = ios_base::in | ios_base::out);

参数

_Off
要搜寻的相对于 _Way 的位置。 有关详细信息,请参阅 basic_stringbuf::off_type

_Way
偏移操作的起点。 请参阅 ios_base::seekdir,查看可能的值。

_Mode
指定指针位置的模式。 默认允许修改读取和写入位置。 有关详细信息,请参阅 ios_base::openmode

返回值

返回新位置或无效的流位置。

备注

对于 basic_stringbuf<Elem, Tr, Alloc> 类的对象,流位置仅包含流偏移量。 如果偏移量为零,将指定受控序列的第一个元素。

确定新的位置,如下所示:

  • 如果 _Way == ios_base::beg,则新位置是流的开始位置加上 _Off

  • 如果 _Way == ios_base::cur,则新位置是当前流位置加上 _Off

  • 如果 _Way == ios_base::end,则新位置是流末尾位置加上 _Off

如果 _Mode & ios_base::in 是非零值,则函数更改下一个位置以在输入缓冲区中读取。 如果 _Mode & ios_base::out 是非零值,则函数更改下一个位置以在输出缓冲区中写入。 要使流受影响,其必须存在缓冲区。 若要成功执行定位操作,则结果流的位置必须位于受控序列内。 如果函数影响两个流位置,则 _Way 必须是 ios_base::begios_base::end,且将两个流定位在同一个元素中。 否则(或者如果两个位置均不受影响),定位操作失败。

如果此函数成功更改任何一个流位置或两个流位置,则返回结果流位置。 否则,如果失败将返回一个无效的流位置。

basic_stringbuf::seekpos

受保护虚拟成员函数尝试更改受控制流的当前位置。

virtual pos_type seekpos(pos_type _Sp, ios_base::openmode _Mode = ios_base::in | ios_base::out);

参数

_Sp
要搜寻的位置。

_Mode
指定指针位置的模式。 默认允许修改读取和写入位置。

返回值

如果此函数成功更改任何一个流位置或两个流位置,则返回结果流位置。 否则,如果失败将返回一个无效的流位置。 若要确定流位置是否有效,请比较返回值和 pos_type(off_type(-1))

注解

对于 basic_stringbuf<Elem, Tr, Alloc> 类的对象,流位置只包含流偏移量。 如果偏移量为零,将指定受控序列的第一个元素。 新的位置由 _ Sp 确定。

如果 mode & ios_base::in 是非零值,则函数更改下一个位置以在输入缓冲区中读取。 如果 mode & ios_base::out 是非零值,则函数更改下一个位置以在输出缓冲区中写入。 要使流受影响,其必须存在缓冲区。 若要成功执行定位操作,则结果流的位置必须位于受控序列内。 否则(或者如果两个位置均不受影响),定位操作失败。

basic_stringbuf::str

设置或获取字符串缓冲区中的文本,而无需更改写入位置。

basic_string<Elem, Tr, Alloc> str() const;
void str(
    const basic_string<Elem, Tr, Alloc>& _Newstr);

参数

_Newstr
新字符串。

返回值

返回 basic_string<Elem, Tr, Alloc > 类的对象,它的受控序列是 *this 控制的序列副本。

备注

第一个成员函数返回 basic_string<Elem, Tr, Alloc> 类的对象,其受控序列是 *this 控制的序列副本。 复制的序列取决于存储的 stringbuf 模式:

  • 如果 mode & ios_base::out 是非零值且存在输出缓冲区,则序列是整个输出缓冲区(以 pbase 开头的 epptr - pbase 元素)。

  • 如果 mode & ios_base::in 是非零值且存在输入缓冲区,则序列是整个输入缓冲区(以 eback 开头的 egptr - eback 元素)。

  • 否则,复制的序列为空。

第二个成员函数释放当前由 *this 控制的任何序列。 然后它分配由 _Newstr 控制的序列副本。 如果 mode & ios_base::in 是非零值,则其将输入缓冲区设置为在序列的开头开始读取。 如果 mode & ios_base::out 是非零值,则其将输出缓冲区设置为在序列的开头开始写入。

示例

// basic_stringbuf_str.cpp
// compile with: /EHsc
#include <iostream>
#include <sstream>

using namespace std;

int main( )
{
   basic_string<char> i( "test" );
   stringstream ss;

   ss.rdbuf( )->str( i );
   cout << ss.str( ) << endl;

   ss << "z";
   cout << ss.str( ) << endl;

   ss.rdbuf( )->str( "be" );
   cout << ss.str( ) << endl;
}
test
zest
be

basic_stringbuf::traits_type

将类型名与 Tr 模板参数关联。

typedef Tr traits_type;

注解

该类型是模板参数 Tr 的同义词。

basic_stringbuf::underflow

受保护虚函数从输入流中提取当前元素。

virtual int_type underflow();

返回值

如果该函数不成功,它将返回 traits_type::eof 否则,它返回输入流中的已转换的当前元素。

备注

受保护的虚拟成员函数尝试从输入缓冲区提取当前元素 byte,提出当前流位置,并返回元素作为 traits_type::to_int_type( byte)。 它可以一种方式进行此操作:如果读取位置可用,它采用 byte 作为存储在读取位置中的元素,并提出输入缓冲区的下一个指针。

basic_streambuf::swap

将此字符串缓冲区与另一个字符串缓冲区的内容交换。

void basic_stringbuf<T>::swap(basic_stringbuf& other)

参数

其他
其内容将与此 basic_stringbuf 交换的 basic_stringbuf 。

备注

basic_stringbuf::operator=

将运算符右侧的 basic_stringbuf 内容赋予左侧的 basic_stringbuf。

basic_stringbuf& basic_stringbuf:: operator=(const basic_stringbuf& other)

参数

其他
将 basic_stringbuf 中的内容(包括区域设置特征)赋予运算符左侧的 stringbuf。

备注

另请参阅

C++ 标准库中的线程安全
iostream 编程
iostreams 约定