读书人

CFile类文件打开的有关问题

发布时间: 2012-03-28 15:40:03 作者: rapoo

CFile类文件打开的问题
见如下代码:
void test()
{
char filename[256];
cout < < "请输入文件名(包含)扩展名: " < <endl;
cin> > filename;
ifstream infile(filename,ios::nocreate);
while(!infile)
{
cout < < "文件不存在,请重新输入¡ " < <endl;
infile.close();//进入死循环? cin> > filename;
infile.open(filename,ios::nocreate);
}
}
我想要的效果是循环输入一直到输入正确,但是第一次输入错误之后,就无法跳出循环了,这是为什么?

[解决办法]
//这样可以满足你的要求:

void test()
{
char filename[256];
cout < < "请输入文件名(包含)扩展名: " < <endl;
cin> > filename;
ifstream infile;
infile.open(filename,ios::in | ios::ate);
while(!infile.is_open())
{
cout < < "文件不存在,请重新输入¡ " < <endl;
infile.close();//进入死循环?
cin> > filename;
infile.open(filename,ios::ate);
}
infile.close();
}
[解决办法]
!infile与!infile.is_open() 应该不一样。

你看构造函数的定义和is_open的定义就知道
前者只是设定setstate(failbit); ,所以infile不能直接拿来作判断
explicit basic_ifstream(const char *_S,
ios_base::openmode _M = in)
: basic_istream <_E, _Tr> (&_Fb)
{if (_Fb.open(_S, _M | in) == 0)
setstate(failbit); }
后者
bool is_open() const
{return (_Fb.is_open()); }
他返回的是setstate(failbit);
lz只要把while(!infile)改成while(!infile.is_open())再把ios::nocreate参数改成ios::in就可以。

读书人网 >C++

热点推荐