C++不直接处理输入输出,而是通过定义在标准库中的类型来处理IO。
C++标准库处理输入输出的IO类
标准库含有的主要头文件有:
- iostream 处理控制台窗口的输入输出 包括cin/cout/getline;
- fstream 处理文件的输入输出;
- sstream 处理内存string的输入输出
fstream头文件里的ifstream和ofstream分别继承于iostream头文件里的istream和ostream;sstream里的istringstream和ostringtream分别继承于iostream头文件的istream和ostream;三者之间虽然处理的对象有些不一样,但标准库利用继承机制忽略这些不同类型之间的流之间的差异,但使用起来起来和cin/cout使用几乎是一样,因此迁移使用并没有什么困难。
值得强调的一点是:IO对象并没有拷贝和赋值;
IO对象的条件状态
- strm::iostate 与机器无关的类型
- strm::badbit 流是否崩溃;
- strm::goodbit 流位处于错误的状态;
- strm::failbit IO操作是否失败;
- strm::eofbit 流是否到达了文件结束;
- s.eof() 若流s的eofbit置位,则返回true;
- s.fail()
- s.bad()
- s.good()
- s.clear()将流的状态设置为有效位,返回void;
- s.rdstate()
上面的各种类型可以用来查询和管理输入输出流的状态
管理输出缓冲
缓冲的存在,可以使操作系统将多个输出操作组合成单一的设备写操作可以带来很大的性能提升;因此我们也要学着管理输出的缓冲
一般常见的缓冲区刷新方式有以下几种:
- 每个输出操作之后,操纵符unitbuf设置流的状态,清空缓冲区;
- 默认情况下,cin和cerr绑定cout,清除缓冲区;
- endl,ends,flush刷新缓冲区
文件输入输出
文件操作的基本命令:
- fstream fstrm 创建文件流;
- fstream fstrm(s,mode) 以指定mode模式打开,创建一个绑定文件s的文件流,mode存在默认情况;
- fstrm.open(s)
- fstrm.close()
- fstrm.is_open()
注意到,当fstream对象销毁时,close函数将会自动调用,也就是自动析构;
文件模式有以下几种:
- in 以读方式打开;
- out 以写方式打开;
- app每次写操作均定位到文件末尾;
- ate 打开文件立即定位到文件末尾;
- trunc 截断文件;
- binary 以二进制方式进行IO;
上述的几种模式之间,有些有冲突,使用之间应该进行约束;如
- 只可以对ofstream对象或fstream对象设定out模式;
- 只可以对ifstream对象或fstream对象设定in模式;
- out被设定时,才能进一步设置trunc;
- trunc没被设定,app才能随意设定;
string流输入输出
string流的输入和输出很像文件流的输入和输出;除了从iostream继承来的操作以外,还有下面几个特殊的操作:
- sstream strm;绑定对象;
- sstream strm(s);
- strm.str();返回strm保存的string;
- strm.str(s);将s拷贝到strm中,返回void;
总结
这三种类型的流对象虽然有所差异,但在文本处理的文件中,往往会涉及到其中的几种类型;以文本处理的程序为例:
- 以文件流方式绑定文件,以iostream里的getline读取文件一行;
- 利用istringstream绑定读取的string,然后进行分词;
- 最后按照要求进行处理;
以上;