开发者

read objects from file

开发者 https://www.devze.com 2023-03-16 19:39 出处:网络
I have this code: #include <fstream> #include <iostream> using namespace std; class Student { public:

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.

0

精彩评论

暂无评论...
验证码 换一张
取 消