文章目录
介绍
C++Primer第五版第八章学习心得
一、IO类
IO对象无法拷贝或者赋值,因此无法作为函数形参和返回类型,只能通过引用方式;读写一个IO对象会改变它的状态,因此传递和返回的不能是const类型。
文件状态:
baddit:0x4 系统级错误,发生后无法再使用流
faildit:0x2 可恢复错误,修正后可继续使用
eofbit:0x1 到达结尾
goodbit:0x0 为0表示未发生错误
stream.rdstate()//返回当前状态
stream.setstate(flag)//设置某一位状态
stream.clear()//全部复位
stream.clear(flag)//复位某一状态
由于不同流之间缓冲区机制的存在,输出流中的内容并不会马上写入到设备或者文件,需要刷新缓冲才可以,刷新缓冲原因主要有:程序正常结束、缓冲区满、操纵符显式刷新、设置内部状态、不同流之间关联。
1.操作符显式刷新:endl,flush,ends
int main(){
cout<<"Hi"<<endl;
cout<<"1"<<endl;
cout<<"Hi"<<flush;
cout<<"1"<<endl;
cout<<"Hi"<<ends;
cout<<"1"<<endl;
return 0;
}
Hi
1//endl换行
Hi1//flush不输出额外信息
Hi 1//ends增加一个空字符
2.设置内部状态unitbuf、nounitbuf
cout<<unitbuf;//所有输出立即刷新
cout<<nounitbuf;//恢复正常刷新方式
注意:程序异常结束时缓冲区不会刷新,因此发生异常时确认缓冲区是否刷新有助于定位错误原因。
3.关联流
标准库中cin和cout关联,因此执行cin会导致cout的缓冲区被刷新
cout<<cin.tie()<<endl;
cout<<&cout<<endl;
cout<<cout.tie()<<endl;
cout<<&cin<<endl;
0x404060//cin.tie()返回的是该流关联的输出流,即cout的指针
0x404060//cout的指针
0//此时的输出流没有关联,输出0
0x404180//cin的地址
通过istream.tie(&ostream)函数将一个istream绑定到另一个ostream,也可以将ostream绑定到另一个ostream,可以有多个流关联到一个输出流,这些流执行都会导致输出流被刷新。
二、文件输入输出
通过文件流执行文件读写操作,每个文件流都有一个open成员函数,用于打开文件
ifstream in(file_name);
file_name为字符串或者c风格字符数组都可以,会根据名字打开对应文件,是一个构造函数。
可以用fstream代替任何函数中的iostream,检查文件流状态是十分有必要的
if(in)//检查in打开文件是否成功,成功为true
1.文件模式:
模式 | 操作 |
---|---|
in | 读ifstream、fstream |
out | 写 ofstream、fstream |
app | 写时追加到末尾 ,默认out |
ate | 打开时定位到末尾 |
trunc | 截断,out前提下 |
binary | 二进制方式 |
每个文件流类型都定义了默认文件模式,ifstream为in,ofstream为out,fstream为in和out
可以设定多个模式
ofstream out;
out.open(file_name,ofstream::app|ofstream::out);
三、string流
三个类型:istringstream、ostringstream、stringstream
//stringstream特有操作
sstream strm;//未绑定的stringstream对象
sstream strm(s);//将string s的拷贝保存到stringstream strm,该构造函数为explicit
strm.str();//返回strm保存的string拷贝
strm.str(s);//将string s拷贝到strm中
其他同iostream无太大区别,仅仅处理的对象为字符串类型
总结
C的扩展,区别不是特别大,主要是将输入输出区分开