C ++ Tutorial: Μάθετε σχετικά με την είσοδο και την έξοδο

01

του 08

Ένας νέος τρόπος εξόδου

Κωδικός προγράμματος
traffic_analyzer / Getty Images

Η C ++ διατηρεί πολύ υψηλή συμβατότητα προς τα πίσω με το C, έτσι μπορεί να συμπεριληφθεί για να σας δώσει πρόσβαση στο printf () λειτουργία για την έξοδο. Ωστόσο, το I / O που παρέχεται από τη C ++ είναι σημαντικά πιο ισχυρό και πιο σημαντικό είδος ασφαλής. Μπορείτε ακόμα να χρησιμοποιήσετε scanf () για την εισαγωγή αλλά τα χαρακτηριστικά ασφαλείας τύπου που παρέχει η C ++ σημαίνει ότι οι εφαρμογές σας θα είναι πιο ισχυρές αν χρησιμοποιείτε C ++.

Στο προηγούμενο μάθημα, αυτό έγινε αντιληπτό με ένα παράδειγμα που χρησιμοποίησε το cout. Εδώ θα πάμε σε λίγο περισσότερο βάθος ξεκινώντας με την έξοδο πρώτα δεδομένου ότι τείνει να είναι πιο χρήσιμη από την είσοδο.

Η κλάση iostream παρέχει πρόσβαση στα αντικείμενα και τις μεθόδους που χρειάζεστε τόσο για την έξοδο όσο και για την είσοδο. Σκεφτείτε i / o από την άποψη των ροών των bytes - είτε πηγαίνει από την αίτησή σας σε ένα αρχείο, την οθόνη ή έναν εκτυπωτή - αυτό είναι έξοδο, ή από το πληκτρολόγιο - αυτό είναι εισόδου.

instagram viewer

Έξοδος με Cout

Εάν γνωρίζετε το C, ίσως το γνωρίζετε << χρησιμοποιείται για τη μετατόπιση των μπιτ προς τα αριστερά. Π.χ. 3 << 3 είναι 24. Για παράδειγμα, η αριστερή βάρδια διπλασιάζει την τιμή έτσι ώστε οι 3 αριστερές βάρδιες πολλαπλασιάζονται με 8.

Στην C ++, << υπήρξε υπερφορτωμένο στην κατηγορία ostream έτσι ώστε int, φλοτέρ, και οι τύποι συμβολοσειρών (και οι παραλλαγές τους - π.χ. διπλασιάζει) υποστηρίζονται όλα. Αυτός είναι ο τρόπος με τον οποίο εκτελείτε την έξοδο κειμένου, συνδυάζοντας πολλά στοιχεία μεταξύ <<.>


cout << "Μερικά Κείμενα" << intvalue << floatdouble << endl; 

Αυτή η ιδιότυπη σύνταξη είναι δυνατή επειδή κάθε ένα από τα << είναι στην πραγματικότητα μια κλήση λειτουργίας που επιστρέφει α αναφορά σε ένα ostream αντικείμενο. Έτσι μια γραμμή όπως η παραπάνω είναι στην πραγματικότητα έτσι


cout << ("κάποιο κείμενο") cout << (intvalue) .cout << (floatdouble) .cout << (endl); 

Το C λειτουργίαprintf ήταν σε θέση να μορφοποιήσει την έξοδο χρησιμοποιώντας Προδιαμορφωτές μορφοποίησης, όπως το% d. Στο C ++ cout μπορεί επίσης να μορφοποιηθεί η έξοδος, αλλά χρησιμοποιεί έναν διαφορετικό τρόπο να το κάνει.

02

του 08

Χρησιμοποιώντας Cout για τη μορφοποίηση της εξόδου

Το αντικείμενο cout είναι μέλος του iostream βιβλιοθήκη. Θυμηθείτε ότι αυτό πρέπει να συμπεριληφθεί με a


#περιλαμβάνω 

Αυτή η βιβλιοθήκη iostream προέρχεται από ostream (για την έξοδο) και istream για είσοδο.

Μορφοποίηση της εξόδου κειμένου γίνεται με την εισαγωγή χειριστών στη ροή εξόδου.

Τι είναι ένας χειριστής;

