C++ 语言不直接处理输入输出,而是通过一组定义在标准库的类型处理IO。其主要包括 iostream(读写流的基本类型) fstream(读写文件的类型) sstream(读写内存string对象的类型)
1 IO类 头文件<iostream>
不能拷贝或对IO对象赋值。常用引用方式传递和返回流。
IO操作可能发生错误,可以使用一些函数以及标志来访问和操纵流的条件状态。
确定一个流对象的状态的最简单的方式是将他当做一个条件来使用,如:
while (cin>>word)
....
每个输出流都管理一个缓冲区,用来保存程序读写的数据。有了缓冲机制,操作系统就可以将程序的多个输出操作组合成单一的系统级写操作,因为设备的写操作很耗时,因此此举可以带来很大的性能提升。
导致缓冲刷新的原因:程序正常结束;缓冲区满了;手动操作,如endl ;用操纵符unitbuf设置流的内部状态,清空缓冲区;一个输出流被关联到另一个流。
刷新输出缓冲区:
cout<<"hi"<<endl; // 输出hi + \n
cout<<"hi"<<flush; // 输出hi
cout<<"hi"<<ends; // 输出hi + ‘ ’
cout<<unitbuf; // 所有输出操作之后都立即刷新缓冲区
...
cout<<nounitbuf; // 回到正常的缓冲方式
另外,因为标准库将cout 与cin 关联在一起,所以输入任何值同样导致输出缓冲区刷新,要绑定流,用tie
如果程序崩溃,输出缓冲区不会被刷新。
2 文件输入输出 头文件<fstream>
当我们想要读写一个文件时,可以定义一个文件流对象,并将对象与文件关联起来,如:
ifstream in(ifile);
ofstream out;
out.open(ifile + ".copy"); if (out) ...
每个流都有一个文件模式,指出如何使用文件:
in 读
out 写
app 追加
ate 打开文件后即定位到结尾
trunc 截断文件
binary 二进制读写
默认情况,ifstream用in打开,ofstream用out打开,fstream用in和out打开
3 string流 头文件<sstream>
当我们的某些工作是对整行文本进行处理,而其他一些工作是处理行内的单个单词时,通常可以使用istringstream,如:
string line, word;
while (getline(cin,line)) // 读取一行存入string对象line
{
istringstream is(line); // 将string对象转换成is流对象
while (is>>word) // 每次读取一个string对象word
...
}