Οντοκεντρικόσ Ρρογραμματιςμόσ Ενότθτα 9: C++ ΕΙΣΟΔΟΣ - ΕΞΟΔΟΣ / ΑΛΦΑΙΘΜΗΤΙΚΑ / ΑΧΕΙΑ Κανάλια Ειςόδου - Εξόδου Ιωάννθσ Χατηθλυγεροφδθσ Ρολυτεχνικι Σχολι Τμιμα Μθχανικϊν Η/Υ & Ρλθροφορικισ
Είςοδοσ / Ζξοδοσ (Streams)
Βιβλιοκικθ iostream Βιβλιοκικθ iostream o Ρεριζχει εκατοντάδεσ βιβλιοκικεσ για δυνατότθτεσ Ειςόδου/Εξόδου o <iostream.h> Κφρια Είςοδοσ (cin) Κφρια Ζξοδοσ (cout) Unbuffered error (cerr) Buffered error (clog) o <iomanip.h> o Μορφοποιθμζνθ Είςοδοσ/Ζξοδοσ με stream manipulators <fstream.h> Λειτουργίεσ επεξεργαςίασ αρχείων 3/29
Βιβλιοκικθ iostream H βιβλιοκικθ iostream διακζτει templates: o basic_istream (είςοδοσ από κανάλι - stream) o basic_ostream (ζξοδοσ ςε κανάλι - stream) o basic_iostream (είςοδοσ και ζξοδοσ απο/ςε κανάλι) Η typedef ορίηει ψευδϊνυμα για τφπουσ δεδομζνων o typedef Card *CardPtr; CardPtr ςυνϊνυμο με Card * o typedefs istream, ostream, iostream Επιτρζπουν είςοδο/ζξοδο χαρακτιρων 4/29
Κφρια Κανάλια Τελεςτζσ << και >> o Τελεςτζσ ειςόδου και εξόδου από κανάλι (stream) cin o o o cout o o o Είναι αντικείμενο istream Συνδζεται με τθν κφρια είςοδο (ςυνικωσ το πλθκτρολόγιο) cin >> var; Ο Compiler αποφαςίηει τον τφπο τθσ μεταβλθτισ var Καλεί τθν κατάλλθλθ υπερφορτωμζνθ ςυνάρτθςθ Είναι αντικείμενο ostream object Συνδζεται με τθν κφρια ζξοδο (ςυνικωσ θ οκόνθ) cout << var; Πμοια cerr, clog o o o o Aντικείμενα ostream Σφνδεςθ με το κυρίωσ κανάλι ςφαλμάτων Το cerr βγάηει τθν ζξοδο απευκείασ Το clog κρατάει τθν ζξοδο ςε buffer 5/29
Επεξεργαςία Αρχείων H επεξεργαςία αρχείων ςτθν C++ είναι παρόμοια: o Class templates basic_ifstream (είςοδοσ από αρχείο) basic_ofstream (ζξοδοσ ςε αρχείο) basic_fstream (είςοδοσ και ζξοδοσ απο/ςε αρχείο) o Επιτρζπουν είςοδο/ζξοδο χαρακτιρων: typedefs ifstream ofstream fstream 6/29
Είςοδοσ / Ζξοδοσ Ζξοδοσ o Χριςθ ostream o Χριςθ του τελεςτι << για τουσ βαςικοφσ τφπουσ o Χαρακτιρεσ (χριςθ τθσ ςυνάρτθςθσ put) o Ακζραιοι (δεκαδικοί, οκταδικοί, δεκαεξαδικοί) o Κινθτισ Υποδιαςτολισ Ακρίβεια, δεκαδικά ψθφία, επιςτθμονικι ςιμανςθ o Justified, padded data o Ζλεγχοσ κεφαλαίων/πεηϊν Είςοδοσ o Χριςθ istream o Χριςθ του τελεςτι >> o Επιςτρζφει 0 όταν ςυναντιςει EOF Διαφορετικά επιςτρζφει αναφορά ςε αντικείμενοj cin >> var o Αν προκφψει ςφάλμα ενθμερϊνονται τα State bits 7/29
Είςοδοσ Χαρακτιρα get ςυνάρτθςθ o cin.get() o Επιςτρζφει ζναν χαρακτιρα ι EOF End-of-file (EOF) o ςθματοδοτεί το τζλοσ τθσ ειςόδου0 o Ανάλογα το ςφςτθμα: ctrl-z ι ctrl-d o cin.eof() Επιςτρζφει 1 (true) αν ζχει ςυμβεί το EOF 8/29
Παράδειγμα #include <iostream> using std::cout; using std::cin; using std::endl; int main() { int character; cout << "EOF" << cin.eof() << endl while ( ( character = cin.get() )!= EOF ) cout.put( character ); cout << "\neof in this system is: " << character << endl; cout << "EOF" << cin.eof() << endl return 0; } cin.eof:0 test sentence test sentence ^Z Last Charachter entered (EOF): -1 cin.eof::1 9/29
Είςοδοσ χαρακτιρα/ων get(charref) o Ωσ όριςμα παίρνει χαρακτιρα με αναφορά o Ανακτά ζναν χαρακτιρα και τον αποκθκεφει ςτθν charref Returns reference to istream Επιςτρζφει -1, αν διαβάςει EOF get(chararray, size, delimiter) o Διαβάηει ζωσ size-1 χαρακτιρεσ, μζχρι να ςθναντιςει τον χαρακτιρα delimeter Αν δεν δοκεί delimiter κεωρείται ο '\n' Ο delimeter παραμζνει ςτο κανάλι ειςόδου Μπορεί να αφαιρεκεί με cin.get() or cin.ignore() o Τερματίηει το chararray με τον χαρακτιρα τερματιςμοφ '\0 getline(array, size, delimiter) o o Πμοια με τθν παραπάνω get με τα ίδια ορίςματα Αφαιρεί τον χαρακτιρα delimeter από το κανάλι ειςόδου 10/29
Παράδειγμα #include <iostream> using std::cout; using std::cin; using std::endl; int main(){ char buf1[ 60 ]; char buf2[ 60 ]; cout<<"your Sentence:"; cin >> buf1; cout <<"Buf1:" buf1 <<endl; cin.get( buf2, 60 ); cout <<"Buf2:" buf2 ; } Your Sentence:Soon comes the cold, and the night that never ends. Buf1:Soon Buf2: comes the cold, and the night that never ends. 11/29
Είςοδοσ χαρακτιρα/ων ignore() o Αφαιρεί χαρακτιρεσ από το κανάλι ειςόδου (default 1) o Σταματάει όταν ςυναντιςει delimeter (Default EOF) putback() o Τοποκετεί πίςω ςτο κανάλι τον χαρακτιρα που ανακτικθκε με τθν get() peek() o Επιςτρζφει τον επόμενο χαρακτιρα του καναλιοφ, χωρίσ να τον αφαιρζςει 12/29
Error Bits Οι τελεςτζσ << και >> είναι υπερφορτωμζνοι ϊςτε να αποδζχονται διάφορουσ τφπουσ Αν προκφψουν μθ αναμενόμενου τφπου δεδομζνα τότε ενθμερϊνονται κατάλλθλα Error Bits τα οποία μποροφμε να ελζγξουμε για να διαπιςτϊςουμε αν απζτυχε θ εντολι. 13/29
Είςοδοσ / ζξοδοσ Bytes read (istream) Είςοδοσ bytes ςε πίνακα χαρακτιρων Αν δεν ανακτθκοφν αρκετοί χαρακτιρεσ ενθμερϊνεται το failbit Η gcount() επιςτρζφει πόςοι χαρακτιρεσ ανακτικθκαν ςτθν τελευταία εντολι ειςόδου write (ostream) Ζξοδοσ bytes από πίνακα χαρακτιρων μζχρι να ςυναντιςει null 14/29
String Manipulators Οι παραποιθτζσ καναλιοφ επιτελοφν λειτουργίεσ μορφοποίθςθσ όπωσ: o Ρλάτοσ (ςε χαρακτιρεσ) o Ακρίβεια αρικμϊν (Precision) o Σθμαίεσ Μορφοποίθςθσ o Γζμιςμα χαρακτιρων o Flushing καναλιοφ o Είςοδοσ νζασ γραμμισ ςε κανάλι εξόδου o Αγνόθςθ κενϊν από κανάλι ειςόδου 15/29
Παραποίθςθ Ακεραίων Κανονικά θ βάςθ των ακεραίων κεωρείται το 10 o Μποροφμε να αλλάξουμε βάςθ με χριςθ των: hex (βάςθ το 16) oct (βάςθ το 8) dec (επαναφζρει ωσ βάςθ το 10) o cout << hex << myint o setbase(newbase) ςυνάρτθςθ Δφνατζσ τιμζσ: 8, 10, or 16 o Η παραποίθςθ ιςχφει μζχρι να τθν αλλάξουμε ρθτά. int number; cin >> number; cout << number << " in hexadecimal is: " << hex << number << endl; 16/29
Παραποίθςθ Δεκαδικών Ραραποίθςθ τθσ ακρίβειασ αρικμϊν κινθτισ υποδιαςτολισ: o Αρικμόσ ψθφίων μετά τθν υποδιαςτολι o setprecision Ωσ όριςμα παίρνει πόςα δεκαδικά ψθφία κα εμφανιςτοφν cout << setprecision(5) o precision ςυνάρτθςθ cout.precision(newprecision) o Η παραποίθςθ ιςχφει μζχρι να τθν αλλάξουμε ρθτά. 17/29
Παραποίθςθ Δεκαδικών width ςυνάρτθςθ (κλάςθσ ios_base) o cin.width(5) o Κακορίηει το πλάτοσ (ςε χαρακτιρεσ) Αρικμόσ χαρακτιρων ςτθν ζξοδο Μζγιςτοσ αρικμόσ ςτθν είςοδο o Εναλλακτικά μπορεί να χρθςιμοποιθκεί ο setw manipulator ( << setw ) o Πταν διαβάηει πίνακα χαρακτιρων διαβάηει ζναν λιγότερο για να τοποκετιςει ςτο τζλοσ το null showpoint o Αναγκάηει δεκαδικοφσ να εκτυπωκοφν με ςυγκεκριμζνο αρικμό χαρακτιρων προςκζτοντασ μθδενικά ςτο τζλοσ (πχ 15.400000 αντί για 15.4) o Επαναφορά με τθν noshowpoint 18/29
Στοίχιςθ / Πρόςθμο left manipulator o Στοίχιςθ αριςτερά με γζμιςμα των κζςεων δεξιά right manipulator o Στοίχιςθ δεξιά με γζμιςμα των κζςεων αριςτερά internal o Το πρόςθμο ςτοιχίηεται αριςτερά, θ τιμι δεξιά + 123 showpos o υποχρεϊνει τθν εκτφπωςθ του προςιμου o Επαναφορά με noshowpos 19/29
Χαρακτιρασ γεμίςματοσ Οριςμόσ του χαρακτιρα που κα χρθςιμοποιθκεί όταν χρειαςτεί να καλυφκοφν κζςεισ o fill cout.fill('*') o setfill ςυνάρτθςθ manipulator << setfill( '^' ) 20/29
Κεφαλαία / Πεηά uppercase manipulator o Μετατρζπει χαρακτιρεσ ςε κεφαλαία o lowercase θ προκακοριςμζνθ ςυμπεριφορά o Επαναφορά με nouppercase 21/29
Ζλεγχοσ Σφαλμάτων o rdstate() ςυνάρτθςθ Επιςτρζφει τθν κατάςταςθ ςφαλμάτων του καναλιοφ Ελζγχει για goodbit, badbit, etc. Συνιςτάται θ χριςθ των: good(), bad() o clear() ςυνάρτθςθ Ρροκακοριςμζνθ τιμι ορίςματοσ: goodbit Θζτει τθν κατάςταςθ ςε "good, ϊςτε να ςυνεχίςει θ είςοδοσ/ζξοδοσ Can pass other values cin.clear( ios::failbit ) Αλλάηει τιμι ςτο failbit 22/29
Πρόςκετο Υλικό Μελετιςτε και τα παραδείγματα από το Κεφάλαιο 13 του βιβλίου: «C++ How to Program, 9/e Paul & Harvey Deitel» http://media.pearsoncmg.com/ph/esm/deitel/cpp_htp_9/code_examples/code_examples.zip 23/29
Χρθματοδότθςθ Το παρόν εκπαιδευτικό υλικό ζχει αναπτυχκεί ςτo πλαίςιo του εκπαιδευτικοφ ζργου του διδάςκοντα. Το ζργο «Ανοικτά Ακαδθμαϊκά Μακιματα ςτο Πανεπιςτιμιο Ακθνών» ζχει χρθματοδοτιςει μόνο τθν αναδιαμόρφωςθ του εκπαιδευτικοφ υλικοφ. Το ζργο υλοποιείται ςτο πλαίςιο του Επιχειρθςιακοφ Ρρογράμματοσ «Εκπαίδευςθ και Δια Βίου Μάκθςθ» και ςυγχρθματοδοτείται από τθν Ευρωπαϊκι Ζνωςθ (Ευρωπαϊκό Κοινωνικό Ταμείο) και από εκνικοφσ πόρουσ. 24/29
Σθμείωμα Ιςτορικοφ Εκδόςεων Ζργου Το παρόν ζργο αποτελεί τθν ζκδοςθ 1.0. 25/29
Σθμείωμα Αναφοράσ Copyright: Ρανεπιςτιμιον Ρατρϊν, Ιωάννθσ Χατηθλυγεροφδθσ, 2015. «Οντοκεντρικόσ Ρρογραμματιςμόσ». Ζκδοςθ: 1.0. Ράτρα 2015. Διακζςιμο από τθ δικτυακι διεφκυνςθ: https://eclass.upatras.gr/courses/ceid1105/ 26/29
Σθμείωμα Αδειοδότθςθσ Το παρόν υλικό διατίκεται με τουσ όρουσ τθσ άδειασ χριςθσ Creative Commons Αναφορά, Μθ Εμπορικι Χριςθ Ραρόμοια Διανομι 4.0 *1+ ι μεταγενζςτερθ, Διεκνισ Ζκδοςθ. Εξαιροφνται τα αυτοτελι ζργα τρίτων π.χ. φωτογραφίεσ, διαγράμματα κ.λ.π., τα οποία εμπεριζχονται ςε αυτό και τα οποία αναφζρονται μαηί με τουσ όρουσ χριςθσ τουσ ςτο «Σθμείωμα Χριςθσ Ζργων Τρίτων». [1] http://creativecommons.org/licenses/by-nc-sa/4.0/ Ωσ Μθ Εμπορικι ορίηεται θ χριςθ: που δεν περιλαμβάνει άμεςο ι ζμμεςο οικονομικό όφελοσ από τθν χριςθ του ζργου, για το διανομζα του ζργου και αδειοδόχο που δεν περιλαμβάνει οικονομικι ςυναλλαγι ωσ προχπόκεςθ για τθ χριςθ ι πρόςβαςθ ςτο ζργο που δεν προςπορίηει ςτο διανομζα του ζργου και αδειοδόχο ζμμεςο οικονομικό όφελοσ (π.χ. διαφθμίςεισ) από τθν προβολι του ζργου ςε διαδικτυακό τόπο Ο δικαιοφχοσ μπορεί να παρζχει ςτον αδειοδόχο ξεχωριςτι άδεια να χρθςιμοποιεί το ζργο για εμπορικι χριςθ, εφόςον αυτό του ηθτθκεί.
Διατιρθςθ Σθμειωμάτων Οποιαδιποτε αναπαραγωγι ι διαςκευι του υλικοφ κα πρζπει να ςυμπεριλαμβάνει: το Σθμείωμα Αναφοράσ το Σθμείωμα Αδειοδότθςθσ τθ διλωςθ Διατιρθςθσ Σθμειωμάτων το Σθμείωμα Χριςθσ Ζργων Τρίτων (εφόςον υπάρχει) μαηί με τουσ ςυνοδευόμενουσ υπερςυνδζςμουσ. 28/29
Σθμείωμα Χριςθσ Ζργων Τρίτων Οι διαφάνειεσ βαςίηονται ςτο βιβλίο «C++ How to Program, 8th Edition, Harvey M. Deitel, Paul J. Deitel, Prentice Hall.» 29/29