Por que esse buggy de código C?
-
22-09-2019 - |
Pergunta
Sobre outra pergunta, Jerry Coffin apontou o seguinte:
(Provavelmente) não está realmente relacionado à sua pergunta, mas
while (!feof(fileptr)){
é praticamente um bug garantido.
Imaginei que iniciaria uma pergunta separada, pois esse comentário é um pouco fora do tópico. Alguém poderia explicar isso para mim? Este foi o primeiro programa que escrevi em Straight C antes.
Solução
A razão para esta afirmação é que feof
ainda é (inicialmente) false quando o final do arquivo foi alcançado - ele só se torna verdadeiro após a primeira tentativa fracassada de ler após o final do arquivo.
Por isso
char mychar;
while(!feof(fileptr))
{
fread(&mychar, sizeof(char), 1, fileptr);
fprintf(stderr, "The char is '%c'.\n", mychar);
}
processará um char demais.
A maneira correta é verificar o valor de retorno de fread
(ou qualquer função que você está usando para ler) ou, alternativamente, para ligar feof
depois a função que faz a leitura. Por exemplo:
char mychar;
while(fread(&mychar, sizeof(char), 1, fileptr) > 0)
fprintf(stderr, "The char is '%c'.\n", mychar);
Outras dicas
O Google encontra isso: http://www.drpaulcarter.com/cs/common-c-errors.php#4.2
Ele diz que "o autor ainda não viu qualquer aluno usar a função Feof () corretamente!"
Para resumir, o arquivo C funciona como fread
e fwrite
Retornar valores de status de qualquer maneira que você u003Cblink>não deve ignoraru003C/blink>. Verificando o valor de feof
é um daqueles que aparafusam a porta estável depois que o cavalo já fugiu de coisas.
A lista de perguntas frequentes da C tem um responda Juntamente com as respostas a muitas outras perguntas frequentes:
Em C, o final do arquivo é indicado apenas depois que uma rotina de entrada tentou ler e falhar.