C++ primer 标准IO库

来源:互联网 发布:简单的表单验证js代码 编辑:程序博客网 时间:2024/06/05 16:44

要同时支持不同类型不同大小的字节流,标准库使用继承来定义一组面向对象类。通过继承关联起来的类型共享共同的接口。当一个类继承另一个类的时候这两个类可以使用相同的操作。
父类叫做基类,继承而来的叫派生类。
IO类型在三个独立的头文件中定义:iostream定义读写控制窗口的类型,fstream定义读写已命名文件的类型,sstream定义用于读写存储在内存中的string对象。
在fsteam和sstream中定义的每种类型都是从iostream头文件中定义的相关类型派生而来的。
这里写图片描述
上图表示IO类的继承关系。

IO对象不可以赋值或者复制
标准库类型不允许复制或者赋值
只有支持复制的元素类型可以存储在vector或者其他容器中。
由于流对象不可以复制,不能存储在vector或者其他容器中。
形参或者返回类型也不可以是流类型。
一般情况下,如果要传递IO对象以便对他进行读写,可以用非const引用方式传递这个流对象。

IO 标准库管理一系列条件状态(condition state) 成员,用来标记给定的 IO 对象是否处于可用状态,或者碰到了哪种特定的错误
这里写图片描述这里写图片描述

流必须处于无错误状态才可以用于输入和输出
检查流的方法是检查其值
if ( cin)
while (cin>> word)
if语句直接检查流的状态,while语句检查表达式返回的流

所有流对象都包含一个条件状态成员,由setstate和clear操作。
每个IO类还定义了三个iostate类型的常量值。badbit,系统级故障,failbit,希望获得数值型缺输入字符型,eofbit,文件结束是设置
流的状态由bad ,fail ,eof ,good操作提示。

rdstate成员函数返回一个iostate类型值,该值对应于流当前的整个条件状态。
这里写图片描述

多种状态的处理
这里写图片描述
将对象is的badbit和failbit位同时打开

每一个IO对象管理一个缓冲区
下面几种情况将导致缓冲区的内容被刷新,即写入到真实的设备或者文件:
1,程序正常结束
2,缓冲区满了,在输入下一个值之前刷新
3,用操作符显式的刷新缓冲区
4,在每次输出操纵执行完毕后,用unitbuf操作符设置流的状态,从而清空缓冲区
5,将输入流和输出流连接起来,读输入流时刷新对应输出流

endl :输出一个换行符并刷新缓冲区
flush: 刷新流
ends:插入null空字符然后刷新它

如果程序崩溃了不会刷新缓冲区
输出时应多使用 endl 而非 ‘\n’。使用endl 则不必担心程序崩溃时输出是否悬而未决(即还留在缓冲区,未输出到设备中)

标准库将cin和cout绑在一起,可以保证任何输出,包括给用户的提示,都在试图读之前输出。
tie函数可以将istream和ostream对象关联起来,使用一个指向ostream的指针形参,一个ostream对象每次只可以和一个istream对象绑在一起。

文件的输入和输出
fstream类型除了继承下来的行为外,还定义了两个自己的新操作—open和close,以及形参为要打开的文件名的构造函数。
需要读写文件时,必须定义自己的对象,并将它们绑定在需要的文件上。
c_str是Borland封装的String类中的一个函数,它返回当前字符串的首字符地址。当需要打开一个由用户自己输入文件名的文件时,可以这样写:ifstream in(st.c_str())。
调用 open 成员函数将已存在的 fstream 对象与特定文件绑定
由于历史原因,IO标准库使用C风格字符串而不是C++ string类型的字符串作为文件名。通常将文件名读入string对象,调用c_str成员获取C风格字符串。

检查文件打开是否成功
类似于测试cin,测试流等效于检查对象是否适合输入或者输出。
这里写图片描述

将文件流和新文件重新捆绑
如果要把fstream对象和另一个不同的文件关联,则必须先关闭现在的文件,再打开另一个文件

文件模式
打开文件时,无论是open还是以文件名做为流初始化的一部分,都需要指定文件模式。
这里写图片描述
这里写图片描述
默认时,与ifstream流对象关联的文件以in打开,允许文件做读操作,和ofstream关联的文件以out模式打开,使文件可写。
以out模式打开的文件会被清空,丢弃该文件存储的所有数据。
对于用ofstream打开的文件,要保存文件中的数据,唯一的方法是显式地指定app模式打开。

对同一个文件作输入和输出运算
fstream即可以写也可以读。默认情况下,fstream对象以in 和 out 模式同时打开。同时以in和out打开时,不清空,如果以fstream所关联的文件,只使用了out模式,而不指定in,文件会清空已存在的数据。
模式是文件的属性而不是流的属性
只要调用 open 函数,就要设置文件模式,其模式的设置可以是显式的也可以是隐式的。
这里写图片描述

字符串流
sstream类型除了继承的操作外,还各自定义了一个有string形参的构造函数,将string类型的实参复制给stringstream对象。还定义了一个名为str的成员,用来读取设置stringstream对象所操作的string值
istringstream,ostringstream,stringstream三个字符串流
这里写图片描述

stringstream对象的一个常见用法是需要在多种数据之间实现自动格式化时使用该类型。
sstream 输入和输出操作可自动地把算术类型转化为相应的string 表示形式,反过来也可以。

原创粉丝点击