[C++] 字符串和流

来源:互联网 发布:mac下载的文件在哪里 编辑:程序博客网 时间:2024/05/21 10:54

[C++] 字符串和流

 

第一节、字符串操作

一、char_traits 字符特征类
1)意义:包装特定串元素的通用行为界面,以便容器实现时依据特征信息而执行特定行为
2)定义了通用类型名

typedef _Elem char_type;
typedef int int_type;
typedef streampos pos_type;
typedef streamoff off_type;
typedef mbstate_t state_type;

其中 int_type 表示字符元素转换到特定编码时的整型表示,pos_type, off_type 分别作为字符串索引和字符串元素偏移的类型,类似容器迭中的指针,迭代类型和指针,迭代器的偏移类型。最后的 state_type 用于存储流状态,如出错,格式控制等等。

3)定义了字符 / 字符串操作的包装界面,以便通用算法的调用

assign(a, b) 定义将 b 字符赋值给 a 字符的过程,实现 a.operator = 的行为
eq(a, b) 定义 a 字符和 b 字符的相等关系,实现 a.operator == 的行为
lt(a, b) 定义 a 小于 b 的关系,实现 a.operator < 的行为
compare(a_ptr, b_ptr, cnt) 定义两组字符串的比较,返回 int 类型,实现类似 memcmp 的行为
length(ptr) 定义取字符串长度,实现类似 strlen 的行为
copy(a_ptr, b_ptr, cnt) 定义两组字符串的复制,实现类似 memcpy 的行为
move(a_ptr, b_ptr, cnt) 定义两组字符串的不重叠复制,实现类似 memmove 的行为
assign(ptr, cnt, ch) 定义了填充字符串的过程,实现类似 memset 的行为
to_int_type(ch) 定义了 char_type 到 int_type 整型的转换过程
to_char_type(n) 定义了 int_type 到 char_type 字符型的转换过程
eq_int_type(a, b) 定义两个和当前 char_type 类型对应的 int_type 的相等关系
eof() 定义字符串结尾符,使用整型表示
not_eof(n) 定义非字符串结尾符,若输入结尾符,则返回 1,其他输入返回原值,即总是不返回 eof()

4)int_type 类型应是当前字符类型的整型编码

二、std::string 并不是序列容器,没有 front() 和 back() 界面用于取出前端和尾端的元素,使用 std::string::operator [] 并传递 streampos 类型取得特定元素,如 std::string::size() - 1 作为索引取得最后一个字符

三、basic_string 支持的初始化
1)默认初始化
2)分配器
3)复制构造
4)局部复制 [_Roff, _Roff + _Count)
5)局部复制 + 分配器
6)C 字符串 [_Ptr, <null>)
7)C 字符串 + _Count [_Ptr, _Ptr + _Count)
8)C 字符串 + 分配器
9)C 字符串 + _Count + 分配器 [_Ptr, _Ptr + _Count)
10)_Count * _Ch
11)_Count * _Ch + 分配器
12)迭代器 [_ItF, _ItL)
13)迭代器 + 分配器

字符到串不能初始化,但支持 operator = 赋值和 operator += 累加赋值运算。

四、字符串的区间有效性
对串的索引访问在超过字符串的有效区间时,因为串的在实现上对内置的字符缓冲区执行下标访问,所以不会导致异常,但是将得到不可预知的结果,通常是不可用的。
将其他字符串作为右值输入时,对该串取出计数大于串大小时按串大小计算。
std::basic_string::size_type 的实际类型为 size_t,在 Visual C++ 7.1 中实现为 unsigned,std::basic_string::npos 被静态设定为

(basic_string<_Elem, _Traits, _Alloc>::size_type)(-1);

在查找子字符串等操作时,函数返回 npos 的值表示非法索引。

五、比较字符串
允许的比较对象
1)compare(s2) 其他同类型字符串
2)compare(p) C 风格字符串
3)compare(off, cnt, s2) [off, off + cnt) 同 s2 执行比较
4)compare(off, cnt, s2, off2, cnt2) [off, off + cnt) 同 s2 [off2, cnt2) 执行比较
5)compare(off, cnt, p) [off, off + cnt) 同 [p , <null>) 执行比较
6)compare(off, cnt, p, cnt2) [off, off + cnt) 同 [p, p + cnt2) 执行比较

返回 -1, 0, 1 作为小于、等于和大于的比较结果。

