2016-10-02 49 views
0

我写了这个函数来删除fguest文件的记录。它会工作几次,但几次尝试后,它开始显示Permission denied ..我无法弄清楚这是什么原因,有谁可以告诉我是什么原因?权限被拒绝时重命名.dat文件在C

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();           
     } 
    }             
} 

回答

1

您正在用完文件句柄。

fguest在您的功能的顶层打开,但只在cfm == 'Y' || cfm == 'y'的分支中关闭。如果未满足该条件,或者该代码从未达到(例如recFound != 1),则该文件保持打开状态。

您需要总是在函数退出前关闭文件。

+0

ohhh我明白了!它在我将'fclose(fguest)'添加到'recFound!= 1'后运行正常,'cfm =='n'|| cfm =='N''和'else' –