运行以下代码,进行文本的反复读取
#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会自动清除。