Saltar para o conteúdo
Topos Uranos

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

  1. Ler linhas completas com std::getline, explicar por que um getline que segue uma leitura com >> devolve uma linha vazia, e evitá-lo com std::ws.
  2. Consultar o estado de um fluxo após uma leitura com fail() e eof(), e distinguir com ele um dado inválido, um número que não cabe em seu tipo e o fim da entrada.
  3. Escrever um laço de leitura que se recupere de uma entrada inválida com clear e ignore, e que termine se a entrada acabar.
  4. 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.