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.

Foi útil?

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.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top