Είναι μια λειτουργία που μπορεί να μεταβάλει τα χαρακτηριστικά της ροής εξόδου (και εισόδου). Στην προηγούμενη σελίδα το είδαμε αυτό << ήταν μια υπερφορτωμένη συνάρτηση που επέστρεψε μια αναφορά στο αντικείμενο κλήσης π.χ. cout για την έξοδο ή τον cin για την είσοδο. Όλοι οι χειριστές το κάνουν έτσι ώστε να μπορείτε να τις συμπεριλάβετε στην έξοδο << ή εισόδου >>. Θα δούμε την είσοδο και >> αργότερα σε αυτό το μάθημα.


count << endl; 

endl είναι ένας χειριστής που τερματίζει τη γραμμή (και ξεκινά μια νέα). Είναι μια λειτουργία που μπορεί επίσης να καλείται με αυτόν τον τρόπο.


endl (cout). 

Αν και στην πράξη δεν θα το κάνατε αυτό. Το χρησιμοποιείτε έτσι.


cout << "Μερικά Κείμενα" << endl << endl; // Δύο κενές γραμμές. 

Τα αρχεία είναι μόνο ρεύματα

Κάτι που πρέπει να έχουμε κατά νου ότι με μεγάλη ανάπτυξη αυτές τις μέρες γίνεται μέσα GUI εφαρμογές, γιατί θα χρειαστείτε λειτουργίες I / O για κείμενο; Δεν είναι μόνο αυτό κονσόλα εφαρμογές; Καλά θα κάνετε πιθανώς το αρχείο I / O και μπορείτε να τα χρησιμοποιήσετε εκεί καθώς και, αλλά και αυτό που είναι η έξοδος στην οθόνη συνήθως χρειάζεται επίσης τη μορφοποίηση. Οι ροές είναι ένας πολύ ευέλικτος τρόπος χειρισμού εισόδου και εξόδου και μπορεί να λειτουργήσει με

  • Κείμενο I / O. Όπως στις εφαρμογές κονσόλας.
  • Χορδές. Εύχρηστο για μορφοποίηση.
  • Αρχείο I / O.

Χειριστές πάλι

Αν και χρησιμοποιούμε το ostream τάξη, είναι α κλάσης από το ios κατηγορία που προέρχεται από το ios_base. Αυτή η τάξη των προγόνων ορίζει το κοινό λειτουργίες που είναι χειριστές.

03

του 08

Κατάλογος των χειριστών Cout

Οι χειριστές μπορούν να οριστούν σε ροές εισόδου ή εξόδου. Αυτά είναι αντικείμενα που επιστρέφουν αναφορά στο αντικείμενο και τοποθετούνται μεταξύ ζευγών <<. Οι περισσότεροι από τους χειριστές δηλώνονται στο, αλλά endl, τελειώνει και ξεπλύνετε προέρχομαι . Αρκετοί χειριστές λαμβάνουν μια παράμετρο και αυτοί προέρχονται από .

Ακολουθεί μια πιο λεπτομερής λίστα.

Από

  • endl - Τερματίζει τη γραμμή και καλεί τα flush.
  • άκρα - Ένθετα '\ 0' ( ΜΗΔΕΝΙΚΟ) στο ρεύμα.
  • flush - Δέσε την προσωρινή έξοδο του buffer.

