читать объекты из файла - PullRequest
0 голосов
/ 01 июля 2011

У меня есть этот код:

#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;
}

Когда я читаю из файла, последний объект печатается дважды. Что мне делать?

Ответы [ 3 ]

1 голос
/ 01 июля 2011

Если бы я угадывал, и это хорошее предположение, это был бы тест feof в цикле. Вероятно, он обнаруживает feof после чтения следующей строки и не может получить полную запись.

У вас должно быть чтение в цикле while и проверка на несоответствующий ответ, или, по крайней мере, проверка на feof после чтения.

1 голос
/ 01 июля 2011

Попробуйте

while(ifs.read((char *)&two, sizeof(two)))

вместо

while(!(ifs.eof()))

Также попробуйте отформатировать код:)

#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;
}
0 голосов
/ 01 июля 2011

Хорошо, для начала вы можете переписать его, чтобы у класса был метод сериализации / десериализации, который ожидает параметр потока вывода / ввода. Этот код не подлежит повторному использованию. Вы также хотите переписать код для выполнения вывода std::ostream& operator<<(std::ostream& s, Student const& rhs) и т. Д. Ваш код представляет собой большую кучу цензуры . Если переписать его, основная логика будет состоять из пары строк, и каждый, кто потратит 30 секунд на проверку, может показать, в чем проблема.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...