eof () má prática?

Duplicar Possível:
Por que o iostream :: eof está dentro de uma condição de loop considerada errada?

Então, eu tenho usado a function eof() em muitos dos meus programas que requerem input de arquivo, e meu professor disse que é bom usar, mas algumas pessoas no SO disseram que eu não deveria usá-lo sem realmente especificar o motivo. Então eu estava pensando, há uma boa razão?

Você pode usar o eof para testar a condição exata que ele relata – se você tentou ler o final do arquivo passado . Você não pode usá-lo para testar se há mais inputs para ler ou se a leitura foi bem-sucedida, que são testes mais comuns.

Errado:

 while (!cin.eof()) { cin >> foo; } 

Corrigir:

 if (!(cin >> foo)) { if (cin.eof()) { cout << "read failed due to EOF\n"; } else { cout << "read failed due to something other than EOF\n"; } } 

Você não deve usá-lo porque, se a input falhar por outro motivo, você poderá ser parafusado.

 while(!file.eof()) { int i; file >> i; doSomething(i); } 

O que acontece no loop acima se o conteúdo do arquivo for “WHAARRRRRRGARBL”? Ele faz um loop infinito, porque não é o final do arquivo, mas você ainda não pode extrair um int dele.

Como você está usando isso? O que .eof() lhe dirá é que o stream já atingiu o final do arquivo, que ele tentou ler dados que não estão lá.

Isso geralmente não é o que você quer. Normalmente, você quer saber se está atingindo o final do arquivo ou se está prestes a atingir o final do arquivo, e não que já o atingiu. Em um loop como:

 while(!f.eof()) { f >> /* something */; /* do stuff */ } 

você tentará ler a input e falhar, e então você irá executar tudo em /* do stuff */ , e então a condição do loop falhará e o loop será interrompido.

Outro problema com esse loop é que há outras maneiras pelas quais a input pode falhar. Se houver uma condição de erro no arquivo que não seja EOF, .fail() retornará true mas .eof() não retornará.

Caso as respostas acima sejam confusas:

O que as pessoas pensam que é errado:

  • eof () não olha para ver se a última parte que você leu incluiu o último byte do arquivo.
  • Ele não procura ver se o próximo byte está após o final do arquivo.

O que realmente faz:

  • eof () relata se a última leitura incluiu bytes após o final do arquivo.

Se eof () for verdadeiro, você já cometeu um erro. Assim explica a declaração dos professores. Use para o que isso significa, ocorreu um erro.