Από . Τα περισσότερα δηλώνονται στο ο πρόγονος του . Έχω ομαδοποιήσει τους κατά λειτουργίες και όχι αλφαβητικά.

  • boolalpha - Εισάγετε ή εξαγάγετε αντικείμενα bool ως "true" ή "false".
  • noboolalpha - Εισαγωγή ή εξαγωγή αντικειμένων bool ως αριθμητικές τιμές.
  • fixed - Εισάγετε τιμές κινητής υποδιαστολής σε σταθερή μορφή.
  • επιστημονική - Εισαγωγή αξιών κυμαινόμενου σημείου σε επιστημονική μορφή.
  • εσωτερική - Εσωτερική-δικαιολογούν.
  • αριστερά - Αριστερά-δικαιολογήστε.
  • δεξιά - δικαιολογημένη.
  • dec - Εισαγωγή ή εξαγωγή ακέραιων τιμών σε δεκαδική μορφή.
  • hex - Εισαγωγή ή εξαγωγή τιμών ακέραιας σε δεκαεξαδική μορφή (βάση 16).
  • Οκτ - Εισάγετε ή εξαγάγετε τις τιμές σε οκταδικό σχήμα (βάση 8).
  • noshowbase - Μην προφέρετε την τιμή με τη βάση της.
  • showbase - Τιμή προθέματος με τη βάση του.
  • noshowpoint - Μην εμφανίζετε υποδιαστολή εάν δεν είναι απαραίτητο.
  • Παρουσίαση - Εμφανίζεται πάντα υποδιαστολή κατά την εισαγωγή των τιμών κινητής υποδιαστολής.
  • noshowpos - Μην εισάγετε το σύμβολο συν (+) εάν ο αριθμός> = 0.
  • showpos - Εισαγάγετε το σύμβολο συν (+) εάν ο αριθμός> = 0.
  • noskipws - Μην παραλείψετε τον αρχικό λευκό χώρο στην εξαγωγή.
  • skipws - Παράλειψη αρχικού λευκού χώρου κατά την εξαγωγή.
  • nouppercase - Μην αντικαθιστάτε τα πεζά γράμματα με κεφαλαία ισοδύναμα.
  • κεφαλαία - Αντικαταστήστε τα πεζά γράμματα με κεφαλαία ισοδύναμα.
  • μονάδαbuf - Flush buffer μετά από ένα ένθετο.
  • nounitbuf - Μην ξεπλύνετε το buffer μετά από κάθε ένθετο.

04

του 08

Παραδείγματα χρησιμοποιώντας Cout

// ex2_2cpp. #include "stdafx.h" #περιλαμβάνωχρησιμοποιώντας τον χώρο ονομάτων std. int κύρια (int argc, char * argv []) { cout.width (10). cout << δεξιά << «Δοκιμή» << endl; cout << αριστερά << «Δοκιμή 2» << endl; cout << εσωτερική << «Δοκιμή 3» << endl; cout << endl; cout.precision (2). cout << 45.678 << endl; cout << κεφαλαία << "David" << endl; cout.precision (8). cout << επιστημονική << endl; cout << 450678762345.123 << endl; cout << σταθερό << endl; cout << 450678762345.123 << endl; cout << showbase << endl; cout << showpos << endl; cout << hex << endl; cout << 1234 << endl; cout << Οκτ << endl; cout << 1234 << endl; cout << dec << endl; cout << 1234 << endl; cout << noshowbase << endl; cout << noshowpos << endl; cout.unsetf (ios:: κεφαλαία); cout << hex << endl; cout << 1234 << endl; cout << Οκτ << endl; cout << 1234 << endl; cout << dec << endl; cout << 1234 << endl; επιστροφή 0? }

Η έξοδος από αυτό είναι κάτω, με ένα ή δύο επιπλέον διαστήματα γραμμής αφαιρεθεί για λόγους σαφήνειας.

 Δοκιμή. Δοκιμή 2. Δοκιμή 3. 46. Δαβίδ. 4.50678762Ε + 011. 450678762345.12299000. 0Χ4ϋ2. 02322. +1234. 4d2. 2322. 1234. 

Σημείωση: Παρά τα κεφαλαία, ο Δαβίδ είναι τυπωμένος ως Δαβίδ και όχι DAVID. Αυτό συμβαίνει επειδή το κεφαλαίο επηρεάζει μόνο την παραγόμενη παραγωγή - π.χ. οι αριθμοί που έχουν εκτυπωθεί δεκαεξαδικό. Έτσι, η έξοδος hex 4d2 είναι 4D2 όταν η κεφαλή είναι σε λειτουργία.

Επίσης, οι περισσότεροι από αυτούς τους χειριστές θέτουν πραγματικά ένα κομμάτι σε μια σημαία και είναι δυνατόν να το ορίσετε απευθείας με

 cout.setf () 

και καθαρίστε το με

 cout.unsetf () 

05

του 08

Χρησιμοποιώντας το Setf και το Unsetf για να χειριστείτε τη μορφοποίηση εισόδου / εξόδου

Η λειτουργία setf έχει δύο υπερφορτωμένο εκδόσεις που εμφανίζονται παρακάτω. Ενώ unsetf απλά καθαρίζει τα καθορισμένα bits.

 setf (σημαίες); setf (σημάδια σημαίας, τιμές μάσκας); unsetf (σημαίες); 

