Имеется однонаправлянный связаный список, который находиться в двоичном файле. Файл мы создает из консоли, и там же его заполняем. Проблема возникает, когда я пытаюсь удалить единственный элемент из списка, со всеми остальными работает отлично. Вот две функции по удалению, пока временное решение - удалить и создать файл заново.
void delEl(FILE *&f, int &Start, char key[], char fname[15]){
TBook wp,pp;
int iwp = Start,ipp = -1;
while(iwp != -1)
{
fseek(f,iwp,SEEK_SET);
fread(&wp,sizeof(TBook),1,f);
if(strcmp(key,wp.name) == 0) break;
pp = wp;
ipp = iwp;
iwp = wp.Next;
}
if(ipp == -1 && wp.Next == -1){
fclose(f);
remove(fname);
openFile(fileName,Start);
}
else if(ipp == -1){
pp = wp;
ipp = iwp;
iwp = wp.Next;
fseek(f,iwp,SEEK_SET);
fread(&wp,sizeof(TBook),1,f);
fseek(f,ipp,SEEK_SET);
fwrite(&wp,sizeof(TBook),1,f);
deleteFromFile(f,iwp);
}
else{ pp.Next = wp.Next;
fseek(f,ipp,SEEK_SET);
fwrite(&pp,sizeof(TBook),1,f);
deleteFromFile(f,iwp);//Освобождение физического места в файле после удаления элемента из списка
}}
void deleteFromFile(FILE *&f,int delPos){
TBook book;
// читаем заголовок списка дыр из файла
rewind(f);
fread(&book,sizeof(TBook),1,f);
// в прочитанном заголовке в поле Next находится адрес первой дыры
// теперь эта дыра будет второй, значит то, что записано в поле Next
// заголовочной записи, записываем в поле next новой дыры, теперь она
// первая. Надписываем не отдельно значение поля Next, а полностью
//запись, так как информация в дырах для нас не важна
fseek(f,delPos,SEEK_SET);
fwrite(&book,sizeof(TBook),1,f);
// Изменяем поле Next заголовочной записи, теперь в нем адрес вновь
//добавленной дыры
book.Next=delPos;
rewind(f);
fwrite(&book,sizeof(TBook),1,f);}
Я немного изменю часть кода, где по моему логика неправильная:
if(ipp == -1 ){
if (wp.Next == -1) {
fclose(f);
remove(fname);
openFile(fileName,Start);
}
else {
pp = wp;
ipp = iwp;
iwp = wp.Next;
fseek(f,iwp,SEEK_SET);
fread(&wp,sizeof(TBook),1,f);
fseek(f,ipp,SEEK_SET);
fwrite(&wp,sizeof(TBook),1,f);
deleteFromFile(f,iwp);
}
}
else{...
Сборка персонального компьютера от Artline: умный выбор для современных пользователей