c++中文件读取问题,求大神
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())都没有用。。。 展开
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;
}
试过了,没用………
原因分析:
文件打开是否有错,(路径是否正确无误,是否被其他程序占用。。。)
由于你代码中,fin是作为全局流对象,是否有其他地方在调用read之前就已经调用了close(),流对象会在对象析构时,自动关闭文件。
是否已经在其他代码处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;
}
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;
}
}
你可以运行下~
所以要怎么写呢
首先你要搞清楚两种文件读写方式
一种是C的方式,就是用fopen(), fread()之类的,会用到文件描述指针,你可以用feof()来检查是否读到结尾。
另一种是C++的方式,是通过文件流来实现的,流调用open()后,就可以用read()或者>>操作符来读取数据,用good()来检查是否读到结尾了。
你的情况是混用了这两种方式。fin是流对象,fin.open()没有返回值的。所以你的fp其实是空的,当然feof()肯定是出问题的。