1

ランダム アクセス ファイルへの追加に問題があります。ファイル内のフィールドを上書きできないようです。代わりに、ファイルに追加するだけで、古い名前はそのまま残しています。

fstream Airline("AirLine.text", ios::out | ios::in | ios::app | ios::binary); 
if(!Airline)
{
    cout << "File Could not be opened." << endl;  
    system("PAUSE");
    exit (1);
}

cout << "Enter Seat Number to Update" << "(1 to 100, 0 to end)?";

NewPassenger passenger;
cin >> passenger.seat_number;

while (0 < passenger.seat_number && passenger.seat_number <= 100)
{
    Airline.seekp((passenger.seat_number - 1 ) * sizeof(NewPassenger));
    Airline.read(reinterpret_cast<char *>(&passenger), sizeof(NewPassenger));

    cout << " Found Record. Now Enter New Name:";
    cin >> passenger.name;

    Airline.seekg((passenger.seat_number - 1 ) * sizeof(NewPassenger),ios::beg);
    Airline.write(reinterpret_cast<const char *>(&passenger), sizeof(NewPassenger));

    cout << "\nEnter Seat Number: ?";
    cin >> passenger.seat_number;
}

Airline.close();
cout << endl;

NewPassengerは次のように定義されます。

struct NewPassenger
{ 
    int seat_number;
    char name[20];
    char onward[3];
};
4

2 に答える 2

1
fstream Airline("AirLine.text", ios::out | ios::in | ios::app | ios::binary);

cplusplus.comfstream::openを見ると、次のように記述されている追加フラグが表示されます

app (追加)各出力操作の前に、ストリームの位置インジケータをストリームの末尾に設定します。

(強調を追加)。要求した動作が得られているようです。欲しかったのかもしれません

ate (at end) 開始時にストリームの位置インジケータをストリームの最後に設定します。

于 2011-11-27T19:01:34.437 に答える
0

seekg正しい位置引数で使用します。

seekg(abs_pos, std::ios::beg);  // seek relative to the beginning

デフォルトは ですstd::ios::cur。つまり、現在の位置に相対的です。

についても同じですseekp


具体的には、次のように言います。

Airline.seekp((passenger.seat_number - 1 ) * sizeof(Newpassenger), std::ios::beg);
//                                                               ^^^^^^^^^^^^^^^

于 2011-11-27T12:17:08.433 に答える