Добавление файла произвольного доступа - PullRequest
1 голос
/ 27 ноября 2011

У меня проблемы с добавлением файла с произвольным доступом. Кажется, я не могу перезаписать поле в файле. Вместо этого я только добавляю файл и оставляю старое имя без изменений.

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];
};

Ответы [ 2 ]

1 голос
/ 27 ноября 2011
fstream Airline("AirLine.text", ios::out | ios::in | ios::app | ios::binary);

Глядя на cplusplus.com на fstream::open Я вижу флаг добавления, описанный как

app (добавление) Установите индикатор положения потока в конецпоток перед каждой операцией вывода .

(выделение добавлено).Похоже, вы получаете поведение, которое вы просили.Возможно, вы хотели

ели (в конце) Установите индикатор положения потока в конец потока при открытии.

0 голосов
/ 27 ноября 2011

Используйте 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);
//                                                               ^^^^^^^^^^^^^^^

...