我写了这个函数来删除fguest
文件的记录。它可以工作几次,但经过几次尝试后它开始显示Permission denied
..我无法弄清楚这是什么原因,有人可以告诉我原因是什么吗?
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();
}
}
}
答案 0 :(得分:1)
你的文件句柄用完了。
fguest
在您的函数的顶层打开,但只在cfm == 'Y' || cfm == 'y'
的分支中关闭。如果不满足该条件,或者从未达到该代码(例如,因为recFound != 1
),则文件保持打开状态。
在退出函数之前,您需要始终关闭文件。