C++ Primer复习和学习笔记 第八章 标准IO库

来源:互联网 发布:淘宝开店怎么交保证金 编辑:程序博客网 时间:2024/05/29 14:18









/*编写一个函数,其唯一的形参和返回值都是 istream& 类型。该个函数应一直读取流直到到达文件结束符为止,还应将读到的内容输出到标准输出中。最后,重设流使其有效,并返回该流。通过以 cin 为实参实现调用来测试上题编写的函数。*/#include "iostream"using namespace std;std::istream &  get(std::istream & in){int ival;while(in>>ival,!in.eof()){if(in.bad())//系统级的故障。如无法恢复的读写错误{throw  std::runtime_error("IO  stream corrupted");}if(in.fail())//出现可恢复的错误{std::cerr<<"bad data ,try again";//提示用户in.clear();//恢复流in.ignore(200,' ');//跳过类型非法的输入项/*恢复流之后需要跳过类型非法的输入项(否则会出现死循环),采用ignore函数跳过若干字符(跳过200个字符或遇到空格或文件结束为止),所以条用该函数时输入数据必须以空格作为间隔*/continue;//继续读入数据}//读入正常std::cout<<ival<<endl;}in.clear();return in;}int main(int argc, char const *argv[]){double  dval;get(cin);cin>>dval;//从新使用恢复后的流cout<<dval<<endl;return 0;  }

/*由于 ifstream 继承了 istream,因此可将 ifstream 对象传递给形参为 istream 引用的函数。使用第 8.2 节第一个习题编写的函数读取已命名的文件。*/#include "iostream"#include "string"#include "cstring"#include "fstream"//#include "ofstream"/*注意ofstream这个类是存在的,我们可以创建这个类型的对象,但是这个头文件是不存在的.如果要是加上这句话,那么程序就会出现错误,而且会显示出没有这个文件*/using namespace std;istream & get(istream & in){int ival;while (in>>ival,!in.eof()){if (in.bad()){throw runtime_error("runtime_error");}if (in.fail()){cerr<<"cerr in.fail()"<<endl;in.clear();in.ignore(200,' ');continue;}cout<<ival<<endl;}in.clear();return in;}int main( ) {string str;//用来保存文件名字的字符串,但是由于历史原因需要转换成为C风格的字符串cout<<"请输入文件名字字符串:"<<endl;cin>>str;//创建一个输入文件流类型ifstream的对象inFile,然后用相应的文件名初始化这个流对象。//相当于打了指定文件名字的文件,并且将它和一个ifstream的对象绑定起来。ifstream inFile(str.c_str());if (!inFile)//判断指定的文件是否被成功的打开。{cerr<<"打开文件失败!"<<endl;return -1;}//get()这个函数的形参是istream类,是ifstream的基类。所以可以传ifstream类型,给istream作为参数。get(inFile);    return 0;}


/*在C盘保存一系列的文件,其中保存一些内容。然后我们使用这个程序可以存储一系列的文件名字在vector容器中,然后从这些文件中挨个读出文件的内容*/#include "iostream"#include "fstream"#include "string"#include "vector"using namespace std;void  process(string s);int main(){vector<string>   files;string fileNames,s;//读入vector对象的元素(也就是要处理的文件的名字)cout<<"Enter fileNames :(Ctrl + Z  to end)"<<endl;while (cin>>fileNames){files.push_back(fileNames);}ifstream input;vector<string>::const_iterator it = files.begin();//处理各个文件while (it!=files.end()){cout<<*it<<endl;input.open(it->c_str());//打开文件if (!input){cerr<<"error :can not open file:"<<*it<<endl;input.clear();++it;}    else    {while (input>>s)process(s);input.close();input.clear();++it;    }    }return 0;}void process(string s){cout<<s<<endl;}


