Περίληψη
Αυτό το μάθημα ανοίγει την έβδομη ενότητα του κύκλου μαθημάτων, αφιερωμένη στο κείμενο και στα αρχεία. Εξηγεί σε τι χρησιμεύει η ενότητα: να διδάξει τον χειρισμό του κειμένου ως δεδομένου, με την πραγματική του κωδικοποίηση, και να κάνει ένα πρόγραμμα να διαβάζει και να γράφει αρχεία χωρίς να καταρρέει μπροστά σε μια κακοσχηματισμένη είσοδο· παρουσιάζει τα τέσσερα μαθήματά της και το νήμα που τα ενώνει· θυμίζει όσα η ενότητα θεωρεί γνωστά, κυρίως ότι ένας χαρακτήρας είναι, για τη μηχανή, ένας αριθμός, καθώς και τα διανύσματα, τις εγγραφές και τις συναρτήσεις των ενοτήτων 5 και 6· διατυπώνει το πρόβλημα που λύνει η ενότητα, το πρόβλημα ενός προγράμματος που φαίνεται σωστό αλλά χάνει δεδομένα χωρίς προειδοποίηση, σταματά στην πρώτη απρόσμενη γραμμή και μετρά λάθος τα ονόματα γραμμένα με γράμματα εκτός ASCII· προαναγγέλλει ότι ένα γράμμα δεν καταλαμβάνει πάντα ένα byte· και δείχνει πού οδηγεί, στην ενότητα 8 και στον Προγραμματισμό σε C++ II.
Μαθησιακοί στόχοι
- Να περιγράφει τη σειρά των περιεχομένων της ενότητας και να εξηγεί τι προσφέρει κάθε μάθημα στο μάθημα που ακολουθεί.
- Να θυμάται την αναπαράσταση των χαρακτήρων ως αριθμητικών κωδικών (μάθημα 2.4) και να γράφει έναν κωδικό στο δυαδικό και στο δεκαεξαδικό σύστημα.
- Να προαναγγέλλει, με ένα παράδειγμα, ότι ένα γράμμα δεν είναι πάντα ένα byte και ότι γι' αυτό η καταμέτρηση των byte δεν είναι καταμέτρηση των γραμμάτων.
- Να αναγνωρίζει τι αναμένεται να ξέρει να κάνει στο τέλος της ενότητας και να το διακρίνει από όσα θα μάθει στην ενότητα που ακολουθεί και στον Προγραμματισμό σε C++ II.
Αρχική αξιολόγηση
Πριν διατρέξουμε την ενότητα, αξίζει να μετρήσουμε το σημείο εκκίνησης. Η αξιολόγηση αυτή είναι αυτοαξιολόγηση: δεν βαθμολογείται, και μοναδικός σκοπός της είναι να προσανατολίσει τη μελέτη. Οι έξι πρώτες ερωτήσεις ελέγχουν όσα η ενότητα θεωρεί γνωστά: τον κωδικό ενός χαρακτήρα, τη γραφή ενός αριθμού στο δυαδικό και στο δεκαεξαδικό σύστημα, μια μάσκα bit, τη διάσχιση ενός διανύσματος που φιλτράρει τα στοιχεία του, τι συμβαίνει όταν μια ανάγνωση δέχεται γράμματα αντί για αριθμό και τον ορισμό μιας εγγραφής. Οι τέσσερις που ακολουθούν αγγίζουν, με τη σειρά των μαθημάτων, τις κεντρικές ιδέες της ενότητας: τι επιστρέφει μια αναζήτηση που δεν βρίσκει τίποτα, το μέγεθος μιας λέξης με γράμμα εκτός ASCII, την κενή γραμμή που εμφανίζεται όταν αναμειγνύονται δύο τρόποι ανάγνωσης και το αρχείο που δεν μπόρεσε να ανοίξει. Κανείς δεν είναι υποχρεωμένος να απαντήσει σωστά σε αυτές τις τέσσερις ακόμη, και σε ορισμένες το «δεν το ξέρω ακόμη» είναι τίμια απάντηση: κάθε απάντηση, σωστή ή λανθασμένη, εξηγεί το ζήτημα και κατονομάζει το μάθημα που το πραγματεύεται. Οι ίδιες δεξιότητες μετρώνται ξανά στο τέλος, στο μάθημα της σύνθεσης.
Πριν ξεκινήσεις την ενότητα, μέτρησε το σημείο εκκίνησής σου. Είναι μια σύντομη αυτοαξιολόγηση: δεν βαθμολογείται και το αποτέλεσμα αποθηκεύεται μόνο στον περιηγητή σου.
Ερώτηση 1Από προηγούμενες ενότητεςΤι γράφει το
std::println("{:d} {:d}", 'A', 'a');;Νομίζει ότι τα πεζά ακολουθούν αμέσως τα κεφαλαία· ανάμεσά τους υπάρχουν 32 κωδικοί, με μερικά σύμβολα στο ενδιάμεσο.Αγνοεί ότι το{:d}ζητά τον κωδικό· χωρίς αυτό, ηstd::printlnθα έγραφε το γράμμα.Αντιστρέφει τη σειρά: στο ASCII τα κεφαλαία έχουν μικρότερους κωδικούς από τα πεζά.Έναςcharαποθηκεύει έναν αριθμό, τον κωδικό του χαρακτήρα, και το{:d}ζητά να γραφτεί αυτός ο αριθμός και όχι το γράμμα. Στο ASCII, τα κεφαλαία αρχίζουν από το 65 και τα πεζά από το 97: η απόσταση είναι 32, ένα μόνο bit. Το μάθημα Το κείμενο δεν είναι ASCII ξεκινά από εδώ για να εξηγήσει τι συμβαίνει με τα γράμματα που δεν ανήκουν στο ASCII.Επανάληψη: Χαρακτήρες, λογικές τιμές, μετατροπές και σταθερές
Ερώτηση 2Από προηγούμενες ενότητεςΠώς γράφεται το 233 στο δυαδικό και στο δεκαεξαδικό σύστημα;
Ομαδοποιεί λάθος τα τέσσερα χαμηλά bit: το1001είναι 9, όχι 1.Διαβάζει τα bit ανάποδα, από το λιγότερο σημαντικό προς το περισσότερο σημαντικό.Συγχέει τη δεκαεξαδική γραφή με τη δεκαδική.. Ομαδοποιημένα ανά τέσσερα από τα δεξιά, τα bit1110και1001είναι 14 και 9, δηλαδήeκαι9. Είναι ο κωδικός του «é», και η ενότητα θα δείξει ότι σε ένα σημερινό αρχείο κειμένου ο κωδικός αυτός δεν αποθηκεύεται ως ένα μόνο bytee9, αλλά ως δύο.Επανάληψη: Οι ακέραιοι και η αναπαράστασή τους
Ερώτηση 3Από προηγούμενες ενότητεςΠόσο κάνει
0xB1 & 0xC0;Συγχέει το&με το|: το δυαδικό Ή ενεργοποιεί τα υψηλά bit αντί να τα επιλέγει.Νομίζει ότι η μάσκα δεν αλλάζει τίποτα· σβήνει τα έξι χαμηλά bit.Συγχέει το&με το^, το αποκλειστικό Ή.Το0xB1είναι10110001και το0xC0είναι11000000: το δυαδικό ΚΑΙ κρατά μόνο τα δύο υψηλά bit του0xB1, που είναι10. Αυτή είναι η μάσκα που χρησιμοποιεί το μάθημα Το κείμενο δεν είναι ASCII για να αναγνωρίζει τα byte που συνεχίζουν ένα γράμμα.Επανάληψη: Bit και μαθηματική βιβλιοθήκη
Ερώτηση 4Από προηγούμενες ενότητεςΤι γράφει το
std::vector<int> v{4, 7, 10, 3}; std::vector<int> w{}; for (const int x : v) { if (x % 2 == 0) { w.push_back(x); } } std::println("{}", w);;Αντιστρέφει τη συνθήκη: τοx % 2 == 0είναι αληθές για τους άρτιους.Νομίζει ότι ηpush_backαντιγράφει ολόκληρο το διάνυσμα ή ότι το φίλτρο εφαρμόζεται στοvκαι γράφεται τοv.Νομίζει ότι ηpush_backπροσθέτει στην αρχή· προσθέτει στο τέλος.Ο βρόχος διατρέχει τοvκαι αντιγράφει στοwμόνο τους άρτιους, με τη σειρά που εμφανίζονται· τοvδεν αλλάζει. Η ενότητα χρησιμοποιεί το ίδιο σχήμα με κείμενο: διατρέχει τα byte μιας συμβολοσειράς και κρατά μερικά, ή διατρέχει τις γραμμές ενός αρχείου και κρατά τις έγκυρες.Επανάληψη: Διανύσματα
Ερώτηση 5Από προηγούμενες ενότητεςΜετά το
int n{-1}; std::cin >> n;, ο χρήστης πληκτρολογείabc. Πόσο κάνει τοnκαι τι συμβαίνει με τις αναγνώσεις που ακολουθούν;Νομίζει ότι η αποτυχημένη ανάγνωση δεν αφήνει ίχνος· αφήνει, στη μεταβλητή και στην κατάσταση της ροής.Υποθέτει ότι η C++ προειδοποιεί για την άκυρη είσοδο· το πρόγραμμα συνεχίζει σαν να είχε πετύχει η ανάγνωση.Συγχέει την ανάγνωση ενός ακεραίου με την ανάγνωση ενός χαρακτήρα.Η ανάγνωση παρακάμπτει τα κενά, βρίσκει ένα γράμμα με το οποίο δεν μπορεί να αρχίσει αριθμός και αποτυγχάνει: το πρότυπο ορίζει ότι η μεταβλητή παίρνει 0, ότι το γράμμα μένει στη ροή και ότι η ροή μένει σε σφάλμα, χωρίς κανένα μήνυμα. Το μάθημα Σωστή ανάγνωση της εισόδου διδάσκει πώς διακρίνεται αυτή η αποτυχία από το τέλος των δεδομένων και πώς γίνεται η ανάκαμψη από αυτήν.Επανάληψη: Είσοδος, έξοδος και σφάλματα
Ερώτηση 6Από προηγούμενες ενότητεςΠοιος από τους παρακάτω ορισμούς δηλώνει σωστά μια εγγραφή με έναν τίτλο και ένα έτος;
Ξεχνά το ερωτηματικό μετά το άγκιστρο που κλείνει, το πρώτο σφάλμα όποιου γράφει εγγραφές· ο μεταγλωττιστής το επισημαίνει με ακρίβεια.Χωρίζει τα πεδία με κόμματα, όπως τα στοιχεία μιας λίστας· κάθε πεδίο είναι μια δήλωση και τελειώνει με ερωτηματικό.Συγχέει μια εγγραφή, με πεδία διαφορετικών τύπων και με όνομα, με ένα διάνυσμα, του οποίου τα στοιχεία είναι όλα του ίδιου τύπου.Κάθε πεδίο δηλώνεται όπως μια μεταβλητή, με τον τύπο του, το όνομά του και την αρχική του τιμή μέσα σε άγκιστρα, και ο ορισμός τελειώνει με ερωτηματικό μετά το άγκιστρο που κλείνει. Το μάθημα Αρχεία κειμένου γεμίζει διανύσματα από τέτοιες εγγραφές με τις γραμμές ενός αρχείου.Επανάληψη: Εγγραφές
Ερώτηση 7Αν το
sείναιstd::string s{"casa azul"};, τι επιστρέφει ηs.find("x");Είναι η συνήθεια άλλων γλωσσών· οstd::size_tδεν έχει πρόσημο, και ένα-1που μετατρέπεται σε αυτόν είναι ακριβώς τοnpos, αλλά η σύγκριση του αποτελέσματος με το-1λειτουργεί μόνο χάρη σε αυτή τη μετατροπή και προκαλεί προειδοποίηση του μεταγλωττιστή.Συγχέει το «δεν βρέθηκε» με τη θέση 0, που είναι η θέση μιας εμφάνισης στην αρχή της συμβολοσειράς.Είναι τίμια απάντηση: το μάθημα 7.1 παρουσιάζει τηfindκαι τοnpos.Ηfindεπιστρέφει μια θέση, τύπουstd::size_t, και όταν δεν βρίσκει τίποτα επιστρέφει μια τιμή που καμία θέση δεν μπορεί να έχει: τοnpos, που με 64 bit ισούται με . Το μάθημα Συμβολοσειρές διδάσκει να το συγκρίνουμε πάντα ρητά.Επανάληψη: Συμβολοσειρές
Ερώτηση 8Τι γράφει το
std::println("{}", std::string{"año"}.size());σε ένα πρόγραμμα αποθηκευμένο σε UTF-8, όπως αυτά του κύκλου μαθημάτων;Μετρά γράμματα· ηsizeμετρά τα byte με τα οποία είναι γραμμένα.Νομίζει ότι κάθε γράμμα καταλαμβάνει δύο byte· όσα ανήκουν στο ASCII καταλαμβάνουν ένα.Είναι τίμια απάντηση: το μάθημα 7.2 το εξηγεί byte προς byte.Ηsizeμετρά byte, όχι γράμματα: στην ισπανική λέξη «año» (έτος), το «a» και το «o» καταλαμβάνουν από ένα byte, και το «ñ», που δεν ανήκει στο ASCII, καταλαμβάνει δύο σε UTF-8. Το μάθημα Το κείμενο δεν είναι ASCII εξηγεί γιατί και διδάσκει πώς μετρώνται τα γράμματα.Επανάληψη: Το κείμενο δεν είναι ASCII
Ερώτηση 9Ένα πρόγραμμα εκτελεί
int age{}; std::string name{}; std::cin >> age; std::getline(std::cin, name);και ο χρήστης πληκτρολογεί36, πατά Enter, πληκτρολογείΆννακαι πατά Enter. Τι μένει στοname;Υποθέτει ότι ηgetlineαρχίζει στη γραμμή που ακολουθεί· αρχίζει εκεί όπου σταμάτησε ο>>.Νομίζει ότι ηgetlineξαναδιαβάζει ό,τι έχει ήδη καταναλώσει ο>>.Είναι τίμια απάντηση: το μάθημα 7.3 αρχίζει από αυτό το ελάττωμα.Ο>>διαβάζει το 36 και αφήνει στη ροή την αλλαγή γραμμής που το ακολουθούσε· ηstd::getlineδιαβάζει ως την πρώτη αλλαγή γραμμής, που είναι αυτή, και επιστρέφει ό,τι υπήρχε πριν από αυτήν: τίποτα. Το μάθημα Σωστή ανάγνωση της εισόδου το εξηγεί και το αποφεύγει με τοstd::ws.Επανάληψη: Σωστή ανάγνωση της εισόδου
Ερώτηση 10Ένα πρόγραμμα εκτελεί
std::ifstream in{"data.txt"}; int x{-1}; in >> x;, αλλά τοdata.txtδεν υπάρχει στον φάκελο από τον οποίο εκτελείται. Τι συμβαίνει;Υποθέτει ότι το άνοιγμα ενός ανύπαρκτου αρχείου είναι σφάλμα που αναφέρει η C++· το πρόγραμμα συνεχίζει χωρίς προειδοποίηση.Συγχέει το άνοιγμα για ανάγνωση με το άνοιγμα για γραφή, που όντως δημιουργεί το αρχείο.Είναι τίμια απάντηση: το μάθημα 7.4 αρχίζει από αυτόν τον έλεγχο.Το άνοιγμα ενός αρχείου μπορεί να αποτύχει, και η αποτυχία φαίνεται μόνο αν ελεγχθεί η ροή: γι' αυτό γράφουμεif (!in)πριν διαβάσουμε. Το μάθημα Αρχεία κειμένου κάνει αυτόν τον έλεγχο κανόνα και εξηγεί από ποιον φάκελο εξαρτάται η αναζήτηση.Επανάληψη: Αρχεία κειμένου
Φόρτωση του περιεχομένου…
Ολοκληρώθηκε
Συνδεθείτε για να αποθηκεύσετε την πρόοδό σας