2013-02-11 29 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