2016-10-02 2 views
0

fguest 파일의 레코드를 삭제하려면이 함수를 작성했습니다. 그것은 여러 번 작동하지만 몇 번의 시도 후에 그것은 Permission denied을 보여주기 시작합니다. 나는이 원인이 무엇인지 알아 내지 못했습니다. 원인이 무엇인지 말해 줄 수 있습니까?C에서 .dat 파일의 이름을 바꿀 때 사용 권한이 거부되었습니다

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

오하이오 나는 본다 !!! 'fclose (fguest)'를'recFound! = 1'에 추가 한 후에는 잘 작동합니다.'cfm == 'n'|| cfm == 'N ''과'else' –