+ -
当前位置:首页 → 问答吧 → C++读取文件问题

C++读取文件问题

时间:2011-12-01

来源:互联网

我是用while(!ifile.eof()){ifile>>str>>x>>y;}读取文件,但是它在文件结尾后还是会读入一些莫名其妙的数据,我用新建的空txt文档试了试,结果还是会读入一次数据,这是什么原因?

作者: zyc271   发布时间: 2011-12-01

程序完整点,可以让我调试调试吗

作者: royjwy   发布时间: 2011-12-01

楼主flush一下读文件流

作者: quwei197874   发布时间: 2011-12-01

flush是使文件在打开的情况下保存文件,好像没有关系吧,况且我已经用新建的空文档试过了~~~

作者: zyc271   发布时间: 2011-12-01

不要使用
while (条件)
更不要使用
while (组合条件)
要使用
while (1) {
 if (条件1) break;
 //...
 if (条件2) continue;
 //...
 if (条件3) return;
 //...
}
因为前两种写法在语言表达意思的层面上有二义性,只有第三种才忠实反映了程序流的实际情况。
典型如:
下面两段的语义都是当文件未结束时读字符
whlie (!feof(f)) {
 a=fgetc(f);
 //...
 b=fgetc(f);//可能此时已经feof了!
 //...
}
而这样写就没有问题:
whlie (1) {
 a=fgetc(f);
 if (feof(f)) break;
 //...
 b=fgetc(f);
 if (feof(f)) break;
 //...
}
类似的例子还可以举很多。

作者: zhao4zhong1   发布时间: 2011-12-01

bool readfile()
{  
ifstream ifile("city.txt",ios::in);
string fn; 
int fx,fy,i=0;
if(!ifile)

cout<<"\t打开文件出错!"<<endl; 
return false;
}
else{  
//ifile>>listSize;
  while(!ifile.eof())
{  
ifile>>fn>>fx>>fy; cout<<fn<<fx<<fy<<endl;
//listArray[i].setcname(fn);
//listArray[i].setcpoint(fx,fy);
i++;
}
ifile.close();
cout<<"\t\t读取完毕!\n"<<endl;
if(i==0) cout<<"\t数据库中暂没有任何记录!"<<endl;
return true;
}
}


txt是记录城市名和坐标的,例如“guangdong 12 2”

作者: zyc271   发布时间: 2011-12-01

引用 4 楼 zhao4zhong1 的回复:
不要使用
while (条件)
更不要使用
while (组合条件)
要使用
while (1) {
if (条件1) break;
//...
if (条件2) continue;
//...
if (条件3) return;
//...
}
因为前两种写法在语言表达意思的层面上有二义性,只有第三种才忠实反映了程序流的实际情况。
典型如:
下面两段的语义……

++

作者: wanyuan19890515   发布时间: 2011-12-01

ifile>>str>>x>>y
ifile>>str>>x>>y
试问谁能保证运行到上面红色部分时不ifile.eof()捏?

作者: zhao4zhong1   发布时间: 2011-12-01

4楼说的很对,不过这样麻烦了点,比如我已经知道我存储的是三个数据一笔,我想一起读

作者: zyc271   发布时间: 2011-12-01

4楼说的很对,但是我已经知道存的txt的三个数据一笔(name x y )这样,这样的话str 后面就还有两个的吧可他输出时候会多两个x y,就是最后一笔数据的x y重复了~~~ ~~~

作者: zyc271   发布时间: 2011-12-01

逻辑问题
do {ifile>>str>>x>>y;}
while(!ifile.eof())

作者: vichare   发布时间: 2011-12-01

C/C++ code

试试把
while!ifile.eof())
改成
while (!(ifile.peek()==EOF))
或者百度
C/C++ ifstream之eof()  



作者: newfarmerchi   发布时间: 2011-12-01

引用 4 楼 zhao4zhong1 的回复:

不要使用
while (条件)
更不要使用
while (组合条件)
要使用
while (1) {
if (条件1) break;
//...
if (条件2) continue;
//...
if (条件3) return;
//...
}
因为前两种写法在语言表达意思的层面上有二义性,只有第三种才忠实反映了程序流的实际情况。
典型如:
下面两段的语……


++

作者: qq120848369   发布时间: 2011-12-01

引用 4 楼 zhao4zhong1 的回复:

不要使用
while (条件)
更不要使用
while (组合条件)
要使用
while (1) {
if (条件1) break;
//...
if (条件2) continue;
//...
if (条件3) return;
//...
}
因为前两种写法在语言表达意思的层面上有二义性,只有第三种才忠实反映了程序流的实际情况。
典型如:
下面两段的语……


++

作者: zhizun9527   发布时间: 2011-12-01

对文件的操作应该操作一次就判断一次吧?不应该判断之后就出现一堆的对文件的操作,那个时候,天知道你的操作到底出现了什么问题。

作者: zhizun9527   发布时间: 2011-12-01

好的,谢谢你们!明白了编译器不是神~~~

作者: zyc271   发布时间: 2011-12-02