六、附加数据
1)使用 operator += 接受其他字符串,C 风格字符串和字符
2)使用 push_back() 在尾部附加字符,并使得通过字符串构造的 back_iterator 可以访问
3)append() 附加
        1、append(s) 追加字符串
        2、append(s, off, cnt) 追加字符串 s [off, off + cnt)
        3、append(p) 追加字符串 [p, <null>)
        4、append(p, cnt) 追加字符串 [p, p + cnt)
        5、append(n, c) 填充 n * c
        6、append(InF, InL) 追加输入流 [InF, InL)

4)insert() 插入
        1、insert(off, s2) 插入字符串
        2、insert(off, s2, off2, cnt2) 插入字符串 s [off2, off2 + cnt2)
        3、insert(off, p) 插入字符串 [p, <null>)
        4、insert(off, p, cnt) 插入字符串 [p, p + cnt)
        5、insert(off, n, c) 插入 n * c
        6、insert(iter) 元素默认值填充
        7、insert(iter, c) 插入特定元素
        8、insert(iter, n, c) 插入 n*c
        9、insert(iter, InF, InL) 插入 [InF, InL)

5)operator +(a, b)
字符串关联运算符重载中支持 operator + 的形式
        1、s + s
        2、s + p
        3、s + c
        4、p + s
        5、c + s

七、查找、替换和清除
1)find() 查找
        1、find(c, off) 在 s [off, npos) 中查找 c
        2、find(p, off, n) 在 s [off, npos) 中查找 [p, p + n)
        3、find(p, off) 在 s [off, npos) 中查找 [p, <null>)
        4、find(s2, off) 在 s [off, npos) 中查找 s2

2)find() 的变种
        1、rfind() 具有 find() 的输入形式,反序查找
        2、find_first_of() 具有 find() 的输入形式,返回第一个匹配的索引
        3、find_last_of() 具有 find() 的输入形式,返回倒数第一个匹配的索引
        4、find_first_not_of() 具有 find() 的输入形式,返回第一个不匹配的索引
        5、find_last_not_of() 具有 find() 的输入形式,返回倒数第一个不匹配的索引

3)replace() 替换
        1、replace(off, cnt, s2) 将 s [off, off + cnt) 替换成 s2
        2、replace(off, cnt, s2, off2, cnt2) 将 s [off, off + cnt) 替换成 s2 [off2, off2 + cnt2)
        3、replace(off, cnt, p) 将 s [off, off + cnt) 替换成 [p, <null>)
        4、replace(off, cnt, p, cnt2) 将 s [off, off + cnt) 替换成 [p, p + cnt2)
        5、replace(off, cnt, n, c) 将 s [off, off + cnt) 替换成 c * n

使用迭代器的情况:
        6、replace(InF, InL, s2) 将 [InF, InL) 替换成 s2
        7、replace(InF, InL, p) 将 [InF, InL) 替换成 [p, <null>)
        8、replace(InF, InL, p, cnt) 将 [InF, InL) 替换成 [p, p + cnt)
        9、replace(InF, InL, n, c) 将 [InF, InL) 替换成 n * c
        10、replace(InF, InL, InF2, InL2) 将 [InF, InL) 替换成 [InF2, InL2)

4)erase() 删除
        1、erase(off, cnt) 从字符串 s 中删除 s [off, off + cnt)
        2、erase(iter) 从字符串 s 中删除 *iter
        3、erase(ItF, ItL) 从字符串 s 中删除 [ItF, ItL)

八、取出字符串
1)取得 C 风格字符串
c_str() 返回常量类型的 C 风格字符串指针,copy(ptr, cnt, off = 0) 则将指定大小的字符串复制到特定指针。data() 在 Visual C++ 7.1 中仅仅调用了 c_str() 实现。

2)取得子字符串
substr(off, cnt) 取得 s [off, off + cnt) 的副本。

3)复制子字符串
copy(p, off, cnt) 将 s [off, off + cnt) 复制到 p。

九、字符串的缓冲区管理
字符串具有类似 std::vector 的缓冲区管理界面。

size() 取得有效元素长度
max_size() 取得当前内存分配器能分配的有效空间
reserve() 为缓冲区预留空间
capacity() 取得缓冲区的容量
resize() 重设串的长度,可以为其指定初始化值

十、定义输入迭代器的尾端
向 istream_iterator 传递输入流对象以创建输入迭代器,输入迭代器持有输入流对象的指针,默认创建和读取流失败的情况下该指针被设置为 0。并且在实现输入迭代器间的 operator == 相等运算时,进行持有的流对象指针的相等比较,这样,默认创建的输入迭代器将被用于匹配输入流的结束。

