1

我正在尝试将对象写入文件。当我运行它一次时,它运行良好——因为文件是空的——但是当我尝试第二次运行它时,程序在从输入中获取任何内容后崩溃。

关于这段代码有什么问题的任何想法?

class student
{
    fstream file;
    int roll,mks;
public:
    void openFile();
    void getInput();
    void disp();
};

void student::openFile()
{
    file.open("student.dat",ios::in|ios::out|ios::app);
    if(!file)
    {
        cout<<"write error";
        _sleep(2000);
        exit(1);
    }
}

void student::getInput()
{
    openFile();
    cout<<"\nenter roll no.:";
    cin>>roll;
    cout<<"\nenter marks:";
    cin>>mks;
    file.write((char *)this,sizeof(this));
    file.seekg(0);
    while(!file.eof())
    {
        file.read((char *)this,sizeof(this));
        if(file.eof())
        {
            break;
        }
        disp();
    }
    file.close();
}

void student::disp()
{
    cout<<"\n\n\troll no.:"<<roll;
    cout<<"\n\tmarks:"<<mks;
}

int main()
{
    student a;
    a.getInput();
    getch();
    return 0;
}
4

2 回答 2

1

正如 Joachim 指出的那样,当您用来回读内容时,您void student::getInput()会破坏,。filethis

用户定义的结构可能适合您的需要。

像这样的东西(这个,这个,不是那个this:D):

class student
{
    //....
    data_struct data; //typedef struct { int roll,mks;} data_struct;
  //...
};

接着

void student::getInput()
{
    openFile();
    cout<<"\nenter roll no.:";
    cin>>data.roll;
    cout<<"\nenter marks:";
    cin>>data.mks;
    file.write((char *)&data,sizeof(data_struct));
    file.seekg(0);
    while(!file.eof())
    {
        file.read((char *)&data,sizeof(data_struct));
        disp();
    }
    file.close();
}
于 2013-08-08T13:07:30.123 回答
1

当您读入时,this您会覆盖当前文件流!这将导致文件流的下一个文件操作行为未定义。

在读取和/或写入文件时使用this几乎不是一个好主意,特别是如果您有指针和/或非 POD 类型变量(例如 an std::fstream)。相反,我建议您将需要读取/写入的数据放在单独的结构中,然后使用它。

于 2013-08-08T12:43:36.473 回答