我想从文件中读取3个对象。例如,在主要我写道:
ifstream fis;
Person pp;
fis >> pp;
Person cc;
fis >> cc;
Person dd;
fis >> dd;
问题在于每个人都会读到3个对象。我需要创建一个对象数组?
ifstream& operator>>(ifstream&fis, Person &p){
fis.open("fis.txt", ios::in);
while (!fis.eof())
{
char temp[100];
char* name;
fis >> temp;
name = new char[strlen(name) + 1];
strcpy(name, temp);
int age;
fis >> age;
Person p(name, age);
cout << p;
}
fis.close();
return fis;
}
答案 0 :(得分:4)
<强>问题:强>
您正在打开和关闭operator>>
内的输入流。因此,每次执行它都会在开头打开文件,然后读到最后并再次关闭文件。在下次通话时,它会重新开始。
<强>阐释:强>
使用过的输入流会跟踪其当前的读取位置。如果在每次调用中重新初始化流,则重置文件中的位置,从而再次从头开始。如果您有兴趣,还可以使用std::ifstream::tellg()检查位置。
可能的解决方案:
准备operator>>
之外的输入流,然后每次调用只读一个数据集。完成所有阅读后,关闭外面的文件。
示例:强>
致电代码:
#include<fstream>
// ... other code
std::ifstream fis;
Person pp, cc, dd;
fis.open("fis.txt", std::ios::in); // prepare input stream
fis >> pp;
fis >> cc;
fis >> dd;
fis.close(); // after reading is done: close input stream
operator>>
代码:
std::ifstream& operator>>(std::ifstream& fis, Person &p)
{
// only read if everything's allright (e.g. eof not reached)
if (fis.good())
{
// read to p ...
}
/*
* return input stream (whith it's position pointer
* right after the data just read, so you can start
* from there at your next call)
*/
return fis;
}
答案 1 :(得分:2)
在使用operator>>
之前,您应该准备要阅读的流。
ifstream fis;
fis.open("fis.txt", ios::in);
Person pp;
fis >> pp;
Person cc;
fis >> cc;
Person dd;
fis >> dd;
fis.close();
您的代码应如下所示。
ifstream& operator>>(ifstream&fis, Person &p) {
char temp[100];
char* name;
fis >> temp;
name = new char[strlen(name) + 1];
strcpy(name, temp);
int age;
fis >> age;
Person p(name, age);
cout << p;
return fis;
}
如果流不为空且使用string
而不是char*