第八章 IO库
一、IO类
1. 标准库定义的IO类型
头文件 | 作用 | 类型 |
---|---|---|
iostream | 从标准流中读写数据 | istream, wistream 从流读取数据 ostream, wostream 向流写入数据 iostream, wiostream 读写流 |
fstream | 从文件中读写数据 | iftream, wiftream 从文件读取数据 oftream, woftream 向文件写入数据 fstream, wifstream 读写文件 |
sstream | 从字符串中读写数据 | istringstream, wistringstream 从string读取数据 ostringstream, wostringstream 向string写入数据 stringstream, wstringstream 读写string |
2. IO对象无拷贝或赋值
- IO对象不能存在容器里.
- 形参和返回类型也不能是流类型。
- 形参和返回类型一般是流的引用。
- 读写一个IO对象会改变其状态,因此传递和返回的引用不能是const的。
3. 条件状态
strm是一种IO类型(如istream), s是一个流对象。
状态 | 解释 |
---|---|
strm:iostate | 是一种机器无关的类型,提供了表达条件状态的完整功能 |
strm:badbit | 用来指出流已经崩溃 |
strm:failbit | 用来指出一个IO操作失败了 |
strm:eofbit | 用来指出流到达了文件结束 |
strm:goodbit | 用来指出流未处于错误状态,此值保证为零 |
s.eof() | 若流s的eofbit置位,则返回true |
s.fail() | 若流s的failbit置位,则返回true |
s.bad() | 若流s的badbit置位,则返回true |
s.good() | 若流s处于有效状态,则返回true |
s.clear() | 将流s中所有条件状态位复位,将流的状态设置成有效,返回void |
s.clear(flags) | 将流s中指定的条件状态位复位,返回void |
s.setstate(flags) | 根据给定的标志位,将流s中对应的条件状态位置位,返回void |
s.rdstate() | 返回流s的当前条件状态,返回值类型为strm::iostate |
4. 管理输出缓冲
- 每个输出流都管理一个缓冲区,执行输出的代码,文本串可能立即打印出来,也可能被操作系统保存在缓冲区内,随后再打印。
- 导致缓冲刷新(即数据真正写到输出设备或文件)的原因:
- 程序正常结束,作为main函数的return操作的一部分,缓存刷新被执行。
- 缓冲区满时,需要刷新缓冲,而后的数据才能继续写入缓冲区。
- 使用操纵符 endl, 来显式刷新缓冲区。
- 在每个输出操作之后,可以用操作符unitbuf设置流的内部状态,来清空缓冲区。默认情况下,对cerr是设置unitbuf的,因此写到cerr的内容都是立即刷新的。
- 一个输出流可能被关联到另一个流。
- 刷新缓冲区,可以使用如下IO操纵符:
- endl:输出一个换行符并刷新缓冲区。
- flush:刷新流,单不添加任何字符。
- ends:在缓冲区插入空字符null,然后刷新。
- unitbuf:告诉流接下来每次操作之后都要进行一次flush操作。
- nounitbuf:回到正常的缓冲方式。
二、文件输入输出
1. 文件输入输出
- 文件流:需要读写文件时,必须定义自己的文件流对象,并绑定在需要的文件上。
- fstream特有的操作:
操作 | 解释 |
---|---|
fstream fstrm; | 创建一个未绑定的文件流。 |
fstream fstrm(s); | 创建一个文件流,并打开名为s的文件,s可以是string也可以是char指针 |
fstream fstrm(s, mode); | 与前一个构造函数类似,但按指定mode打开文件 |
fstrm.open(s) | 打开名为s的文件,并和fstrm绑定 |
fstrm.close() | 关闭和fstrm绑定的文件 |
fstrm.is_open() | 返回一个bool值,指出与fstrm关联的文件是否成功打开且尚未关闭 |
本节练习
8.4 编写函数,以读模式打开一个文件,将其内容读入到一个string的vector中,将每一行作为一个独立的元素存入vector中。code
2. 文件模式
文件模式 | 解释 |
---|---|
in | 以读方式打开 |
out | 以写方式打开 |
app | 每次写操作前均定位到文件末尾 |
ate | 打开文件后立即定位到文件末尾 |
trunc | 截断文件 |
binary | 以二进制方式进行IO操作 |
三、string流
- 头文件sstream定义了三个类型来支持内存IO:
- istringstream从string读取数据。
- ostringstream向string写入数据。
- stringstream可以读写给定string。
操作 | 解释 |
---|---|
sstream strm | 定义一个未绑定的stringstream对象 |
sstream strm(s) | 用s初始化对象 |
strm.str() | 返回strm所保存的string的拷贝 |
strm.str(s) | 将s拷贝到strm中,返回void |