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