主要内容
- IO类
- 文件输入输出
- string流
C++语言不直接处理输入输出,而是通过一族定义在标准库中的类型来处理IO。设备可以是文件、控制台窗口、还有一些类型允许内存IO。
C++使用标准库来处理面向流的输入和输出:
1. iostream处理控制台IO
2. fstream处理命名文件IO
3. stringstream完成内存string的IO
fstream和stringstream都是继承自类iostream的。输入类都继承自istream,输出类都继承自ostream。因此可以在istream对象上执行的操作,也能在ifstream或istringstream对象上执行。继承自ostream的输出类也有类似情况。
每个IO对象都维护一组条件状态,用来指出对此对象上是否可以进行IO操作。如果遇到了错误,例如在输入流上遇到了文件末尾,则对象状态变为失效,所有后续输入操作都不能执行。
IO类
C++中三个头文件:iostream,fstream,sstream三个头文件分别定义了三种不同的读写流。
通过继承机制可以向使用istream对象来使用ifstream和istringstream对象。
IO对象无拷贝或赋值
不能拷贝或对IO对象赋值,同时IO对象的引用不能是const的。
条件状态
IO类定义了一些函数和标志,可以帮助我们访问和操纵流的条件状态
一旦一个流发生错误,骑上后续的IO操作都会失败,只有当一个刘处于无措状态是,我们才可以从他读取数据,想他写入数据。
例如在sstream中,如果重新向其中拷贝了string内容,上一个string的内容处理完了又没有清楚条件状态的话,会影响到的新的string的处理。
查询流的状态
O库定义了一个与机器无关的iostate类型,它提供了表达状态的完整功能。
IO库定义了4个iostate类型的constexpr值表示特定的为模式。
badbit表示系统及错误,不可霍夫的读写错误。流无法使用
failbit,发生可回复的错误,是可以修正的。
eofbit表示读取到了文件尾部
这三个任何一个被指为,检查流状态的条件都会失败。
good()操作在所有错误尾均未置位的情况下返回true。
管理条件状态
rdstate返回一个iostate值,对应流的当前状态。
setstate操作将为顶条件为职位,表示发生了对应错误。
clear是一个重载的成员,有一个不接受参数的版本,另一个版本接受一个iostate类型的参数。
带参数的复位对应位,保持别的位不变
管理输出缓冲
每个输出流都管理一个缓冲区,用来保存程序都写的数据,数据可能立即打印出来,也有可能保存在缓冲区中,随后再打印。
导致缓冲杀心的原因又:
1. 程序正常结束,main的return执行了
2. 缓冲区满
3. endl操纵符
4. 设置unitbuf来清空缓冲区
5. 一个输出流被关联到另一个流,当读写被关联的流是,关联到流的缓冲区会被刷新,例如cin和cerr都关联到了cout,因此都cin或些cerr都会导致cout的缓冲区被刷新。
刷新输出缓冲区
endl:执行换行并刷新缓冲区的内容
flush:刷新缓冲区但是不输出任何额外的字符
ends:向缓冲区插入一个空字符,然后刷新缓冲区。
unitbuf操纵符
使用unitbuf操纵符告诉流在接下来的每次写操作之后都进行一次flush操作,而nounitbuf操纵符则重置流,时期回复使用正常的系统管理的缓冲区刷新机制:
cout << unitbuf;
cout << nounitbuf;
如果程序崩溃,输出缓冲区不会被刷新。所以如果用于调试的代码中的输出在程序崩溃的时候有可能不会刷新,难以追踪问题。
关联输入和输出流
当一个输入流被关联到一个输出流石,任何试图从输入流读取数据的操作都会先刷新关联的输出流。
可以将输入或输出流关联到一个输出流上,一个输入流不能被关联。
使用tie成员函数可以进行关联,tie有两个重载的版本:
1. 一个不带参数的版本,返回指向输出流的指针。
2. 一个接收要给指向ostream的指针,将自己关联到次ostream。即x.tie(&o)将流x关联到输出流o。
文件输入输出
头文件fstream定义了三个类型来支持文件IO:
1. ifstream
2. ofstream
3. fstream可以读写给定文件
可以使用getline从ifstream读取数据,因为有继承机制。
fstream特有的操作:
1. open
2. close
3. is_open()
使用文件流对象
将对象与文件关联起来,可以使用open或者使用构造函数。
使用fstream代替iostream&
得益于继承机制
成员函数open和close
自动构造和析构
当一个fstream对象被销毁时,close会自动被调用
文件模式
- in
- out
- app
- ate
- trunc
- binary
每个文件流累心都定义了一个默认的文件模式,当我们为指定文件模式时,就是用此默认模式。ifstream关联的文件默认以in模式打开;ofstream关联的文件默认以out模式打开;与fstrea管理啊你的文件默认以in和out打开
以out模式打开文建会丢弃已有数据
保留被ofstream打开的文件中已有数据的唯一方法时显示指定app或in模式
每次调用open都会确定文件模式
out.open("precious", ofstream::app);
当程序为指定模式时,使用默认值。
string流
sstream头文件定义了三个类型来支持内存IO
1. istringstream
2. ostringstream
3. stringstream
两个特有操作:
1. strm.str() 返回strm所保存的额string的拷贝
2. strm.str(s) 将string s拷贝到strm中,返回void。
使用istringstream
当我们的某些工作时对正航文本进行处理,而其他一些工作时处理行内的单个单词时,通常可以使用istringstream
使用ostringstream
我们可能向修改字符串中的格式,重新组织句子中单词的内容,这时候可以使用ostringstream
注意
使用流的时候,比如stringstream中,如果要重复向一个对象中拷贝如入不同的内容,加入上一次的string内容处理完了,要准备考入下一个string的时候,需要先进行clear消除错误状态才行,否则后续状态都无法执行。