2011-11-27 99 views
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]; 
}; 

回答

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

看着cplusplus.com on fstream::open我看描述爲

應用程序追加標誌(追加)集流的位置指示符到流的末尾在每個輸出操作之前

(強調添加)。它看起來像你正在得到你要求的行爲。也許你想

吃(在結束時)將流的位置指示器設置爲打開時的流結束。

+0

謝謝我改變應用程序去吃,它工作..這是我的頭在約4小時... – user1058717

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); 
//                ^^^^^^^^^^^^^^^ 

+0

用我的代碼查找SeatNumber爲-1,然後轉到我輸入的SeatNumber,然後它應該用我輸入的乘客姓名替換乘客姓名。你能在更多的代碼中顯示seekg嗎? – user1058717

+0

保持原樣,只將第二個參數添加到seek命令中。 –

+0

好吧,我把它添加到最後。如果我跟着你,但它告訴我未申報的標識符'abs_pos'[code] Airline.seekg((passenger.seat_number - 1)* sizeof(Newpassenger),(abs_pos,ios :: beg)); [/ code] – user1058717