2016-11-20 37 views
-3

以下是從二進制文件中刪除特定記錄的功能,但是此功能會複製最後一個記錄兩次,如果再次執行,則會將其複製三次,等等。我怎樣才能解決這個問題?我的C++程序不能正常工作,因爲它應該是.P.S它是二進制文件

void remove()     
{     
    clrscr();     
    char found='f',confirm='n';  int eno; 
    fstream fi,fo;   
    cout<<"ENTER ID TO BE DELETED - ";  cin>>eno; 
    fi.open("custo.dat",ios::binary|ios::in); 
    fo.open("musk.dat",ios::binary|ios::out);  
    while(!fi.eof())  
    {   
     fi.read((char*)&c,sizeof(c));  
     if(c.retid()==eno)  
     { 
      c.showdata();  
      found='t';  
      cout<<"\nDELETE THIS RECORD? - ";  cin>>confirm;  
      if(confirm=='n'||confirm=='N')  
      fo.write((char*)&c,sizeof(c));  
      else if(confirm=='y'||confirm=='Y')   
      cout<<"\nRecord Deleted!\n";   
     }   
     else   
      fo.write((char*)&c,sizeof(c));   
    }   
    if(found=='f')   
    cout<<"ERROR! RECORD NOT FOUND.";   
    fi.close();fo.close();   
    remove("custo.dat");   
    rename("musk.dat","custo.dat");   
    cout<<endl;   
    fi.open("custo.dat",ios::in);   
    cout<<"\nRECORDS - \n";   
    while(fi.read((char*)&c,sizeof(c)))   
    {   
     c.showdata();   
    } 
    fi.close();   
} 
+0

顯示'c'的類聲明。我期望'c'不是POD類型,所以你需要序列化。 – drescherjm

+1

也請格式化您的代碼的可讀性。 – Dai

+1

閱讀[問]。你的問題已經不復存在了。 – dandan78

回答

1

關於

該函數將最後一個記錄兩次,如果再執行它複製它三次等等

while(!fi.eof()) 

不是讀一個可靠的方法通過一個文件。只有當讀取操作由於文件結束而失敗時,EOF位才被設置爲真。當讀取操作消耗文件的最後字節時,它不會設置爲true。

取而代之的是循環條件應該檢查​​一般故障,代碼應該檢查讀操作是成功還是失敗。

和關於這個邏輯,

if(confirm=='n'||confirm=='N')  
    fo.write((char*)&c,sizeof(c));  
else if(confirm=='y'||confirm=='Y')   
    cout<<"\nRecord Deleted!\n";   

如果什麼輸入是其他東西比nNyY


在其他新聞中,

char found='f'; 

並不代表一個布爾條件的好方法。因爲不經意間給它一個非fn的值很容易。改爲使用bool

和關於

c.showdata(); 

會在一個圖形用戶界面,工作的?可能不會。爲了實現更好的可移植性和更低的複雜性以及改進功能的完整性,請勿將i/o嵌入不具有I/O特定I/O作爲其職責的類中。

相關問題