/*  将文件内容读入string类型的vector容器中,每一行存储为该容器对象的一个元素。 */#include "iostream"#include "string"#include "vector"#include "fstream"using namespace  std;int fileToVector(const string & fileName,vector<string> & svec);int  main(){vector<string>  svec;string fileName,s;//读入文件名cout<<"请输入文件名字"<<endl;      cin>>fileName;//处理文件switch(fileToVector(fileName,svec)){case 1:cout<<"错误,不能打开文件"<<fileName<<endl;return -1;case 2:cout<<"错误,系统级别的错误"<<endl;return -1;case 3:cout<<"错误:读失败"<<endl;return -1;}cout<<"vector"<<endl;for(vector<string>::iterator iter=svec.begin();iter!=svec.end();++iter)cout<<*iter<<endl;return 0;};int fileToVector(const string & fileName,vector<string> & svec){//创建ifstream对象inFile并绑定到由形参fileName指定的文件ifstream inFile(fileName.c_str());if (!inFile)//打开文件失败{return 1;}//将文件内容读入到string类型的vector容器//将每一行存储为该容器对象的一个元素string  s;while(getline(inFile,s))/*如果不是想每个容器元素中只是存放一行,而是存放一个单词。那么就使用 inFile>>s这样容器中的每个元素存储的就不是文件中的一行,而是一个一个的单独的单词。*/{svec.push_back(s);}inFile.close();//关闭文件if (inFile.eof())//遇到文件尾部{return 4;}if (inFile.bad())//发生系统级别的故障{return 2;}if (inFile.fail())//读入数据失败{return 3;}}

/*使用open_file()函数和get()函数,两个函数来读取一个文件中的内容*/#include "iostream"#include "string"#include "cstring"#include "fstream"using namespace std;istream & get(istream & in){int ival;while (in>>ival,!in.eof()){if (in.bad()){throw runtime_error("runtime_error");}if (in.fail()){cerr<<"cerr in.fail()"<<endl;in.clear();in.ignore(200,' ');continue;}cout<<ival<<endl;}in.clear();return in;}ifstream & open_file(ifstream & in,const string & fileName){in.close();//首先关闭输入流in,因为in流可能已经打开一个文件了。所以必须先关闭。in.clear();//首先清除in流中原来的状态标志,免得现在留状态的标识对下面的流的操作产生影响。in.open(fileName.c_str());//打开文件return in;}int main( ) {string fileName,s;cout<<"请输入文件的名字"<<endl;cin>>fileName;//调用open_file()函数打开文件ifstream inFile;if (!open_file(inFile,fileName.c_str()))//打开文件失败{cerr<<"打开文件失败"<<endl;return -1;}get(inFile);inFile.close();return 0;}

/*编写程序将文件中的每一行存储在 vector<string> 容器对象中,然后使用 istringstream 从 vector 里以每次读一个单词的形式读取存储的行。 */#include "iostream"#include "vector"#include "string"#include "sstream"#include "fstream"using namespace std;int fileToVector(const string & fileName,vector<string> & svec);int main(){vector<string>  svec;string fileName;cout<<"请输入文件名字"<<endl;cin>>fileName;switch(fileToVector(fileName,svec)){case 1:cout<<"打开文件失败!"<<endl;break;case 3:cout<<"系统故障"<<endl;break;case 4:cout<<"读写失败"<<endl;break;}//因为是读字符串所以我们使用的是istringstream类型的对象。如果是写字符串那么我们使用的就是ostringstreamistringstream  strm;string str;for (vector<string>::const_iterator iter = svec.begin();iter!=svec.end();++iter){strm.str(*iter);while(strm>>str){cout<<str<<endl;}strm.clear();//如果没有这个标志,那么读取vector的第一个元素中的所有的字符串之后,将不会再读取下面的内容。//所以如果++iter之后,进入了vector中的第二个容器之后,那么因为strm的上一次的标识没有被清除掉。所以将不会进行这次的读取。}return 0;}int fileToVector(const string & fileName,vector<string> & svec){ifstream inFile;inFile.open(fileName.c_str());if (!inFile){return 1;}string str;while (getline(inFile,str)){svec.push_back(str);}inFile.close();if (inFile.eof()){return 2;}if (inFile.bad()){return 3;}if (inFile.fail()){return 4;}}


0 0
原创粉丝点击