* 当输入流读取失败,用户执行 if, while 条件判断时,实际上先将判断值转换成 void* 类型,或者根据 operator ! 运算符的返回结果,对输入流重载 operator void* 和 operator ! 运算符,可以定义输入流在布尔表达式中的行为,使得当流读取失败的情况下,输入迭代器可以通过布尔表达式来确认,而不是显式访问 fail() 成员函数:

void _Getval()
        {       // get a _Ty value if possible
        if (_Myistr != 0 && !(*_Myistr >> _Myval))
                _Myistr = 0;
        }

上式的 std::basic_istream::operator >> 将返回 std::basic_istream& 类型,该类型又具有如下的运算符重载:

operator void *() const
        {       // test if any stream operation has failed
        return (fail() ? 0 : (void *)this);
        }

bool operator!() const
        {       // test if no stream operation has failed
        return (fail());
        }

十一、C 风格字符串
1)字符串操作
strcpy(p, p1) 复制字符串
strncpy(p, p1, n) 复制指定长度字符串
strcat(p, p1) 附加字符串
strncat(p, p1, n) 附加指定长度字符串
strlen(p) 取字符串长度
strcmp(p, p1) 比较字符串
strncmp(p, p1, n) 比较指定长度字符串
strchr(p, c) 在字符串中查找指定字符
strrchr(p, c) 在字符串中反向查找
strstr(p, p1) 查找字符串
strpbrk(p, p1) 以目标字符串的所有字符作为集合,在当前字符串查找该集合的任一元素
strspn(p, p1) 以目标字符串的所有字符作为集合,在当前字符串查找不属于该集合的任一元素的偏移
strcspn(p, p1) 以目标字符串的所有字符作为集合,在当前字符串查找属于该集合的任一元素的偏移

* 具有指定长度的字符串处理函数在已处理的字符串之后填补零结尾符

2)字符串到数值类型的转换
strtod(p, ppend) 从字符串 p 中转换 double 类型数值,并将后续的字符串指针存储到 ppend 指向的 char* 类型存储。
strtol(p, ppend, base) 从字符串 p 中转换 long 类型整型数值,base 显式设置转换的整型进制,设置为 0 以根据特定格式判断所用进制,0x, 0X 前缀以解释为十六进制格式整型,0 前缀以解释为八进制格式整型
atoi(p) 字符串转换到 int 整型
atof(p) 字符串转换到 double 符点数
atol(p) 字符串转换到 long 整型

3)文本转换成 long 类型超出表示范围时将设置 C 运行时的 errno 全局变量,errno == ERANGE,使用 strerror(errno) 来取得错误对应的字符串

4)字符检查
isalpha() 检查是否为字母字符
isupper() 检查是否为大写字母字符
islower() 检查是否为小写字母字符
isdigit() 检查是否为数字
isxdigit() 检查是否为十六进制数字表示的有效字符
isspace() 检查是否为空格类型字符
iscntrl() 检查是否为控制字符
ispunct() 检查是否为标点符号
isalnum() 检查是否为字母和数字
isprint() 检查是否是可打印字符
isgraph() 检查是否是图形字符,等效于 isalnum() | ispunct()

第二节、输入输出流

一、输出流

 

 

二、各种类型流输出 operator << 重载
输出流不仅接受可显示的数据类型,同时接受操纵符影响输出流的行为并返回输出流的引用,以便使用 operator << 串接一组的操作。
以下列出一些特定的输出类型及其用法和实现概要。

1)为单个字符的输出直接调用 put() 而不必使用 operator <<
2)为操纵符重载 operator <<
std::hex 是输出流的操纵符之一,被实现为接受基本流类型引用,并更改其状态为输出十六进制的函数:

inline ios_base& __cdecl hex(ios_base& _Iosbase)
        {       // set basefield to hex
        _Iosbase.setf(ios_base::hex, ios_base::basefield);
        return (_Iosbase);
        }

输出流的一个重载版本将代为访问该操纵符:

_Myt& operator<<(ios_base& (__cdecl *_Pfn)(ios_base&))
        {       // call ios_base manipulator
        (*_Pfn)(*(ios_base *)this);
        return (*this);
        }

最后,当前输出流对象的引用被返回,以串接其他 operator << 操作,通过操纵符的应用,将可以得到类似以下的访问形式:

