c++中文件读取问题,求大神

ifstreamfin("saveout.txt");ofstreamfout("saveout.txt",ios::binary);//读取已保存的学生成绩studen... ifstream fin("saveout.txt");
ofstream fout("saveout.txt",ios::binary);
//读取已保存的学生成绩
student *studentlink::read()
{
head=new student;
student *p=head;
FILE *fp=fin.open("saveout.txt");
while(feof(fp)==0)
{
p->next=new student;
p=p->next;
fin>>p->num>>p->name>>p->no>>p->a1>>p->a2>>p->a3>>p->a4>>p->a5>>p->sum>>p->rank;
}
return p;
}
一直都无法进入while的循环,这是为什么呢?不论写成while(fin.peek()!=EOF)还是while(fin.good())都没有用。。。
展开
 我来答
对床话雨
2014-03-26 · TA获得超过1636个赞
知道小有建树答主
回答量:171
采纳率:100%
帮助的人:153万
展开全部
作为输入流的C++类ifstream,有两种构造方式,如果在构造对象时指定了文件名,则文件在构造后就已经打开并准备读取数据了,所以调用ifstream fin("saveout.txt");时文件就已经打开,如果构造对象时未指定文件名,后面才需要调用open来打开一个指定的文件,否则的话,open调用失败,因为构造时已经打开,你的fin.open("saveout.txt");调用是失败的,而且ifstream::open没有返回值,你不能试图象fopen(...)一样,用FILE fp来取得文件指针,所以这里的fp指针是无效的,feof(fp)判定的结果也会出错。试试改成如下代码:

ifstream fin("saveout.txt");
ofstream fout("saveout.txt",ios::binary);
//读取已保存的学生成绩
student *studentlink::read()
{
head=new student;
student *p=head;

while(!fin.eof())
{
p->next=new student;
p=p->next;
fin>>p->num>>p->name>>p->no>>p->a1>>p->a2>>p->a3>>p->a4>>p->a5>>p->sum>>p->rank;
}
return p;
}
追问
试过了,没用………
追答

原因分析:

  1. 文件打开是否有错,(路径是否正确无误,是否被其他程序占用。。。)

  2. 由于你代码中,fin是作为全局流对象,是否有其他地方在调用read之前就已经调用了close(),流对象会在对象析构时,自动关闭文件。

  3. 是否已经在其他代码处read到了文件尾,可以尝试

while代码改成while(!fin.eof()&&!fin.fail()) 防止文件读取错误。

如果确定要从文件头开始读起,试试在while之前添加fin.seekg(0, ios_base::beg);


还有一种排查法,Debug跟一下,看看进去了没有,如下


//读取已保存的学生成绩
student *studentlink::read()
{   

  //这里添加一个对象,临时替换原来的fin

  ifstream in("saveout.txt");

   head=new student;
student *p=head;

// while(!fin.eof())

// 这里注释掉,改成in
while(!in.eof()&&!in.fail()){


p->next=new student;
p=p->next;

// 这里注释掉,改成in

//  fin>>p->num>>p->name>>p->no>>p->a1>>p->a2>>p->a3>>p->a4>>p->a5>>p->sum>>p->rank;

 in>>p->num>>p->name>>p->no>>p->a1>>p->a2>>p->a3>>p->a4>>p->a5>>p->sum>>p->rank;

}
   return p;
}

G_N_sword
2014-03-26 · TA获得超过190个赞
知道小有建树答主
回答量:152
采纳率:0%
帮助的人:90.7万
展开全部
FILE *fp=fin.open("saveout.txt");有错误。。
FILE *fp是c语言的文件读写,
ifstream fin ,ofstream fout;是C++的文件读写~
直接
while(!fin.eof()){
fin.read((char*)p, sizeof(student));
}
追问
FILE *fp=fin.open("saveout.txt");有错误。while(!fin.eof()){
fin.read((char*)&b, sizeof(student));
}并不明白while里面的是什么…是要怎么用?
追答
#include<iostream>
#include<fstream>
using namespace std;
struct student{
 int num;
 char name[10];
 student* next;
};
void write();
void read();
int main()
{
 write();
 read();
 return 0;
}
void write()
{
 ofstream fout("saveout.txt",ios::binary);
 student *a = new student;
 a->num = 10;
 strcpy(a->name,"My Name1\0");
 a->next = NULL;
 fout.write((char*)a, sizeof(student));
 a->num = 20;
 strcpy(a->name,"My Name2\0");
 fout.write((char*)a, sizeof(student));
 fout.close();
 delete a;
}
void read()
{
 ifstream fin("saveout.txt");
 student *head = new student;  //保存头指针
 student *p = head;
 while( !fin.eof() ){
  p->next = new student;
  p = p->next;
  fin.read((char*)p, sizeof(student));
 }
 p->next = NULL;
 fin.close();
 p = head->next;
 while( p->next != NULL)
 {
  cout<<p->name<<" "<<p->num<<endl;
  p = p->next;
 }
}

你可以运行下~

本回答被提问者采纳
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
sky9988227
2014-03-26 · 超过24用户采纳过TA的回答
知道答主
回答量:115
采纳率:100%
帮助的人:66万
展开全部
fin.Read 没调用啊
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
silmerusse
2014-03-26 · TA获得超过6640个赞
知道大有可为答主
回答量:2919
采纳率:33%
帮助的人:2102万
展开全部
你不读数据,怎么会eof呢?
追问
所以要怎么写呢
追答
首先你要搞清楚两种文件读写方式
一种是C的方式,就是用fopen(), fread()之类的,会用到文件描述指针,你可以用feof()来检查是否读到结尾。
另一种是C++的方式,是通过文件流来实现的,流调用open()后,就可以用read()或者>>操作符来读取数据,用good()来检查是否读到结尾了。

你的情况是混用了这两种方式。fin是流对象,fin.open()没有返回值的。所以你的fp其实是空的,当然feof()肯定是出问题的。
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
收起 更多回答(2)
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式