Отказано в разрешении при переименовании файла .dat на C

#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