std::cout << std::setw(10) << std::internal << std::hex << std::uppercase << std::showbase << std::setfill('0') << int(768 * 1024) << std::endl;
3)std::boolalpha 操纵符指示输出流使用符号形式表示真假
4)对于指针类型,输出十六进制以表示地址格式,并且即使使用 std::showbase 以指示输出流输出进制的前缀及其他试图影响指针类型数据的输出格式的操纵符,该指针的地址格式不会发生变化

int* p = std::auto_ptr<int>(new int).get();
std::cout << p << std::endl;

三、输入流的分割
operator >> 按空白类型——即 isspace() 对应的字符类型:blank, vertical table, horizontal table, return, newline, newpage 等——分割输入流。当然,对于具有格式要求的输入类型,则在未匹配处中止。
1)std::cin >> intval;
int 类型读入非预期的数据,设置 ios_base::failbit 到流状态。std::cin.rdstate() & std::ios_base::failbit 以获取该状态。

2)std::cin.width(n);
显式指示字符串读入的数据长度,以防止目标存储的溢出,包括为目标存储自动添加的 '/0',若传递给std::string 等标准库字符串类型则不包含尾端的 '/0' 空字符,传递到其他类型不受该宽度的限制,且仅影响下一次的输入操作。

四、流状态
1)意义:调用者通过对状态的访问,以了解流的操作结果和存在的异常
good() 测试 goodbit
eof() 测试 eofbit
fail() 测试 badbit | failbit
bad() 测试 badbit
rdstate() 取得流状态
clear([flag]) 清除 / 设置流状态
setstate(flag) 附加流状态

2)异常的流导致下次读取将失效

五、测试流对象的布尔值
bool operator !() 否定式。
operator void *() 作条件式判断,编译器强制转型到 void*,此时可以返回 0 以表示 false。

六、非格式化输入
int_type get() 从输入流取出 int_type 类型数据,对应单个特定类型编码字符
get(c) 取出字符类型数据
get(p, n) 取得 n 长度的字符串到 p,按换行符分割
get(p, n, delim) 取出 n 长度的字符串到 p,指定分割符
ignore(n, delim) 忽略 n 长度的字符串,指定分割符
read(p, n) 读入 n 个字符
gcount() 获得最后一次非格式化输入的取出字符长度

get(p, n, delim) 并不取出 delim 本身,这和 getline 是不同的,用户在需要的情况下必须手动附加到目标串。另外,连续出现的分隔符将导致取出空字串,ios_base::failbit 被附加到流状态,这将导致对 get() 的条件判断失败。

七、流异常
ios_base::exceptions() 获取异常掩码
ios_base::exceptions(iostate) 设置异常掩码
ios_base::failure 流的异常类

附加到异常掩码的状态位将使得流遭遇特定状态时抛出 ios_base::failure 异常。

八、流联结
basic_ios::tie() 取出和输入流联结的输出流指针
basic_ios::tie(basic_ostream&) 设置和输入流联结的输出流指针

* 和输入流联结的输出流总是在输入流请求输入前刷新输出流状态,使用 basic_ostream::flush(),在文件流中表现为立即写入到磁盘文件。

九、sentry
1)意义:sentry 是输入输出流对象的一组自动对象,使用其构造函数和析构函数,负责在流操作中执行预处理和后处理,例如,为流缓冲区附加线程锁

2)sentry 对象类型执行条件判断时,隐式转换到 bool 类型,指针类型则转换到 void* 类型。重载 sentry::operator bool(),以便从 sentry 返回流的可用状态,以便指导流的实际动作,如线程冲突可能导致流不可用,sentry 必须提供该类信息

第三节、输出流格式

一、ios_base 格式设置
        flags() 读标志位
        flags(fmt) 设置标志位
        setf(fmt) 附加标志位
        setf(fmt, mask) 根据掩码附加标志位
        unsetf(mask) 清除掩码位置的标志

* setf(fmt) 和 setf(fmt, mask) 有一个重要的区别,对于位于同一个掩码值以下的所有位,在具有掩码输入的情况下将被事先清除,这将保证在该掩码值以下的标志位的设定具有互斥的特性,而 setf(fmt) 将可能在同一个掩码值下的所有位出现多个置位的选项。

二、控制输出流格式位的操纵符
用于控制输出流格式的操纵符大部分位于 <ios> 文件以下。它们可以被附加到 basic_ostream::operator <<() 后端并影响对应的输出流。
1)对齐格式 adjustfield
        right 右侧对齐,默认设置
        left 左侧对齐
        internal 内部对齐

