Arquivo em C

9 respostas
paloma

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:

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

9 Respostas

T
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");
                }
            }
        }
    }
}
paloma

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

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

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

T

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.

paloma

Vc pode me explicar pq o NULL? :roll:

T

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).

paloma

A função fica assim?

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");
     }  
 }               
}
T

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

paloma

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

T

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.

Criado 16 de junho de 2006
Ultima resposta 16 de jun. de 2006
Respostas 9
Participantes 2