#c #file #error-handling #permission-denied
#c #файл #обработка ошибок #отказано в разрешении
Вопрос:
Я написал эту функцию для удаления записи fguest
файла. Он будет работать несколько раз, но после нескольких попыток он начнет отображаться Permission denied
.. Я не мог понять, в чем причина этого, может кто-нибудь сказать мне, в чем причина?
void delResPer(void)
{
int recFound;
char status[50] = " ResDeleted ";
printf("nPlease enter Guest's ID to search: ");
if(scanf("%s",amp;search) != 1)
{
invalidInput();
flushStdin();
editRes();
}
flushStdin();
fguest = fopen(guestFile,"rb");
if (fguest == NULL)
{
printf("Unable to locate guestFilenn");
returnToMain();
}
while(fread(amp;grec,sizeof(GUEST),1,fguest)==1)
{
if (strcmp(grec.id,search)==0)
{
printf("nnnRecord found: n");
printf("nGuest's IDtt: %s",grec.id);
printf("nGuest's Namett: %s",grec.name);
printf("nRoom's Typett: %d",grec.r_type);
checked(grec.r_type);
recFound = 1;
}
}
if ( recFound != 1)
{
printf("No matching record found..n");
printf("Please retry with a valid record..n");
printf("Page is refreshing..");
Sleep(500);
editRes();
}
else if ( recFound == 1)
{
printf("nnDelete the record (Y/N)?");
cfm = getchar();
flushStdin();
if ( cfm == 'Y' || cfm == 'y')
{
ftemp = fopen(tempFile,"wb ");
rewind(fguest);
while(fread(amp;grec,sizeof(grec),1,fguest)==1)
{
if (strcmp(grec.id,search)!=0)
{
fseek(ftemp,0,SEEK_CUR);
fwrite(amp;grec,sizeof(grec),1,ftemp);
}
}
fclose(fguest);
fclose(ftemp);
if(remove(guestFile)!=0)
{
errnum = errno;
fprintf(stderr,"Failed to remove guestFile :: %sn",strerror( errnum ));
Sleep(500);
//printf("Program is exiting..");
//return;
}
if(rename(tempFile,guestFile)!=0)
{
errnum = errno;
fprintf(stderr,"Failed to rename guestFile :: %sn",strerror( errnum ));
Sleep(500);
printf("Program is exiting..");
return;
}
if (check == 1 )
SpDeluxe ;
else if (check == 2 )
Deluxe ;
else if (check == 3 )
Premium ;
else if (check == 4 )
Basic ;
refreshRoomAvail();
printf("Record is deleted successfully..n");
Sleep(250);
returnToMain();
}
else if ( cfm == 'N' || cfm == 'n')
{
printf("Deletion of record is cancelledn");
printf("Page is refreshing..");
Sleep(500);
editRes();
}
else
{
invalidInput();
editRes();
}
}
}
Ответ №1:
У вас заканчиваются дескрипторы файлов.
fguest
открывается на верхнем уровне вашей функции, но закрывается только в ветке for cfm == 'Y' || cfm == 'y'
. Если это условие не выполняется или если этот код никогда не будет достигнут ( recFound != 1
например, потому что), файл остается открытым.
Вам всегда нужно закрывать файл перед завершением работы вашей функции.
Комментарии:
1. о, я вижу!!! теперь он работает нормально после добавления
fclose(fguest)
вrecFound!=1
,cfm == 'n' || cfm == 'N'
иelse