2)基数 basefield
        dec 十进制,默认设置
        hex 十六进制
        oct 八进制

4)符点 floatfield
        scientific 科学计数法
        fixed 定点数

3)输出
        showbase / noshowbase 显示进制修饰前缀
        showpoint / noshowpoint 总是打印尾部的小数位,包括为 0 的情况,默认 noshowpoint
        boolalpha / noboolalpha 使用字符串打印布尔值,默认 noboolalpha
        showpos / noshowpos 打印符号,包括正数的情况,默认 noshowpos
        skipws / noskipws 跳过空白字符处,默认 noskipws
        uppercase / nouppercase 十六进制用数字字符为大写格式,默认 nouppercase

5)掩码
        ios_base::adjustfield = ios_base::right | ios_base::left | ios_base::internal
        ios_base::basefield = ios_base::dec | ios_base::hex | ios_base::oct
        ios_base::floatfield = ios_base::scientific | ios_base::fixed

* 掩码中使用的标志位命名和操纵符可能同名,但不是指同一符号。

三、使用 skipws 使输入流忽略空白
通过忽略输入流的空白字符,帮助有效获取数值等类型而避免失败。

std::cin >> std::noskipws;
std::cin.exceptions(cin.failbit);
std::cin >> intval;

若对以上例程输入包含起始处空格的字符串,则抛出异常,空白字符不是有效的数值格式字符。

四、浮点输出
        ios_base::precision() 获取浮点数精度,默认为 6
        ios_base::precision(n) 设置精度

* 对于默认的 float 输出,精度影响所有有效位,对于 fixed 精度将影响小数位,对于科学表示法 scientific,精度影响底数小数位。

* 当默认表达形式整数位大于精度范围,或第一个非零数位于小数点后精度位以上,使用科学表示法。

五、设置输出流的宽度
1)使用 ios_base 的成员函数 width()
width() 获取输出流的输出宽度,当不能完整表示整数或带小数位的实数,则至少扩展到合理表达的宽度,包含有效的精度位,默认情况下返回 0,即没有限制宽度。
width(n) 设置输出流的输出宽度,仅影响下一次的输出。例如,我们准备输出 32bit 的十六进制数,包含 "0x" 前缀,总共需要 10 个位数的输出,使用 ios_base::width(10) 来设置输出宽度,并设置空缺位的填充字符为 '0',使用 basic_ios::fill('0'),为输出流传递操纵符 internal 按内部对齐方式将使基数修饰前缀和数值分别对齐到限制宽度区域的两侧,中间使用 '0' 字符填充。

2)使用操纵符 setw(n)
类似的操纵符还有控制浮点输出精度的 setprecision(n)。

六、操纵符 manipulator
1)操纵符的实现
重载流的 operator << 或者 operator >> 运算符,使之接受特定类型的非成员 / 静态成员函数,并代为访问该函数,称为流的操纵符。函数将实现为使用流的引用来访问流的成员函数和数据。以下是一个可用于操纵符的函数:

inline ios_base& __cdecl right(ios_base& _Iosbase)
        {       // set right in adjustfield
        _Iosbase.setf(ios_base::right, ios_base::adjustfield);
        return (_Iosbase);
        }

2)带参数的操纵符
普通的操纵符仅仅接受函数指针来实现 operator << 中的访问权转发。为了使获得转发的访问权的函数可能传递特定的参数,仅仅传递函数指针是行不通的,必须实现一类操纵符专用的类型模板以持有函数指针和参数,接受一个参数的操纵符函数将实例化一个携带函数指针和参数的对象,并重载使用该对象的 operator << 或者 operator >> 运算符。

一个带参数的操纵符:

_Smanip<streamsize> __cdecl setw(streamsize wide)
        {       // manipulator to set width
        return (_Smanip<streamsize>(&swfun, wide));
        }

为该操纵符重载流的输入输出运算符:

template<class _Elem, class _Traits, class _Arg> inline
        basic_istream<_Elem, _Traits>& __cdecl operator>>(
                basic_istream<_Elem, _Traits>& _Istr, const _Smanip<_Arg>& _Manip)
        {       // extract by calling function with input stream and argument
        (*_Manip._Pfun)(_Istr, _Manip._Manarg);
        return (_Istr);
        }

3)标准库中涉及一个参数的操纵符
        resetiosflags(f) 清除指定格式标志位
        setiosflags(f) 设置指定格式标志位
        setbase(n) 设置整数的基数
        setfill(c) 设置填充字符
        setprecision(n) 设置精度
        setw(n) 设置宽度

