Resumo
A entrada é a fronteira pela qual o mundo entra em um programa, e o mundo não respeita especificações. Esta aula ensina a ler sem confiar: a ler linhas completas com std::getline e a evitar a linha vazia que aparece ao misturá-lo com >>; a consultar o estado de um fluxo e a distinguir com ele três situações que a aula Entrada, saída e erros só viu confundidas (o dado inválido, o número que não cabe e o fim dos dados); a recuperar-se de uma leitura fracassada com clear e ignore; e, como forma mais segura, a ler cada dado como texto e convertê-lo com std::from_chars, aceitando-o só se a conversão consumiu o texto inteiro. Termina com uma função readInt, com seu contrato, que o resto do curso pode reutilizar.
Objetivos de aprendizagem
- Ler linhas completas com
std::getline, explicar por que umgetlineque segue uma leitura com>>devolve uma linha vazia, e evitá-lo comstd::ws. - Consultar o estado de um fluxo após uma leitura com
fail()eeof(), e distinguir com ele um dado inválido, um número que não cabe em seu tipo e o fim da entrada. - Escrever um laço de leitura que se recupere de uma entrada inválida com
cleareignore, e que termine se a entrada acabar. - Validar um número lido como texto com
std::from_chars, exigindo que não haja erro e que se consuma a string inteira, e encapsular a validação em funções com contrato.
A fronteira, outra vez
A aula Entrada, saída e erros estabeleceu três fatos sobre std::cin >> n: a leitura para, sem consumi-lo, no primeiro caractere que não pode continuar o número; se não consegue ler nenhum, o fluxo fica em estado de erro e toda leitura seguinte não faz nada; e if (std::cin) permite saber se algo fracassou. A aula Laços acrescentou que a condição while (std::cin >> value) termina tanto se a entrada acaba como se chega um dado inválido. Ora, com esses instrumentos um programa detecta que algo deu errado, mas não sabe o quê nem pode fazer outra coisa senão desistir.
Esta aula parte de um princípio de projeto, o da programação defensiva na fronteira: todo dado que entra é validado antes de ser usado, e o programa que o valida distingue o dado inválido, que admite uma correção (pedi-lo outra vez, pulá-lo, informar sobre ele), do fim dos dados, que não a admite. Se isso é assim, são necessárias três coisas: ler o dado tal como foi escrito, isto é, uma linha; saber por que uma leitura fracassou; e devolver ao fluxo a capacidade de ler.
Carregando o conteúdo…