IO类型
- iostream: 用于窗口的输入输出
- fstream: 用于文件读写
- sstream :读写存储在内存中的string对象
注:他们继承于istream与ostream,因此istream对象也可用于读取ifstream, string对象, ostream对象同上; 并且iostream类型可在同一个流实现输入输出操作;.
IO对象不可复制赋值
ofstream out1,out2;
out1=out2; //不支持
ofstream print(ofstream);//在形参传递过程中涉及到复制操作
out2=print(out2);
//形参或返回类型不能为流类型,如果需要返回或传递IO对象,必须返回或传递该对象的指针或引用
//采用const修饰,那么就在读写过程中就不能改变IO对象状态了,SO,不可用const修饰
IO条件状态
条件状态包含:
- strm:badbit :被破坏的流
- strm::failbit: 失败的IO操作
- strm::eofbit: 指出流已经到达文件结束符
- clear: 将流中状态值重置为有效值
- setstate: 添加指定条件(为strm::iostate类型)
注:前三者都为iostate类型, IO类定义了3个iostate类型的常量值:badbit,failbit,eofbit
所有流对象都包含一个条件状态成员,由setstate,clear(添加IO条件,将某个条件状态设置为有效值)操作管理;该状态成员为iostate类型,以二进制(bit)形式使用.
流的状态由bad,fail,eof,good操作提示,流正确时bad,fail,eof返回 false,good返回true
例:流状态的查询与控制
int i;
while(cin>>i,!cin.eof()){if(cin.bad)throw runtime_error("流被破坏");if(cin.fail){cerr<<"数据错误,重试";cin.clear(istream::failbit);continue;}
}
当同时使用多个状态时可采用直接或运算(满足条件的二进制位都变为1)
i.setstate(ifstream::badbit|ifstream::failbit);
//同时将开启流状态成员
输入输出缓冲区管理
每个IO对象都具有一个缓冲区,用于储存程序读写数据
如下操作导致缓冲区内容被刷新
- 程序正常结束
- 缓冲区已经存满
- 使用操作符显示刷新缓冲区,例:endl,flush
- 输入操作完成,用unitbuf操作符设置流内部状态
- 将输入输出流关联,在读取时将刷新关联的输出缓冲区
注:unitbuf用于刷新所有输出,当程序不正常结束,不会刷新缓冲区,系统不会在程序崩溃时自动刷新缓冲区
输入输出关联
IO对象具有tie函数,用法如下:
cin.tie(&cout);//cin的任何操作都会刷新关联的缓冲区
ostream *old_tie=cin.tie();
cin.tie(0);//形参为0打破二者的绑定
cin.tie(old_tie);//重新关联
文件输入流与输出流
- ofstream: 输出文件流,创建文件并向文件写入信息
- ifstream:输入文件流,从文件读取信息
- fstream:同时具有ofstream与ifsteam的功能
文件操作时,C++源代码必须包含< iostream> < fstream>
打开文件
void open(const char *filename,ios::openmode mode);
第一个参数文件位置及文件名,第二个参数打开类型; open是文件流对象的成员函数
mode具有如下:
- ios::app :在文件末尾添加内容
- ios::ate :文件打开后定向到末尾
- ios::in :打开文件用于读取
- ios::out :打开文件用于输入
- ios:trunc :打开文件清空已存在的文件流(我的理解是覆盖以前文件内容,有不对的地方还请指出)
以上介绍的标志可以结合使用,out,trunc,app只能用于指定与ofstream或fstream对象关联的文件,默认打开形式只有in,out
ofstream outfile;
outfile.open("data.txt",ios::in|ios::trunc);
//或者
fstream file; //fstream对象默认打开方式为in和out同时打开
file.open("data.txt",ios::in|ios::out);
关闭文件: 流对象.close();
写入文件: 流插入运算符(<<)
读取文件: 流提取符(>>)
实例操作:
#include<iostream>
#include<fstream>
using namespace std;
int main(){char data[100];ofstream outfile;outfile.open("记录.txt",ios::app); //此处可做修改cin.getline(data,100);//接受一个字符串,可以接收空格,将其存储到数组中,最大存储99个字符outfile<<data;outfile.close();ifstream infile;infile.open("记录.txt");infile>>data;cout<<data<<endl; infile.close();return 0;
}
字符串流
标准库定义三种类型字符串流
- istringstream: istream派生,提供读string
- ostringstream: ostream派生,提供写string
- stringstream: iostream派生,提供读写
注:必须包含sstream头文件
stringstream的特定操作
- stringstream strm: 创建对象
- stringstream strm(s): 用string对象s初始化strm;
- strm.str(): 返回strm中存储的string类型对象
- strm.str(s): 将s复制给strm,返回void
ostringstream可用于格式转换
istringstream自动将数值类型的字符转化为相应数值
int i=1,j=2;
ostringstream s1;
s1<<i<<"i"<<j<<"j";//现在str内存储的是"12"的字符串
istringstream s2(s1.str());//用s1初始化s2
string dump;
s2>>i>>dump>>j>>dump;//接收分割效果的字符串,必须保证存储操作与读取操作格式一致
cout<<i<<j;
注:上述操作中注意需要将string对象分割才能得到,空白符与换行符会被忽略