Arquivo em C

Pessoal, tô com um problema nessa função modificar de arquivo, tem chave sobrando ou faltando, já olhei várias vezes, mas ainda não identifiquei onde está faltando ou sobrando, uma ajuda por favor :oops:

[code]void modificar()
{
int status,num;

 arq=fopen("CadastroAluno.dat","r+b");
 if(arq==NULL)
 {
   printf ("Erro ao abrir o arquivo.\n");
   return;
   }
 else
 {
   printf ("Entre com o numero do aluno que deseja modificar: ");
   scanf ("%d",&aluno.num);
   if((aluno.num>=1)&&(aluno.num<=50))
   {
     dados_aluno();//chamando a função
     status=fseek(arq,sizeof(TAluno),SEEK_SET);
     if(status!=0)
     {
       printf ("Erro ao posicionar o cursor no início do arquivo.\n");
       status=fclose(arq);
       if(status!=0)
       {
         printf ("Erro ao fechar o arquivo.\n");
         return;
         }
     }
     else
     {
      status=fseek(arq,(num-1)*sizeof(TAluno),SEEK_CUR);
      if(status!=0)
      {
       printf ("Erro ao posicionar o cursor no meio do arquivo.\n");
       status=fclose(arq);
       if(status!=0)
       {
         printf ("Erro ao fechar o arquivo.\n");
         return;
         }
      }
     else
     {
       status=fwrite(&aluno,sizeof(TAluno),1,arq);
       if(status!=0)
       {
         printf ("Erro ao modificar o arquivo.\n");
         status=fclose(arq);
         if(status!=0)
         {
           printf ("Erro ao fechar o arquivo.\n");
           return;
           }
       }   
       else
        printf ("Arquivo modificado com sucesso.\n");
        }
     }
   }

} [/code]

void modificar()
{
    int status,num;

    arq=fopen("CadastroAluno.dat","r+b");
    if(arq==NULL)
    {
        printf ("Erro ao abrir o arquivo.\n");
        return;
    }
    else
    {
        printf ("Entre com o numero do aluno que deseja modificar: ");
        scanf ("%d",&aluno.num);
        if((aluno.num>=1)&&(aluno.num<=50))
        {
            dados_aluno();//chamando a função
            status=fseek(arq,sizeof(TAluno),SEEK_SET);
            if(status!=0)
            {
                printf ("Erro ao posicionar o cursor no início do arquivo.\n");
                status=fclose(arq);
                if(status!=0)
                {
                    printf ("Erro ao fechar o arquivo.\n");
                    return;
                }
            }
            else
            {
                status=fseek(arq,(num-1)*sizeof(TAluno),SEEK_CUR);
                if(status!=0)
                {
                    printf ("Erro ao posicionar o cursor no meio do arquivo.\n");
                    status=fclose(arq);
                    if(status!=0)
                    {
                        printf ("Erro ao fechar o arquivo.\n");
                        return;
                    }
                }
                else
                {
                    status=fwrite(&aluno,sizeof(TAluno),1,arq);
                    if(status!=0)
                    {
                        printf ("Erro ao modificar o arquivo.\n");
                        status=fclose(arq);
                        if(status!=0)
                        {
                            printf ("Erro ao fechar o arquivo.\n");
                            return;
                        }
                    }
                    else
                    printf ("Arquivo modificado com sucesso.\n");
                }
            }
        }
    }
}

Ainda falando de arquivo, só que agora da função remover.

[code]void remover()
{
int status;

 status=fclose(arq);
 if(status!=0)
 {
   printf ("\n\nErro ao fechar o arquivo.\n\n");
   return;
   } 
 else
 { 
   status=remove("CadastroAluno.dat");
   if(status!=0)
   { 
    printf ("\n\nErro na remocao do arquivo.\n\n");
    return;
    }
   else
    printf ("\n\nArquivo removido com sucesso.\n\n");
 }  

}

       [/code]

Eu fiz essa função, mas concerteza está errada, só está exibindo a mensagem “erro ao fechar o arquivo”

De fato, fclose só retorna 0 se conseguir fechar o arquivo com sucesso.
Mas se o arquivo já tiver sido fechado, então fclose de um arquivo fechado vai realmente retornar algo diferente de zero.

Para não ter esses problemas, habitue-se a fazer o seguinte:

em vez de

status = fclose (arq); 
if (status != 0) ...

faça sempre:

if (arq != NULL) {
    status = fclose (arq);
    arq = NULL;
    if (status != 0) {
        ...
    }
}

Dessa maneira, você não irá tentar fechar um arquivo que já foi fechado antes.

Vc pode me explicar pq o NULL? :roll:

A tal variável “arq” (que suponho que seja do tipo FILE * ) pode conter um valor válido (que é o que você obtém usando fopen) ou um valor inválido (que é o que ele contém depois de você fechar o arquivo, com fclose).
Só que não existe na biblioteca do C uma função do tipo “isClosed” que checa se o arquivo já foi fechado antes de você tentar fechar.
Então você pode fazer o seguinte: toda vez que você fechar o arquivo, você atribui à variável “arq” um valor que é sabidamente inválido (NULL) para saber que o arquivo já está fechado e não pode ser fechado novamente.
Outra maneira (que é para os mais preguiçosos, como eu) é simplesmente não testar o retorno de fclose (passar um arquivo já fechado para fclose não faz mal).

A função fica assim?

[code]void remover()
{
int status;

 if(arq != NULL) 
 {
  status = fclose (arq);
  arq = NULL;
  if(status!=0)
  {
   printf ("\n\nErro ao fechar o arquivo.\n\n");
   return;
   } 
 else
 { 
   status=remove("CadastroAluno.dat");
   if(status!=0)
   { 
    printf ("\n\nErro na remocao do arquivo.\n\n");
    return;
    }
   else
    printf ("\n\nArquivo removido com sucesso.\n\n");
 }  

}
}

[/code]

Acho que sim, mas é questão de você testar para ver se está funcionando.

Não está, só exibe a mensagem “Erro ao fechar o arquivo.” :cry:

A idéia é que em todos os lugares de seu programa que chamam fclose passem a setar a variável arq para NULL, não somente a função “remover”.

Depois que falei que estava OK é que pensei que você só ia mudar essa função.

No seu caso, você teria de procurar todos os lugares que chamam fclose.