第四节、文件流和字符串流

一、流的层次结构简图

 

 

1)iostream 是同时具有读写能力的流,分别通过访问写缓冲区和读缓冲区完成
2)is_open() 检查文件流是否已打开
3)ios_base::ate 和 ios_base::app 文件流打开标志的区别
ate 仅在第一次读入时位于文件尾。
app 总是向尾部追加数据。
附带 _Nocreate 避免每次打开时均重新创建,并要求指定文件已打开。

二、使用全局计数器以确认当前初始化状态,对于需要确认其创建优先顺序的对象构造使用计数

三、字符串流 stringstream
stringstream 不依赖于文件和输入输出,以附加的 string 作为基点操作文本流,或者返回 string 类型。
iostream 是 stringstream 的基类,提供了丰富的格式控制、进制控制、浮点控制等操作,这些操作的实现是基于流技术的。通过字符串流附加字符串,执行一系列操作后再返回字符串,可以更灵活地,且相对 C 风格的字符串缓存操作更安全地实现字符格式化处理。

四、缓冲区
不同的流使用内存或者外设的形式是不同的,并且对于同一类流对象,允许更改缓冲区的实现也是很有帮助的。因此,缓冲区被实现为独立的 streambuf 类型,抽象了访问内存和外设的实际动作。
1)流缓冲区封装对象实现了分别指向输出流缓冲区和输入流缓冲区的两组指针,可以分别控制输出和输入
在输出流的基类中,ostream 使用成员函数 seekp() 来移动放置字符的位置,即 "seek put position"。

seekp(pos_type) 定位输出缓冲到指定位置
seekp(off_type, ios_base::seekdir) 根据偏移量和方向来定位输出缓冲的位置

* ios_base::seekdir 可传递三种取值:

static const _Seekdir beg = (_Seekdir)0;
static const _Seekdir cur = (_Seekdir)1;
static const _Seekdir end = (_Seekdir)2;

seekp() 在内部调用 streambuf 的 pubseekpos(_Pos, ios_base::out) 成员函数。
与之对应,seekg() 作为 istream 的成员函数,更改输入流的索引指针,在内部调用 streambuf 的 pubseekpos(_Pos, ios_base::in) 成员函数。

2)每个流对象均关联特定的流缓冲指针
3)流的索引指针定位操作,仅在该流关联的操作设备进行定位操作有意义时被使用,例如输出流可能被实现为每写入一次数据,数据将被立即刷新到标准输出,而不在缓冲区停留,在此类缓冲区上操作流的索引指针是没有意义的,并引发指向了无效元素位的 ios_base::failbit 异常
4)输入流操作

seekg(pos_type)
seekg(off_type, ios_base::seekdir)

putback(c) 将指定字符返回给输入流缓冲的当前位置,失败时设置 ios_base::badbit 异常
unget() 返回上次从输入流读取的字符,失败时设置 ios_base::badbit 异常
peek() 获取输入流的一个字符,且不从输入流移除
sync() 同步输入设备和输入流缓冲
5)ios 和缓冲区的基本交互

rdbuf() 取出和设置关联缓冲区
imbue() 浸染缓冲区的本地化现场
narrow(c, char_c) 使用当前本地化,将当前字符编码转换到 char 类型
widen(char) 使用当前本地化,从 char 类型转换到当前字符编码

对于后两项,最常见的应用情况之一是对宽字符集的换行和零尾的宽度处理,例如,仅使用 '/0' 明文字符串,使用 widen() 成员函数,方便地将常见的 ASCII 字符转换到当前本地化的编码。

五、缓冲区的模型

 

 

1)输入流缓冲区界面
egptr() 输入流缓冲区尾端
gptr() 当前元素索引
eback() 输入流缓冲区的前端
gbump(n) 改变缓冲区的元素索引
setg(beg, cur, end) 设置输入流缓冲区指向存储指针

2)输出流缓冲区界面
pbase() 输出流缓冲区的前端
pptr() 当前元素索引
epptr() 输出流缓冲区尾端
pbump(n) 改变缓冲区的元素索引
setp(beg, end) 设置输出流缓冲区指向存储指针

六、和 C 风格 IO 的同步
ios_base::sync_with_stdio(bool) 设置 C 和 C++ 库同步常规输入输出设备的使用,并可能因此损失部分性能。

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

原创粉丝点击