VC与DEV编译器关于ifstream的文本反复读取问题存在的不同

来源:互联网 发布:淘宝怎么开通直播间 编辑:程序博客网 时间:2024/04/29 21:37

运行以下代码,进行文本的反复读取

#include<fstream> #include<iostream>#include<string.h>using namespace std;int main(){ifstream infile;cout<<"**************1显示文本内容***************"<<endl;char c[256];infile.open("test.txt"); while(infile>>c) { cout<<c; cout<<endl; }infile.close();cout<<endl;cout<<"**************2显示正文(非注释)内容***************"<<endl;infile.open("test.txt");while(infile>>c) { if(c[0]!='*') { cout<<c; cout<<endl; }  } infile.close(); cout<<endl;  cout<<"**************3显示被注释字符个数***************"<<endl;  infile.open("test.txt"); int num=0;while(infile>>c) { if(c[0]=='*') { num+=(strlen(c)-1)/2;  }  }cout<<"注释字符个数:"<<num; infile.close();}


DEV运行结果如图所示

 

 

然后用Microsoft Visual C++运行,结果如图所示

 

 

infile.is_open()进行测试,结果表明文本成功进行打开和关闭。

 

将代码第二段进行以下修改

cout<<"**************2显示正文(非注释)内容***************"<<endl;ifstream infile1;infile1.open("test.txt");while(infile1>>c) { if(c[0]!='*') { cout<<c; cout<<endl; }  } infile1.close(); cout<<endl;



结果发现第二段成功显示

 

于是猜想在vc中关闭流并不能改变流对象的内部状态。

修改代码

#include<fstream> #include<iostream>#include<string.h>using namespace std;int main(){ifstream infile;cout<<"**************1显示文本内容***************"<<endl;char c[256];infile.open("test.txt"); while(infile>>c) { cout<<c; cout<<endl; }infile.clear();infile.close();cout<<endl;cout<<"**************2显示正文(非注释)内容***************"<<endl;infile.open("test.txt");while(infile>>c) { if(c[0]!='*') { cout<<c; cout<<endl; }  }infile.clear(); infile.close(); cout<<endl;  cout<<"**************3显示被注释字符个数***************"<<endl;  infile.open("test.txt"); int num=0;while(infile>>c) { if(c[0]=='*') { num+=(strlen(c)-1)/2;  }  }cout<<"注释字符个数:"<<num; infile.close();cout<<endl;}


在关闭之前加入语句infile.clear()清除流的状态

结果如图

 

结果成功显示

 

由此得到以下猜想,在vc中用同一个ifstream对文本进行反复读取时需要清除流状态,而DEV会自动清除。

 

原创粉丝点击