1.编写函数,接受一个istream&参数,返回值类型也是istream&。此函数须从给定流中读取数据,直至遇到文件结束标识时停止。它将读取的数据打印在标准输出上。完成这些操作后,在返回流之前,对流进行复位,使其处于有效状态。
1 #include <iostream> 2 using namespace std; 3 istream& func(istream& os) 4 { 5 int v; 6 while (os >> v, os.eof() != 1)//只有在碰到结束符时才停止输入 7 { 8 if (os.bad()) 9 throw runtime_error("IO流错误"); 10 if (os.fail())//遇到数据型错误时,必须清空缓冲区 11 { 12 cerr << "数据型错误,重新输入" << endl; 13 os.clear(); 14 //清理方式1 ,直接清空缓冲区中的当前新行的剩余数据 15 os.ignore(100,'\n');//必须清理缓冲区,清理错误数据,否则过不去 16 continue; 17 } 18 cout << v << endl; 19 } 20 os.clear();//必须复位恢复流正常状态,后续才可继续使用输入 21 return os; 22 } 23 24 istream& func2(istream& os) 25 { 26 int v; 27 while (os >> v, os.eof() != 1)//只有在碰到结束符时才停止输入 28 { 29 if (os.bad()) 30 throw runtime_error("IO流错误"); 31 if (os.fail())//遇到数据型错误时,必须清空缓冲区 32 { 33 cerr << "数据型错误,重新输入" << endl; 34 os.clear(); 35 //清理方式2,只清空遇到的错误类型数据,后面正确类型的数据保留。 36 while (!isspace(cin.get()))//只把空白符之前(包括空白符)的错误型数据读取出来扔掉 37 continue; 38 continue; 39 } 40 cout << v << endl; 41 } 42 os.clear();//必须复位恢复流正常状态,后续才可继续使用输入 43 return os; 44 } 45 int main() 46 { 47 //istream mycin; //错误,不能自定义标准IO流对象,其构造函数都是私有的。 48 func(cin); 49 //用于测试如果不复位,能否继续使用cin, 并不能。 50 //cin.clear(); 51 //int v;//继续输入 52 //cin >> v; 53 //cout << v << endl; 54 }
标签:类库,IO,错误,语法,istream,结束符,os From: https://www.cnblogs.com/lichenlong0816/p/18413581