0
点赞
收藏
分享

微信扫一扫

第八章 IO库

云岭逸人 2022-04-14 阅读 52
c++

文章目录


介绍

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的扩展,区别不是特别大,主要是将输入输出区分开

举报

相关推荐

0 条评论