本章均从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);
}