2016-11-20 2 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

Прочтите [ask]. Твой вопрос совсем не хватает. – dandan78

ответ

1

Что касается

эта функция копирует последняя запись дважды, и если выполняется снова он копирует его трижды и так далее

while(!fi.eof()) 

не является надежным способом для чтения через файл. Бит EOF устанавливается в true только в случае сбоя операции чтения из-за окончания файла. Он не установлен в true, когда операция чтения потребляет последние байты файла.

Вместо этого условие цикла должно проверять общий сбой, а код должен проверять, выполняется ли операция чтения или не выполняется.

А что касается этой логики,

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

, что если на входе есть нечто иное, чем n, N, y или Y?


В других новостях,

char found='f'; 

не является хорошим способом представить логическое состояние. Потому что легко непреднамеренно дать ему значение, отличное от f или n. Вместо этого используйте bool.

А что касается

c.showdata(); 

Будет ли эта работа в GUI? Возможно нет. Для лучшей переносимости и более низкой сложности, а также для улучшения полноты функциональности не вставляйте i/o в классы, которые не имеют специфического ввода/вывода в качестве своей ответственности.