1

別の方法で、data.txt というバイナリ ファイルに情報を格納するクラス Flight を作成しました。そのレコードの保存は正常に機能していましたが、保存したレコードの読み取りに問題が発生しています。ファイルの最後 (eof) までのすべてのレコードを表示するように動作しています。しかし、レコードの表示が完了すると、Program.exe が動作を停止したというポップアップ エラーが表示されます。

void Flight::ViewFlight(){
HANDLE hConsole;        //Console colors
hConsole = GetStdHandle(STD_OUTPUT_HANDLE);
fstream data;
Flight flight;
data.open("data.txt",ios::in | ios::binary);
if (data.fail())
{
    SetConsoleTextAttribute(hConsole, 12);
    cout<<"\n\nFlight data does not exist yet";
    cout<<"\n\nYou are being redirected to the Main Menu in 3 seconds\n\n";
    cout<<"3\n\n";
    Sleep(1000);
    cout<<"2\n\n";
    Sleep(1000);
    cout<<"1\n\n";
    Sleep(1000);
    cout<<"0\n\n";
    SetConsoleTextAttribute(hConsole, 15);
}
else{
    while(data.read((char*) &flight, sizeof(flight)))
    {   
        if(!data.eof())
        {
            SetConsoleTextAttribute(hConsole, 10);
            cout<<"\n\n----------- Record for "<<flight.flightid<<" -----------\n";
            SetConsoleTextAttribute(hConsole, 15);
            cout<<"\nFlight Number \t\t: "<<flight.flightnumber;
            cout<<"\nDeparture Airport\t: "<<flight.departAirport;
            cout<<"\nArrival Airport\t\t: "<<flight.arriveAirport;
            cout<<"\nDeparture Time\t\t: "<<flight.departTime.hour<<":"<<flight.departTime.minute;
            cout<<"\nDeparture Date\t\t: "<<flight.departDate.day<<"/"<<flight.departDate.month<<"/"<<flight.departDate.year;
            cout<<"\nPrice \t\t\t: RM "<<flight.price;
            cout<<"\nBusiness Class Seats\t: "<<flight.bseat;
            cout<<"\nFirst Class Seats\t: "<<flight.fseat;
            cout<<"\nEconomy Class Seats\t: "<<flight.totalseat;
            cout<<endl;
        }
    }
}
data.close();
}
4

4 に答える 4

4

クラスFlightstd::stringメンバーが含まれています。これらは単純な古いデータ型ではなく、通常、動的に割り当てられたメモリへのポインターを保持します。クラスをユニットとして読み書きすることはできず、std::stringメンバーとその内容が適切に構築されることを期待します。Time同じことがandメンバーにも当てはまるかもしれDataませんが、それらがどのように定義されているかを示していません。

適切なシリアライゼーションを調べる必要があります。

いくつかの関連する質問:

于 2013-09-22T17:59:10.057 に答える
0

フライトクラスを見ただけですが、他のクラスオブジェクトを持つクラスに直接読み込むことはできません。あなたの場合、文字列オブジェクト。ストリームをデシリアライズし、変数を自分で初期化する必要があります。問題は、フライトが破壊されているときに、正しく構築された文字列オブジェクトではない文字列オブジェクトを破壊していることです。基本的に、最初に文字列をバッファから分離し、それらを文字列変数に 1 つずつ割り当てます。

于 2013-09-22T18:27:43.400 に答える