Kar Keng Chan Kar Keng Chan - 2 months ago 6
C Question

Permission denied when renaming .dat file in C

I wrote this function to delete a record of the

fguest
file. It will work several times but after a few attempts it starts to show
Permission denied
.. I couldn't figure out what is the cause of this, may anyone tell me what's the cause is?

void delResPer(void)
{
int recFound;
char status[50] = " ResDeleted ";

printf("\nPlease enter Guest's ID to search: ");
if(scanf("%s",&search) != 1)
{
invalidInput();
flushStdin();
editRes();
}
flushStdin();

fguest = fopen(guestFile,"rb");
if (fguest == NULL)
{
printf("Unable to locate guestFile\n\n");
returnToMain();
}
while(fread(&grec,sizeof(GUEST),1,fguest)==1)
{
if (strcmp(grec.id,search)==0)
{
printf("\n\n\nRecord found: \n");
printf("\nGuest\'s ID\t\t: %s",grec.id);
printf("\nGuest\'s Name\t\t: %s",grec.name);
printf("\nRoom\'s Type\t\t: %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("\n\nDelete the record (Y/N)?");
cfm = getchar();
flushStdin();
if ( cfm == 'Y' || cfm == 'y')
{
ftemp = fopen(tempFile,"wb+");
rewind(fguest);
while(fread(&grec,sizeof(grec),1,fguest)==1)
{
if (strcmp(grec.id,search)!=0)
{
fseek(ftemp,0,SEEK_CUR);
fwrite(&grec,sizeof(grec),1,ftemp);
}
}
fclose(fguest);
fclose(ftemp);
if(remove(guestFile)!=0)
{
errnum = errno;
fprintf(stderr,"Failed to remove guestFile :: %s\n",strerror( errnum ));
Sleep(500);
//printf("Program is exiting..");
//return;
}
if(rename(tempFile,guestFile)!=0)
{
errnum = errno;
fprintf(stderr,"Failed to rename guestFile :: %s\n",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 cancelled\n");
printf("Page is refreshing..");
Sleep(500);
editRes();
}

else
{
invalidInput();
editRes();
}
}
}

Answer

You're running out of file handles.

fguest is opened at the top level of your function, but is only ever closed in the branch for cfm == 'Y' || cfm == 'y'. If that condition is not met, or if that code is never reached (because recFound != 1, for instance), the file is left open.

You need to always close the file before your function exits.