1

オブジェクトをファイルに書き込もうとしています。1 回実行すると、ファイルが空であるため、完全に動作しますが、2 回目に実行しようとすると、入力から何も取得せずにプログラムがクラッシュします。

このコードで何が間違っているかについてのアイデアはありますか?

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

読み込むと、現在のファイル ストリームが上書きthisされます。これにより、ファイル ストリームを使用した次のファイル操作が未定義の動作になります。

ファイルの読み取りおよび/または書き込み時にを使用thisすることは、ほとんど良い考えではありません。特に、ポインターおよび/または非 POD 型の変数 (たとえば、 などstd::fstream) がある場合はそうです。代わりに、読み取り/書き込みに必要なデータを別の構造に置き、代わりにそれを使用することをお勧めします。

于 2013-08-08T12:43:36.473 に答える
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 に答える