IO库
- [x] istream(输入流)类型,提供输入操作
- [x] ostream(输出流)类型,提供输出操作
- [x] cin,一个istream对象,从标准输入读取数据
- [x] cout,一个ostream对象,向标准输出写入数据
- [x] cerr,一个ostream对象,通常用于输出程序错误消息,写入到标准错误
- [x] >>运算符,用来从一个istream对象读取输入数据
- [x] <<运算符,用来向一个ostream对象写入输出数据
- [x] getline函数,从一个给定的istream读取一行数据,存入一个给定的string对象中
IO类
管理输出缓冲
- 缓冲机制,操作系统就可以将程序的多个输出操作组合成单一的系统级写操作
- 由于设备的写操作可能会很耗时,允许操作系统将多个输出操作组合为单一的设备写操作可以带来很大的性能提升
- 导致缓冲刷新(即数据真正写到输出设备或文件)的原因有如下几个:
- [x] 程序正常结束,作为main函数的return操作的一部分,缓冲刷新被执行
- [x] 缓冲区满时,需要刷新缓冲,而后新的数据才能继续写入缓冲区
- [x] 可以使用操作符endl来显式刷新缓冲区
- [x] 在每个输出操作之后,我们可以用操作符unitbuf设置流的内部状态,来情况缓冲区,默认情况下,对cerr是设置unitbuf的,因此写道cerr的内容是立即刷新的
- [x] 一个输出流可能被关联到另一个流,在这种情况下,当读写被关联的流时,关联到的流的缓冲区会被刷新,例如,默认情况下,cin和cerr都关联到cout,因此,读cin或写cerr都会导致cout的缓冲区被刷新
- [x] 操纵符`endl`,`flush`以及`ends`可以刷新缓冲区
cout<<"hi!"<<endl; //输出hi和一个换行符,然后刷新缓冲区
cout<<"hi!"<<flush; //输出hi,然后刷新缓冲区,不附加任何额外字符
cout<<"hi!"<<ends; //输出hi和一个空字符,然后刷新缓冲区
- [x] 如果想在每次输出操作之后都刷新缓冲区,我们可以使用unitbuf操纵符,它告诉流在接下来的每次写操作之后进行一次flush操作,而nounitbuf操纵符则重置流,使其恢复使用正常的系统管理的缓冲区刷新机制
cout << unitbuf; //所有输出操作后都会立即刷新缓冲区
cout << nounitbuf; //回到正常的缓冲方式
文件输入输出
- 头文件
fstream
定义了三个类型来支持文件的IO操作
- [x] ifstream,从一个给定文件读取数据
- [x] ofstream,向一个给定文件写入数据
- [x] fstream,可以读写给定文件
使用文件流对象
ifstream input(strInFile);
ofstream output(strOutFile);
Sales_data total;
read(input,total);
//通过ifstream将数据读取到total
- 一旦一个文件流已经打开,它就保持与对应文件的关联,在关联关闭之前,无法被其他文件流关联
- 当一个
fstream
对象被销毁时,close会自动调用
文件模式
- 每一个流都有一个关联的
文件模式
,用来指出如何使用文件
in 以读方式打开
out 以写方式打开
app 每次写操作前定位到文件末尾
ate 打开文件后立即定位到文件末尾
trunc 截断文件
binary 以二进制方式进行IO操作
- 无论哪种方式打开文件,都可以指定文件模式,调用open打开文件时可以,用一个文件名初始化流来隐式打开文件时也可以
- 以out模式打开文件会丢弃已有数据
- [x] 默认情况下,当我们打开一个ofstream时,文件的内容会被丢弃
- [x] 保留被ofstream打开的文件中已有数据的唯一方法是显式指定app或in模式
- [x] 在每次打开文件时,都要设置文件模式,可能是显式的设置,也可能是隐式的设置,当程序未指定模式时,就是用默认值
string流
-
sstream
头文件定义了三个类型来支持内存IO,这些类型可以向string写入数据,从string读取数据,就像string是一个IO流一样
- [x] `istringstream`从string读取数据
- [x] `ostringstream`向string写入数据
- [x] `stringstream`既可以从string读取数据也可以向string写入数据
- 与
fstream
类型类似,头文件sstream
中定义的类型都继承自iostream
头文件中定义的类型
istringstream使用
- 当需要对整行文本进行处理,而其他一些工作是处理行内单个单词时,通常使用istringstream