Οι μεταβλητές σημαίες προέρχονται από το ORing μαζί όλα τα κομμάτια που θέλετε με |. Έτσι, αν θέλετε επιστημονικά, κεφαλαία και μπολάλφα τότε χρησιμοποιήστε αυτό. Μόνο τα bits που πέρασαν ως παράμετρο έχουν οριστεί. Τα άλλα δυαδικά ψηφία παραμένουν αμετάβλητα.

 cout.setf (ios_base:: επιστημονικό | ios_base:: κεφαλαίο | ios_base:: boolalpha); cout << hex << endl; cout << 1234 << endl; cout << dec << endl; cout << 123400003744.98765 << endl; τιμή bool = true; cout << αξία << endl; cout.unsetf (ios_base:: boolalpha); cout << αξία << endl; 

Παράγει

 4D2. 1.234000Ε + 011. αληθής. 1. 

Μασκάρισμα μπιτς

Τα δύο παράμετρο η έκδοση του setf χρησιμοποιεί μια μάσκα. Εάν το bit έχει οριστεί τόσο στην πρώτη όσο και στη δεύτερη παράμετρο, τότε τίθεται σε ρύθμιση. Αν το bit είναι μόνο στη δεύτερη παράμετρο, τότε αυτό καθαρίζεται. Οι αξίες πεδίο προσαρμογής, βασικό πεδίο και floatfield (που αναφέρονται παρακάτω) είναι σύνθετες σημαίες, δηλαδή αρκετές σημαίες Ήταν μαζί. Για βασικό πεδίο με τις τιμές 0x0e00 είναι το ίδιο με dec | οκ. | μαγεύω. Έτσι

 setf (ios_base:: hex, ios_basefield). 

διαγράφει και τις τρεις σημαίες και στη συνέχεια ορίζει μαγεύω. Ομοίως adjustfield είναι αριστερά | δικαίωμα | εσωτερικός και floatfield είναι επιστημονική | σταθερός.

Λίστα Bits

Αυτός ο κατάλογος των enums έχει ληφθεί από το Microsoft Visual C ++ 6.0. Οι πραγματικές τιμές που χρησιμοποιούνται είναι αυθαίρετες - ένας άλλος μεταγλωττιστής μπορεί να χρησιμοποιήσει διαφορετικές τιμές.

 skipws = 0x0001. μονάδαbuf = 0x0002. κεφαλαία = 0x0004. showbase = 0x0008. showpoint = 0x0010. showpos = 0x0020. αριστερά = 0x0040. δεξιά = 0x0080. εσωτερική = 0x0100. dec = 0x0200. οκ = 0χ0400. hex = 0x0800. επιστημονική = 0x1000. σταθερή = 0x2000. boolalpha = 0x4000. adjustfield = 0x01c0. βασικό πεδίο = 0x0e00, floatfield = 0x3000. _Fmtmask = 0x7fff, _Fmtzero = 0. 

06

του 08

Σχετικά με τον Clog και τον Cerr

Αρέσει cout, βουλώνω και cerr είναι προκαθορισμένα αντικείμενα που ορίζονται στο ostream. Η κλάση iostream κληρονομεί και από τις δύο ostream και istream γι 'αυτό το λόγο cout παραδείγματα μπορούν να χρησιμοποιήσουν iostream.

Buffered και Unbuffered

  • Buffered - Όλες οι εξόδους αποθηκεύονται προσωρινά σε a ρυθμιστής και στη συνέχεια να πετάξει στην οθόνη με μια κίνηση. Τόσο το cout όσο και το clog είναι ρυθμισμένα.
  • Unbuffered - Όλες οι έξοδοι πηγαίνουν αμέσως στη συσκευή εξόδου. Ένα παράδειγμα ενός αντικειμένου χωρίς σάρωση είναι cerr.

Το παρακάτω παράδειγμα δείχνει ότι το cerr χρησιμοποιείται με τον ίδιο τρόπο όπως το cout.


#περιλαμβάνω χρησιμοποιώντας τον χώρο ονομάτων std. int _tmain (int argc, _TCHAR * argv []) {cerr.width (15). cerr.right; cerr << "Σφάλμα" << endl; επιστροφή 0? }

