C++ Primer 第八章学习笔记
第八章 IO库
istream ——输入流类型
ostream —— 输出流类型
cin —— 一个istream对象,从标准输入读取数据
cout —— 一个ostream对象,向标准输出写入数据
cerr —— 一个ostream对象,将程序错误写入到标准错误
8.1 IO 类
一些用于IO类的头文件
iostream —— 定义了用于读写流的基本类型 (istream , ostream , iostream)
fstream —— 定义了读写命名文件的类型,(ifstream , ofstream, fstream)
sstream —— 定义了读写内存string对象的类型(istringstream, ostringstream,
iostringstream)
O类型间的关系——继承
以下标准库特性适用于普通流,文件流和string流,以及char或宽字符流
8.1.1 IO对象无拷贝或赋值
不能拷贝或对IO对象赋值
由于不能拷贝IO对象,因此不能将形参或返回类型设置为流类型
进行IO操作的函数常以引用方式传递和返回
8.1.2 条件状态
IO库条件状态 |
---|
strm::badbit —— 流已崩溃 |
strm::failbit —— 一个IO操作失败 |
strm::eofbit —— 流到达了文件结束 |
strm::goodbit —— 指出流未处于错误状态,此值保证为0 |
s.eof()—— 若流s的eofbit置位,则返回true |
s.fail()—— 若流s的failbit或者badbit置位,则返回true |
s.bad()—— 若流s的badbit置位,则返回true |
s.good()—— 若流s的goodbit置位,则返回true |
s.clear()—— 将流s中所有条件状态复位,将流的状态设置为有效,返回void |
s.clear(falgs)—— 根据给定的flags标志位,将流s中对应条件状态位复位。flags类型为strm::iostate.返回void |
s.setstate(falgs)—— 置位,返回void |
s.rdstate()—— 返回流s的当前条件状态,返回值类型为strm::iostate |
流一旦发生错误,其后的IO操作都会失败
确定一个流对象的状态——将他当做一个条件使用:
while(cin >> word)
//ok:读操作成功....
查询流状态
灵活运用上述表格中内容中的eof、bad、fail和good四个状态量
管理条件状态
灵活运用表格中的clear、setstate和rdstate
8.1.3 管理输出缓冲
每个输出流都管理一个缓冲区,用来保存程序读写的数据
缓存刷新原因:1.main函数结束;2.缓存区满; 3.endl显式刷新 4.写cerr; 5.一个输出流可能被关联到另一个流,(读cin或写cerr都会导致cout缓存区刷新)。
显示刷新输出缓冲区的方法: endl ,flush和ends
endl —— 输出换行,然后刷新缓冲区
flush —— 刷新缓冲区,不输出任何字符
ends —— 输出一个空字符,然后刷新缓冲区
每次输出操作后都刷新缓冲区:unitbuf ,nounitbuf(重置流)
cout << unitbuf; //所有输出操作后都会立即刷新缓冲区
cout << nounitbuf; //回到正常缓冲方式
关联输入和输出流 tie() 和 tie (*ostream)
tie() ——返回指向输出流的指针
x.tie(&o) —— 将流x关联到输出流0
8.2 文件输入输出
fstream特有操作
文件输入输出类继承自iostream类,可以使用iostream类的操作外,还具有自己的特性:
fstream特有操作 |
---|
fstream fstrm;—— 创立一个未绑定的文件流 |
fstream fstrm(s);—— 创立一个fstream,并打开名为s的文件 |
fstream fstrm(s,mode); —— 与前一个函数类似,但按指定mode打开文件 |
fstrm.open(s) —— 打开名为s的文件,并将文件与fstrm绑定 |
fstrm.close()—— 关闭与fstrm绑定的文件 |
fstrm.is_open()—— 返回一个bool值,指出与fstrm关联的文件是否成功打开且尚未关闭 |
8.2.1 使用文件流对象
用fstream代替iostream&
由于fstream继承自iostream,因此当函数中形参为iostream&时,可以将fstream对象传递给该函数
成员函数open和close
如果定义了一个空文件流对象,可以随后调用open来将它与文件关联起来
ifstream in(ifile);
ofstream out;
out.open(ifile+".copy")
因为调用open可能失败,失败后failbit会被置位,所以最好检测open是否成功
if (out)
对一个已经打开的文件流调用open会失败。为了将文件流关联到另一个文件,首先必须关闭已经关联的文件。
自动构造和析构
当一个fstream对象被销毁时,close会自动被调用。
8.2.2 文件模式
文件模式 |
---|
in —— 以读方式打开 |
out —— 以写方式打开 |
app —— 每次写操作前均定位到文件末尾 |
ate —— 打开文件后立即定位到文件末尾 |
trunc—— 截断文件 |
binary —— 以二进制方式进行IO |
模式限制:
- 只有当out被设定时才能设定trunc
- 只要trunc没有被设定,就可以设定app
- 由于默认情况下,out模式打开的文件也会被截断,为了保留以out模式打开的文件内容,必须同时指定app模式,或者in模式。
每次调用open时都会确定文件模式
8.3 string 流
stringstream特有操作 |
---|
sstream strm;—— 创立一个未绑定的stringstream对象 |
sstream strm(s);—— 创立一个sstream对象,保存string s的一个拷贝 |
strm.str() —— 返回strm所保存的string的拷贝 |
strm.str(s) —— 将string s 拷贝到strm中,返回void |
8.3.1 使用istringstream
8.3.2 使用ostringstream
不太理解,需要重新再看看