IO库
IO类
-
iostream头文件
- istream、wistream从流读取数据
- ostream、wostream向流写入数据
- iostream、wiostream读写流
-
fstream头文件
- ifstream、wistream从文件读取数据
- ofstream、wofstream向文件写入数据
- fstream、wfstream读写文件
-
sstream头文件
- istringstream、wistringstream从string读取数据
- ostringstream、wostringstream向string写入数据
- stringstream、wstringstream读写string
-
宽字符版本的类型和函数的名字以w开头
IO对象无拷贝或赋值
- 不能将形参或返回类型设置为流类型,采用引用方式传递和返回流。
- 读写一个IO对象会改变其状态,传递和返回的引用不能为const
ofstream out1,out2;
//out1=out2;不能戳流对象赋值
//ofstream print(ofstream);不能初始化ofstream参数
//out2=print(out2);不能拷贝流对象
管理输出缓冲
- 每个输出流都管理一个缓冲区,用来保存程序读写的数据
- 缓冲刷新的原因(程序真正写到输出设备或文件中)
- 程序正常结束
- 缓冲器满了
- 使用操纵符endl显式刷新缓冲区
- 在每个输出操作之后,可以用操纵符unitbuf设置流的内部状态清空缓冲区。默认情况下,对cerr是设置unitbuf的,因此写到cerr的内容都是立即刷新的
- 一个输出流可能被关联到另一个流。在这种情况下,当读写被关联的流时,关联到的流的缓冲区会被刷新。例如默认情况下,cin和cerr都关联到cout,因此读cin或写cerr都会导致cout的缓冲区被刷新
刷新输出缓冲区
- endl
- flush刷新缓冲区但不输出任何额外的字符
- ends向缓冲区插入一个空字符然后刷新缓冲区
cout<<"hi!"<<endl;//输出hi和一个换行,然后刷新缓冲区
cout<<"hi!"<<flush;//输出hi然后刷新缓冲区,不附加任何额外字符
cout<<"hi!"<<ends;//输出hi和一个空字符,然后刷新缓冲区
unitbuf操纵符
- 在每次输出操作后都刷新缓冲区,高数流在接下来的每次写操作后都进行一次flush操作
- nounitbuf操纵符则重置流,使其恢复使用正常的系统管理的缓冲区刷新机制
cout<<unitbuf;//所有输出操作后都会立即刷新缓冲区
cout<<nounitbuf;//回到正常的缓冲方式
- 如果程序崩溃,暑促缓冲区不会被刷新
关联输入和输出流
- 当一个输入流被关联到一个输出流时,任何试图从输入流读取数据的操作都会先刷新关联的输出流
//标准库将cout和cin关联在一起
cin>>ival;
//导致cout的缓冲区被刷新
文件输入输出
- fstream特有的操作
- fstream fstrm创建一个未绑定的文件流
- **fstream fstrm(s)**创建一个fstream,打开名为s的文件,s可以是string类型或是一个指向C风格字符串的指针。这些构造函数都是explicit的。默认的文件模式mode依赖于fstream的类型
- **fstream fstrm(s,mode);**与前一个构造函数类似,但按指定mode打开文件
- **fstrm.open(s)**打开名为s的文件,并将文件与fstrm绑定。s可以是一个string或一个指向C风格字符串的指针。默认的文件mode依赖于fstream的类型。返回void
- **fstrm.close()**关闭与fstrm绑定的文件,返回void
- **fstrm.is_open()**返回一个bool值,指出与fstrm关联的文件是否成功打开且尚未关闭
使用文件流对象
- 创建文件流对象时,若提供了文件名,则open会自动调用
ifstream in(ifile);//构造一个ifstream并打开给定文件
ofstream out;//输出文件流未关联到任何文件
成员函数open和close
ifstream in(ifile);//构造一个ifstream并打开给定文件
ofstream out;//输出文件流未关联到任何文件
out.open(ifile+".copy");//打开指定文件
- 如果调用open失败。failbit会被置位。
文件模式
-
in以读方式打开
-
out以写方式打开
-
app每次写操作前均定位到文件末尾
-
ate打开文件后立即定位到文件末尾
-
trunc截断文件
-
binary以二进制方式进行IO
-
只可以对oftream或fstream对象设定out模式
-
只可以对ifstream或fstream对象设定in模式
-
只有当out也被设定时才可设定trunc模式
-
只要trunc没被设定,就可以设定app模式。在app模式下,即使没有显式指定out模式,文件也总是以输出方式被打开
-
默认情况下,即使没有指定trunc,以out模式打开的文件也会被截断。为了保留以out模式打开的文件的内容,必须指定app模式,这样只会将数据追加写到文件末尾;或者同时指定in模式,即打开文件同时读写操作
-
ate和binary模式可用于任何类型的文件流对象,且可以与其他任何文件模式组合使用
以out模式打开文件会丢失已有数据
- 需同时指定app模式
//filel都被截断
ofstream out("filel");//隐含以输出模式打开文件并截断文件
ofstream out2("filel",ofstream::out);//隐含地截断文件
ofstream out3("filel",ofstream::out|ofstream::trunc);
//为了保留文件内容,必须显式指定app模式
ofstream app("file2",ofstream::app);//隐含为输出模式
ofstream app2("file2",ofstream::out|ofstream::app);
每次调用open时都会确定文件模式
ofstream out;//未指定文件打开模式
out.open("scratchpad");//模式隐含设置为输出和截断
out.close();//关闭out以便将其用于其他文件
out.open("precious",ofstream::app);//模式为输出和追加
out.close();
//第一个open调用未显式指定输出模式,文件隐式地以out模式打开。通常情况下,out模式意味着同时使用trunc模式。
string流
- sstream strmstrm是一个未绑定的stringstream对象。sstream是头文件sstream中定义的一个类型
- **sstream strm(s)**strm是一个sstream对象,保存string s的一个拷贝。此构造函数是explicit的
- **strm.str()**返回strm所保存的string的拷贝
- **strm.str(s)**将string s拷贝到strm中,返回void