Το κύριο πρόβλημα με την προσωρινή αποθήκευση, είναι αν το πρόγραμμα τότε τα περιεχόμενα του buffer παραμένουν χαμένα και είναι πιο δύσκολο να καταλάβουμε γιατί συνετρίβη. Η έξοδος χωρίς σάρωση είναι άμεση, ώστε να καταιονίσει μερικές γραμμές όπως αυτή μέσω του κώδικα μπορεί να έρθει χρήσιμη.

 cerr << "Εισαγωγή επικίνδυνης λειτουργίας zappit" << endl; 

Το πρόβλημα καταγραφής

Η δημιουργία ενός αρχείου καταγραφής των συμβάντων του προγράμματος μπορεί να είναι ένας χρήσιμος τρόπος για να εντοπίσετε τα δύσκολα σφάλματα - τον τύπο που συμβαίνει μόνο τώρα. Αν όμως το συμβάν αυτό είναι συντριβή, έχετε το πρόβλημα - εκκαθαρίστε το αρχείο καταγραφής στο δίσκο μετά από κάθε κλήση, ώστε να μπορείτε να δείτε τα συμβάντα μέχρι τη συντριβή ή να τη διατηρήσετε σε ένα buffer και να ξεπλύνετε περιοδικά το buffer και να ελπίζετε ότι δεν θα χάσετε πάρα πολύ όταν η συντριβή λαμβάνει χώρα?

07

του 08

Χρήση του Cin για εισαγωγή: μορφοποιημένη εισαγωγή

Υπάρχουν δύο τύποι εισόδου.

  • Διαμορφωμένο. Ανάγνωση εισόδου ως αριθμούς ή συγκεκριμένου τύπου.
  • Μη μορφοποιημένο. Ανάγνωση bytes ή χορδές. Αυτό δίνει πολύ μεγαλύτερο έλεγχο στη ροή εισόδου.

Εδώ είναι ένα απλό παράδειγμα μορφοποιημένης εισόδου.

 // excin_1.cpp: Ορίζει το σημείο εισόδου για την εφαρμογή κονσόλας. #include "stdafx.h" // Microsoft μόνο. #περιλαμβάνω χρησιμοποιώντας τον χώρο ονομάτων std. int κύρια (int argc, char * argv []) { int a = 0; πλωτήρας b = 0,0; int c = 0; cout << "Παρακαλώ Εισαγάγετε ένα int, ένα float και int διαχωρισμένο με κενά" <> α >> β >> γ; cout << "Είσατε" << a << "" << b << "" << c << endl; επιστροφή 0? }

Αυτό χρησιμοποιεί τον cin για να διαβάσει τρεις αριθμούς (int, φλοτέρ, int) διαχωρισμένα με κενά. Πρέπει να πατήσετε το πλήκτρο Enter μετά την πληκτρολόγηση του αριθμού.

3 7.2 3 θα εξάγει "Εισήγατε 3 7.2 3".

Η μορφοποιημένη εισαγωγή έχει περιορισμούς!

Εάν εισάγετε 3.76 5 8, θα λάβετε "Εισήγατε 3 0.76 5", όλες οι άλλες τιμές στη γραμμή αυτή θα χαθούν. Αυτό συμπεριφέρεται σωστά, όπως το. δεν είναι μέρος του int και έτσι σηματοδοτεί την έναρξη του πλωτήρα.

Σφάλμα παγίδευσης

Το αντικείμενο cin θέτει ένα bit αποτυχίας αν η είσοδος δεν μετατράπηκε επιτυχώς. Αυτό το κομμάτι είναι μέρος του ios και μπορεί να διαβαστεί με τη χρήση του αποτυγχάνω() λειτουργία και στα δύο cin και cout σαν αυτό.

 αν (cin.fail ()) // κάνει κάτι. 

Δεν αποτελεί έκπληξη, cout.fail () σπάνια ρυθμίζεται, τουλάχιστον στην έξοδο οθόνης. Σε ένα μεταγενέστερο μάθημα στο αρχείο I / O, θα δούμε πώς cout.fail () μπορεί να γίνει πραγματικότητα. Υπάρχει επίσης α Καλός() λειτουργία για cin, cout και τα λοιπά.

instagram story viewer