我在附加到随机访问文件时遇到问题。我似乎无法覆盖文件中的字段。相反,我只是附加到文件,并保留旧名称。
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];
};
答案 0 :(得分:1)
fstream Airline("AirLine.text", ios::out | ios::in | ios::app | ios::binary);
查看cplusplus.com on fstream::open
我看到描述为
app(append)在每次输出操作 之前,将流的位置指示器设置为流 的末尾。
(强调补充)。看起来你得到了你要求的行为。也许你想要
ate(at end)将流的位置指示器设置为打开时流的末尾。
答案 1 :(得分: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);
// ^^^^^^^^^^^^^^^