第八章 IO库

前面章节已经在用的IO库设施

  • istream:输入流类型,提供输入操作。
  • ostream:输出流类型,提供输出操作
  • cin:一个istream对象,从标准输入读取数据。
  • cout:一个ostream对象,向标准输出写入数据。
  • cerr:一个ostream对象,向标准错误写入消息。
  • »运算符:用来从一个istream对象中读取输入数据。
  • «运算符:用来向一个ostream对象中写入输出数据。
  • getline函数:从一个给定的istream对象中读取一行数据,存入到一个给定的string对象中。

8.1 IO类

标准库定义的IO类型

  • iostream头文件:从标准流中读写数据,istreamostream等。
  • fstream头文件:从文件中读写数据,ifstreamofstream等。
  • sstream头文件:从内存string中读写数据,istringstreamostringstream

IO对象不可复制或赋值

  • 不能拷贝或赋值IO对象,因此形参和返回类型也不能是流类型,一般是流的引用
  • 读写一个IO对象会改变其状态,因此引用不能是const的。

条件状态

状态解释
strm:iostate是一种机器无关的类型,提供了表达条件状态的完整功能
strm:badbit用来指出流已经崩溃(不可恢复的读写错误,此时流无法使用)
strm:failbit用来指出一个IO操作失败了(可恢复的错误)
strm:eofbit用来指出流到达了文件结束
strm:goodbit用来指出流未处于错误状态,此值保证为零
s.eof()若流seofbit置位,则返回true
s.fail()若流sfailbit置位或badbit置位,则返回true
s.bad()若流sbadbit置位,则返回true
s.good()若流s处于有效状态,则返回true
s.clear()将流s中所有条件状态位复位,将流的状态设置成有效,返回void
s.clear(flags)将流s中指定的条件状态位复位(覆盖原始流状态),返回void
s.setstate(flags)根据给定的标志位,将流s中对应的条件状态位置位(叠加原始流状态),返回void
s.rdstate()返回流s的当前条件状态,返回值类型为strm::iostate
  • 其中strm是一种IO类型比如istreams是一个流对象。
  • 到达文件结束位置,eofbit和failbit都会置位
  • 如果badbit、failbit、eofbit任何一个被置位,检测流状态的条件都会失败
  • 检查流的状态:while(cin >> word); // cin>>word 表达式返回流的状态
  • 设置某个标志位:cin.clear(cin.rdstate() & ~cin.failbit); // 将failbit复位

管理输出缓冲

  • 每个输出流都管理一个缓冲区,输出可能立即打印或是暂存在缓冲区中
  • IO操纵符(显式刷新缓冲区):
    • endl:输出一个换行符并刷新缓冲区。
    • flush:刷新流,单不添加任何字符。
    • ends:在缓冲区插入空字符null,然后刷新。
    • unitbuf:告诉流接下来每次操作之后都要进行一次flush操作,默认情况对cerr是设置unitbuf的
    • nounitbuf:重置流,回到正常的缓冲方式
  • 程序异常终止时,输出缓冲区不会被刷新
  • 关联输入和输出流
    • 当一个输入流关联到一个输出流,每次从该输入流读取数据前都会先刷新关联的输出流。
    • 标准库将cout和cin关联在一起
    • 输入流的成员函数tie,(无参数时)可以返回关联的输出流的指针,(有参数时)可以设定关联到某个输出流
    • 每个输入流同时最多关联一个输出流,但是多个输入流可以同时关联同一个输出流

8.2 文件输入输出

  • 头文件fstream定义了三个类型来支持文件IO:
    • ifstream从一个给定文件读取数据。
    • ofstream向一个给定文件写入数据。
    • fstream可以读写给定文件。
  • 当要读写一个文件时,创建一个文件流对象并将之绑定到该文件。

fstream特有的操作

操作解释
fstream fstrm;创建一个未绑定的文件流。
fstream fstrm(s);创建一个文件流,并打开名为s的文件,s可以是string也可以是char指针,自动调用open
fstream fstrm(s, mode);与前一个构造函数类似,但按指定mode打开文件
fstrm.open(s)打开名为s的文件,并和fstrm绑定;如果 open 失败,failebit 会被置位
fstrm.close()关闭和fstrm绑定的文件,注意close并不会重置流的条件状态,需要使用clear重置。当一个 fstream 对象被销毁时,close 函数会自动被调用。
fstrm.is_open()返回一个bool值,指出与fstrm关联的文件是否成功打开且尚未关闭

文件模式

文件模式解释
in的方式打开,与ifstream对象关联的文件默认以in模式打开
out的方式打开,与ofstream对象关联的文件默认以out模式打开
app每次写操作前均定位到文件末尾。设置了trunc就不能再设置app模式;在app模式下,即使没有设定out模式,文件也是以输出方式打开
ate打开文件后立即定位到文件末尾
trunc截断文件,只有设置了 out 才能设置trunc模式,只设置out模式会默认也设置trunc模式
binary以二进制方式进行IO操作。
  • 与fstream对象关联的文件默认以in和out模式打开
  • 默认情况下以 out 模式打开文件会使文件内容被清空,如果要保留文件内容
    • 需要同时指定app模式:数据追加到末尾
    • 或是同时指定in模式:同时进行读写操作

8.3 string流

  • 头文件sstream定义了三个类型来支持读写string:
    • istringstreamstring读取数据。
    • ostringstreamstring写入数据。
    • stringstream可以读写给定string

stringstream特有的操作

操作解释
sstream strm定义一个未绑定的stringstream对象
sstream strm(s)s初始化对象
strm.str()返回strm所保存的string的拷贝
strm.str(s)s拷贝到strm中,返回void
  • 上表中sstream是头文件sstream中任意一个类型。s是一个string
  • 使用例子