附加一个随机访问文件

Appending a Random Access File

本文关键字:一个 随机 访问 文件      更新时间:2023-10-16

我在附加随机访问文件时遇到问题。我似乎无法覆盖文件中的字段。相反,我只向文件追加内容,并保留旧名称。

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];
};
fstream Airline("AirLine.text", ios::out | ios::in | ios::app | ios::binary);

查看fstream::open上的cplusplus.com,我看到附加标志被描述为

app (append)在每次输出操作之前,将流的位置指示器设置为流的末尾

(重点)。看起来你得到了你想要的行为。也许你需要

ate (at end)在打开时将流的位置指示器设置为流的末端。

使用正确位置参数的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);
//                                                               ^^^^^^^^^^^^^^^