基本IO库类型:


istream(输入流)类型, 提供输入操作


ostream(输出流)类型,提供输出操作


cin, 一个istream对象,从标准输入读取数据


cout, 一个ostream对象,向标准输出写数据


cerr,一个ostream对象,通常用于输出程序错误信息,写入到标准错误


>>: 用来从一个istream对象读取输入数据


<<: 用来向一个ostream对象写入数据


getline:从一个给定的istream读取数据,并存入string对象




文件IO类:


应用程序常常需要读写命名文件,所以我们可以通过fstream向文件读写数据


ifstream 从文件读取数据 ofstream 向文件写入数据


fstream 读写文件




字符串IO类:


istringstream 从字符串读取数据


ostringstream 向字符串写入数据




ifstream和istringstream都继承于istream 所以使用方法类似




IO对象无对象或拷贝:


#include<iostream>
#include<fstream>
#include<sstream>
using namespace std;

int main() {

	ofstream out1, out2;
	out1 = out2; //流对象不能赋值
	ofstream print(ofstream);  //不能初始化ofstream参数
	out2 = print(out2);    //不能拷贝流对象


	system("PAUSE");
	return 0;
}



进行IO操作的函数一般使用引用方式,读写一个IO对象会改变其状态


传递和返回的引用不能是const的




检测流输入是否正确:


读操作有时候会发生错误: 如int ival; cin>> ival;


如果输入Boo则会发生错误 无法正确读取数据,因此,要进行检测


#include<iostream>
#include<fstream>
#include<sstream>
using namespace std;

void TestIstreamRight() {
	int ival;
	if (cin >> ival)
		cout << "right" << endl;
	else
		cout << "wrong" << endl;
}
int main() {

	TestIstreamRight();
	
	system("PAUSE");
	return 0;
}



查询流的状态:


有时候我们也需要知道IO输入输出为什么会发生错误,这时候需要流状态检测,然后选择正确的处理方式


IO库定义了一个与机器无关的IOSTATE类型,它提供了表达流状态的完整功能


badbit表示系统级错误:如不可恢复或读写错误,一旦被置位,便不可再被恢复


failbit:发生可恢复错误后,failbit被置位,该错误可被修正


一个文件读取结束后:


eofbit和failbit都会被置位,goodbit的值为,表示未发生错误


badbit,failbit,eofbit任意一个被置位后,表示发生错误




管理条件状态:


rdstate();   //记住cin当前的状态


setstate函数将给定条件位置位,表示发生对应错误



clear复位对应操作位; 




检测各个位是否被改变:


void CheckBit() {
	if (cin.eof()) {
		cout << "eof change!" << endl;
	}

	if (cin.fail()) {
		cout << "fail change!" << endl;
	}

	if (cin.bad()) {
		cout << "bad change!" << endl;
	}

	if (cin.good()) {
		cout << "good change" << endl;
	}
}



位状态的具体运用:


int main() {
	auto old_state = cin.rdstate();  //记住cin当前状态
	cin.clear();   //所有位复位 使操作有效
	
	TestIstreamRight();  //使用cin
	CheckBit();

	cin.setstate(old_state);  //恢复到初始状态

	//手动复位
	cout << endl << "after setState:" << endl;

	cin.clear(cin.rdstate() & ~cin.failbit & ~cin.badbit);  //手动复位 ~表示位求反 将failbit位和badbit位恢复
	CheckBit();

	system("PAUSE");
	return 0;
}