Μετάβαση στο περιεχόμενο
Topos Uranos

Περίληψη

Η είσοδος είναι το σύνορο από το οποίο ο κόσμος μπαίνει σε ένα πρόγραμμα, και ο κόσμος δεν σέβεται προδιαγραφές. Αυτό το μάθημα διδάσκει να διαβάζουμε χωρίς να εμπιστευόμαστε: να διαβάζουμε ολόκληρες γραμμές με τη std::getline και να αποφεύγουμε την κενή γραμμή που εμφανίζεται όταν τη συνδυάζουμε με τον >>· να ρωτάμε την κατάσταση μιας ροής και να διακρίνουμε με αυτήν τρεις καταστάσεις που το μάθημα Είσοδος, έξοδος και σφάλματα είδε μόνο συγχεόμενες (την άκυρη τιμή, τον αριθμό που δεν χωράει και το τέλος των δεδομένων)· να ανακάμπτουμε από μια αποτυχημένη ανάγνωση με τις clear και ignore· και, ως ασφαλέστερο τρόπο, να διαβάζουμε κάθε τιμή ως κείμενο και να τη μετατρέπουμε με τη std::from_chars, δεχόμενοι την τιμή μόνο αν η μετατροπή κατανάλωσε ολόκληρο το κείμενο. Τελειώνει με μια συνάρτηση readInt, με τη σύμβασή της, που μπορεί να ξαναχρησιμοποιήσει το υπόλοιπο του κύκλου.

Μαθησιακοί στόχοι

  1. Να διαβάζει ολόκληρες γραμμές με τη std::getline, να εξηγεί γιατί μια getline που ακολουθεί μια ανάγνωση με τον >> επιστρέφει κενή γραμμή, και να το αποφεύγει με τον std::ws.
  2. Να ρωτά την κατάσταση μιας ροής μετά από μια ανάγνωση με τις fail() και eof(), και να διακρίνει με αυτήν μια άκυρη τιμή, έναν αριθμό που δεν χωράει στον τύπο του και το τέλος της εισόδου.
  3. Να γράφει έναν βρόχο ανάγνωσης που ανακάμπτει από μια άκυρη είσοδο με τις clear και ignore, και που τερματίζει αν η είσοδος τελειώσει.
  4. Να επικυρώνει έναν αριθμό που διαβάστηκε ως κείμενο με τη std::from_chars, απαιτώντας να μην υπάρχει σφάλμα και να καταναλωθεί ολόκληρη η συμβολοσειρά, και να ενθυλακώνει την επικύρωση σε συναρτήσεις με σύμβαση.

Το σύνορο, ξανά

Το μάθημα Είσοδος, έξοδος και σφάλματα καθιέρωσε τρία γεγονότα για την std::cin >> n: η ανάγνωση σταματά, χωρίς να τον καταναλώσει, στον πρώτο χαρακτήρα που δεν μπορεί να συνεχίσει τον αριθμό· αν δεν καταφέρει να διαβάσει κανέναν, η ροή μένει σε κατάσταση σφάλματος και κάθε ανάγνωση που έρχεται μετά δεν κάνει τίποτα· και η if (std::cin) επιτρέπει να μάθουμε αν κάτι απέτυχε. Το μάθημα Βρόχοι πρόσθεσε ότι η συνθήκη while (std::cin >> value) τερματίζει τόσο όταν η είσοδος τελειώνει όσο και όταν φτάνει μια άκυρη τιμή. Ωστόσο, με αυτά τα εργαλεία ένα πρόγραμμα ανιχνεύει ότι κάτι πήγε στραβά, αλλά δεν ξέρει τι, ούτε μπορεί να κάνει τίποτε άλλο από το να παραιτηθεί.

Αυτό το μάθημα ξεκινά από μια αρχή σχεδίασης, την αρχή του αμυντικού προγραμματισμού στο σύνορο: κάθε τιμή που μπαίνει επικυρώνεται πριν χρησιμοποιηθεί, και το πρόγραμμα που την επικυρώνει διακρίνει την άκυρη τιμή, που επιδέχεται διόρθωση (να τη ζητήσει ξανά, να την παραλείψει, να την αναφέρει), από το τέλος των δεδομένων, που δεν την επιδέχεται. Αν αυτό ισχύει, χρειάζονται τρία πράγματα: να διαβαστεί η τιμή όπως γράφτηκε, δηλαδή μια γραμμή· να ξέρουμε γιατί απέτυχε μια ανάγνωση· και να επιστραφεί στη ροή η ικανότητα να διαβάζει.