2013-02-11 61 views
1

我正在編寫一個程序,將結構寫入二進制文件,然後爲用戶提供編輯該文件的選項。然後程序應該在寫入原始結構的文件中重寫該部分。代碼:覆蓋二進制文件中的字段

struct Record 
{ 
    char name  [16]; 
    char phoneNum [16]; 
    float balance; 
}; 

int edit  (fstream& ref) 
{ 
    char searchVal[16]; 
    cout << "Enter customer name: "; 
    cin.ignore(); 
    cin.getline(searchVal, sizeof(searchVal)); 
    int position = -1; 
    Record buffer; 
    bool found = false; 

    while(!ref.eof() && !found) 
    { 
     position = ref.tellg(); 
     ref.read(reinterpret_cast<char*>(&buffer), RECORD_SIZE); 
     if((strcmp(buffer.name,searchVal) == 0)) 
     { 
      found = true; 

      cout << buffer.name << " found! " << endl; 

      cout << "Enter new customer name: "; 
      cin.getline(buffer.name, sizeof(buffer.name)); 
      cout << "Enter new customer phone number: "; 
      cin.getline(buffer.phoneNum, sizeof(buffer.phoneNum)); 
      cout << "Enter new customer balance: "; 
      cin >> buffer.balance; 

      ref.seekg(-(RECORD_SIZE), ios::cur); 
      ref.write(reinterpret_cast<char*>(&buffer), RECORD_SIZE); 

      position = ref.tellp(); 
      break; 
     } 
    } 
    if(!found) 
    { 
     cout << "Record not found" << endl; 
    } 

    ref.clear(); 
    ref.seekg(0L, ios::beg); 
    return position; 
} 

基本上,該記錄被發現,用戶可以通過「編輯」,但它是在文件的結尾寫的,我不知道爲什麼。我感謝你的幫助。

+0

打開文件時提供了哪些選項? – Barmar 2013-02-11 03:50:21

+0

我打開文件爲ref.open(「prog2.dat」,ios :: in,ios :: out,ios :: app,ios :: binary); – user2044676 2013-02-11 03:52:36

回答

1

打開文件時不要使用模式ios::app。該模式意味着輸出應附加到文件而不是覆蓋。相反,使用ios::ate,它告訴它在文件打開時尋找文件的末尾,所以它不會被截斷。

+0

那麼這是一個簡單的修復。這是我的理解,如果我沒有使用ios :: app,打開命令會在運行時擦除文件。非常感謝! – user2044676 2013-02-11 04:08:06

+0

好的,堅持下去。我認爲修復了它,但是每次我寫入文件時它都清除了該文件 – user2044676 2013-02-12 02:44:33

+0

增加了使用'ios :: ate'的建議。 – Barmar 2013-02-12 03:09:15