Résumé
L’entrée est la frontière par laquelle le monde entre dans un programme, et le monde ne respecte pas les spécifications. Cette leçon enseigne à lire sans faire confiance : à lire des lignes entières avec std::getline et à éviter la ligne vide qui apparaît quand on le mélange avec >> ; à consulter l’état d’un flux et à distinguer grâce à lui trois situations que la leçon Entrée, sortie et erreurs n’a vues que confondues (la donnée non valide, le nombre qui ne tient pas et la fin des données) ; à se rétablir après une lecture échouée avec clear et ignore ; et, comme manière la plus sûre, à lire chaque donnée comme texte et à la convertir avec std::from_chars, en ne l’acceptant que si la conversion a consommé le texte entier. Elle se termine par une fonction readInt, avec son contrat, que le reste du cours peut réutiliser.
Objectifs d’apprentissage
- Lire des lignes entières avec
std::getline, expliquer pourquoi ungetlinequi suit une lecture avec>>renvoie une ligne vide, et l’éviter avecstd::ws. - Consulter l’état d’un flux après une lecture avec
fail()eteof(), et distinguer grâce à lui une donnée non valide, un nombre qui ne tient pas dans son type et la fin de l’entrée. - Écrire une boucle de lecture qui se rétablisse d’une entrée non valide avec
clearetignore, et qui se termine si l’entrée s’épuise. - Valider un nombre lu comme texte avec
std::from_chars, en exigeant qu’il n’y ait pas d’erreur et que la chaîne entière soit consommée, et encapsuler la validation dans des fonctions avec contrat.
La frontière, une fois de plus
La leçon Entrée, sortie et erreurs a établi trois faits sur std::cin >> n : la lecture s’arrête, sans le consommer, au premier caractère qui ne peut pas prolonger le nombre ; si elle n’en lit aucun, le flux reste dans un état d’erreur et toute lecture suivante ne fait rien ; et if (std::cin) permet de savoir si quelque chose a échoué. La leçon Boucles a ajouté que la condition while (std::cin >> value) se termine aussi bien quand l’entrée s’épuise que quand arrive une donnée non valide. Or, avec ces instruments, un programme détecte que quelque chose s’est mal passé, mais il ne sait pas quoi et ne peut rien faire d’autre que renoncer.
Cette leçon part d’un principe de conception, celui de la programmation défensive à la frontière : toute donnée qui entre est validée avant d’être utilisée, et le programme qui la valide distingue la donnée non valide, qui admet une correction (la redemander, la sauter, la signaler), de la fin des données, qui n’en admet pas. S’il en est ainsi, trois choses sont nécessaires : lire la donnée telle qu’elle a été écrite, c’est-à-dire une ligne ; savoir pourquoi une lecture a échoué ; et rendre au flux la capacité de lire.
Chargement du contenu…