I/O总结

本文深入探讨了C++ IO流的基础知识,包括流的继承关系、流的状态管理、错误处理及恢复方法。此外还介绍了流缓冲区的工作原理,以及如何控制流的刷新行为。最后,文章提供了关于fstream文件操作的注意事项,并展示了istringstream在文本处理中的实用技巧。
摘要由CSDN通过智能技术生成

本章均从C++11 primer摘录总结

   ①想要顺利的理解IO库,就必须要了解其继承关系,如下:

     注意:出ios外,所有的类型均有相关的宽字符流,如wifstream。


②IO对象是不能进行拷贝和赋值的,当然这一点在日常的工程点力也不会涉及到。

ofstream out1, out2;
out1 = out2;				//不能对out1对象进行复制
③清楚流状态情况,以及一个发生错误后,如何采用clear函数从流中恢复的方法:
badbit :表示系统级错误,如不可恢复的读写错误。通常情况下,一旦badbit被指位,流就无法再使用了。
failbit:为可恢复错误,如期望读取数值却读出一个字符等错误。
eofbit :如果到达文件结束位置,将会置位eofbit和failbit。
ifstream readTFile(ifstream &in)
{
	int i = 0;
	while(in >> i, !in.eof())
	{
		if(in.bad())
		{
			throw runtime_error("IO流错误");
		}
		
		if(in.failbit)
		{
			cerr<< "输出错误,请重试"<<endl;
			in.ignore(100, '\n');
			continue;
		}
	}
	
	in.clear();
	return in;
} 
④每个输出流都管理一个缓冲区,用来保存程序读写的数据。如:
cout<< "I may not flush out quckly!";
     想要让流快速输出,可以采用以下三种方法:
 A)endl:  cout<< 2 << endl;
 B)flush: cout<< 1 << flush;
 C)cout << unitbuf;   //所有输出操作都会立即刷新
   cout << nounitbuf; //恢复正常缓冲模式;
对于通过输出流调试打印信息时,如果程序异常终止时,输出缓冲区是不会被刷新的。

    ⑤fstream打开与关闭需要注意的操作:
可以通过fstream::operator()函数调用说明符判断文件是否打开成功
ifstream file("input.txt");		//打开一个txt文件夹
if(file)		//如果打开失败,failbit将会被置位,file::operator()返回false
	 
	当一个fstream对象被销毁时,close会自动被调用
vector<string> filenames = {"1.txt","2.txt"};
for(auto &name : filenames)
{
	ifstream input(name);
	....
}	//每次循环结束,input销毁时自动调用close
	
⑥istringstream的使用场景
当我们的某些工作是对整行文本进行处理,而其他的一些工作是对行内的单个单词进行处理,就可以考虑使用istringstream
//读取输入文件 
ifstream input("input.txt");
string line, word;
vector<Phone> mutiPhones;
istringstream record;

while(getline(input, line))
{
	record.clear();		//也可以将record定义在里面,通过构造函数使line被赋值
	record.str(line);	//istringstream record(line);
	
	Phone phone;
	record >> phone.name;
	
	while(record >> word)
		phone.phones.push_back(word);
		
	mutiPhones.push_back(phone);
}



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值