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:
Ainda falando de arquivo, só que agora da função remover.
voidremover()
{
intstatus;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;}
elseprintf("\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
thingol
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:
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
thingol
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?
voidremover()
{
intstatus;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;}
elseprintf("\n\nArquivo removido com sucesso.\n\n");}}
}
T
thingol
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.”
T
thingol
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.