从文件中读取对象

read objects from file

本文关键字:取对象 读取 文件      更新时间:2023-10-16

我有这个代码:

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

当我从文件中读取时,最后一个对象打印两次。我该怎么办?

尝试

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 Informationn";
        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;
}

如果我在猜测,而且这是一个很好的猜测,那么它将是循环中的feof测试。它可能在读取下一行并未能获得完整记录后检测到feof。

你应该在while循环中读取,并测试是否有不恰当的回复,或者至少在读取后再次检查feof。

对于初学者来说,您可以重写它,这样类就有了一个序列化/反序列化方法,该方法需要一个输出/输入流参数。此代码不可重复使用。您还需要重写用于输出std::ostream& operator<<(std::ostream& s, Student const& rhs)等的代码。您的代码是一大堆经过审查的。如果你重写它,主要逻辑将是几行,每个花30秒检查它的人都可以显示问题所在