read objects from file
I have this code:
#include <fstream>
#include <iostream>
using namespace std;
class Student
{
public:
char FullName[40];
char CompleteAddress[120];
char Gender;
double Age;
bool LivesInASingleParentHome;
};
int main()
{
Student one;
strcpy(one.FullName, "Ernestine Waller");
strcpy(one.CompleteAddress, "824 Larson Drv, Silver Spring, MD 20910");
one.Gender = 'F';
one.Age = 16.50;
one.LivesInASingleParentHome = true;
ofstream ofs("fifthgrade.ros", ios::binary);
ofs.write((char *)&one, sizeof(one));
Student three;
strcpy(three.FullName, "three Waller");
strcpy(three.CompleteAddress, "three 824 Larson Drv, Silver Spring, MD 20910");
three.Gender = 'M';
three.Age = 17;
three.LivesInASingleParentHome = true;
//ofstream ofs("fifthgrade.ros", ios::binary);
ofs.write((char *)&three, sizeof(three));*/
Student two;
ifstream ifs("fifthgrade.ros", ios::binary);
while(!(ifs.eof())){
ifs.read((char *)&two, sizeof(two));
cout << "Student Information\n";
cout << "Student Name: " << two.FullName << endl;
cout << "Address: " << two.CompleteAddress << endl;
if( two.Gender == 'f' || two.Gender == 'F' )
cout << "Gender: Female" << endl;
else if( two.Gender == 'm' || two.Gender == 'M' )
cout << "Gender: Male" << endl;
else
cout << "开发者_如何转开发Gender: Unknown" << endl;
cout << "Age: " << two.Age << endl;
if( two.LivesInASingleParentHome == true )
cout << "Lives in a single parent home" << endl;
else
cout << "Doesn't live in a single parent home" << endl;
cout << "\n";
}
return 0;
}
When i read from file, the last object prints twice. What should I do?
Try
while(ifs.read((char *)&two, sizeof(two)))
instead of
while(!(ifs.eof()))
Also try formatting your code :)
#include <fstream>
#include <iostream>
using namespace std;
class Student
{
public:
char FullName[40];
char CompleteAddress[120];
char Gender;
double Age;
bool LivesInASingleParentHome;
};
int main()
{
/*Student one;
strcpy(one.FullName, "Ernestine Waller");
strcpy(one.CompleteAddress, "824 Larson Drv, Silver Spring, MD 20910");
one.Gender = 'F';
one.Age = 16.50;
one.LivesInASingleParentHome = true;
ofstream ofs("fifthgrade.ros", ios::binary);
ofs.write((char *)&one, sizeof(one));
Student three;
strcpy(three.FullName, "three Waller");
strcpy(three.CompleteAddress, "three 824 Larson Drv, Silver Spring, MD 20910");
three.Gender = 'M';
three.Age = 17;
three.LivesInASingleParentHome = true;
//ofstream ofs("fifthgrade.ros", ios::binary);
ofs.write((char *)&three, sizeof(three));*/
Student two;
ifstream ifs("fifthgrade.ros", ios::binary);
while(ifs.read((char *)&two, sizeof(two)))
{
cout << "Student Information\n";
cout << "Student Name: " << two.FullName << endl;
cout << "Address: " << two.CompleteAddress << endl;
if( two.Gender == 'f' || two.Gender == 'F' )
cout << "Gender: Female" << endl;
else if( two.Gender == 'm' || two.Gender == 'M' )
cout << "Gender: Male" << endl;
else
cout << "Gender: Unknown" << endl;
cout << "Age: " << two.Age << endl;
if( two.LivesInASingleParentHome == true )
cout << "Lives in a single parent home" << endl;
else
cout << "Doesn't live in a single parent home" << endl;
cout << "\n";
}
return 0;
}
If I were guessing, and it is a good guess, it would be the feof test in the loop. It probably is detecting feof after it reads on the next line and fails to get a full record.
You should have the read in the while loop and test for inappropriate reply, or at least check for feof again after the read.
Well for starter you could rewrite it so the class has a serialize/deserialize method which expects an output/input stream parameter. This code is not reusable. You also want to rewrite the code for doing output std::ostream& operator<<(std::ostream& s, Student const& rhs)
, etc.. Your code is a big pile of censored. If you rewrite it the main logic is going to be a couple of lines and everybody who spends 30 seconds checking it can show where the problem is.
精彩评论