Οντοκεντρικόσ Ρρογραμματιςμόσ Ενότθτα 9: C++ ΕΙΣΟΔΟΣ - ΕΞΟΔΟΣ / ΑΛΦΑΙΘΜΗΤΙΚΑ / ΑΧΕΙΑ Διαχείριςθ Αρχείων Ιωάννθσ Χατηθλυγεροφδθσ Ρολυτεχνικι Σχολι Τμιμα Μθχανικϊν Η/Υ & Ρλθροφορικισ
Διαχείριςθ Αρχείων
Ιεραρχία Δεδομζνων Από μικρότερα ςε μεγαλφτερα: o Bit (δυαδικό ψθφίο 1 ι 0) o Byte: 8 bits Μπορεί να αποκθκεφςει ζναν χαρακτιρα (char) Unicode για μεγάλα ςετ χαρακτιρων (wchar_t) o Ρεδίο (Field): γκρουπ χαρακτιρων με κάποιο νόθμα (πχ ζνα όνομα) o Εγγραφι (Record): ομάδα από ςχετικά πεδία (struct ι class ςτθν C++) o Αρχείο (File): ομάδα ςχετικϊν εγγραφϊν o Βάςθ Δεδομζνων (Database): ομάδα ςχετικϊν αρχείων 3/18
Αρχεία ςτθν C++ Η C++ χειρίηεται τα αρχεία ωσ αλλθλουχία bytes o το τζλοσ ςθματοδοτείται με: end-of-file 0 1 2 3 4 5 6 7 8 9... n-1... end-of-file marker Πταν ανοίγει ζνα αρχείο o Δθμιουργείται αντικείμενο και ςυνδζεται με ζνα κανάλι (stream) o cin, cout, κτλ. όταν περιλαμβάνεται θ <iostream> 4/18
Κανάλια - Streams Για να διαχειριςτοφμε ζνα αρχείο: o Κάνουμε include τισ <iostream> και <fstream> o Class templates basic_ifstream (είςοδοσ) basic_ofstream (ζξοδοσ) basic_fstream (I/O) o typedefs ειδικά για char I/O ifstream (είςοδοσ char) ofstream (εξοδοσ char) fstream (char I/O) 5/18
Τρόποι ανοίγματοσ αρχείου Τρόποι ανοίγματοσ αρχείου (File-open modes) Mode Description ios::app ios::ate ios::in ios::out ios::trunc ios::binary o ofstream για ζξοδο Εγγραθή ζηο ηέλος ηοσ αρτείοσ Άνοιγμα αρτείοσ για εγγραθή και μεηαθορά ζηο ηέλος ηοσ αρτείοσ. Μπορεί να γίνει εγγραθή ζε οποιοδήποηε ζημείο ηοσ αρτείοσ. Άνοιγμα αρτείοσ για είζοδο Άνοιγμα αρτείοσ για εγγραθή Διαγραθή ηων περιετόνηων ηοσ αρτείοσ αν σπάρτει (προκαθοριζμένη ζσμπεριθορά και ηοσ ios::out) Ανοίγει αρτείο για δσαδική ανάγνωζη/εγγραθή (π.τ., ότι κείμενο) ofstream outclientfile("persons.dat", ios::out ); ofstream outclientfile("persons.dat"); 6/18
Παράδειγμα Ζξοδοσ #include <iostream> using std::cout; using std::cin; using std::ios; using std::cerr; using std::endl; #include <fstream> using std::ofstream; #include <cstdlib> int main(){ ofstream outclientfile("persons.dat", ios::out ); if (!outclientfile ) { cerr << "File could not be opened" << endl; return 1; } char name[30]; int age; while ( cin >> name >> age ) outclientfile << name <<' '<< age<< endl; return 0; } 7/18
Παράδειγμα Είςοδοσ #include <iostream> using std::cout; using std::ios; using std::cerr; using std::endl; #include <fstream> using std::ifstream; #include <iomanip> #include <cstdlib> int main(){ ifstream inclientfile("persons.dat", ios::in ); if (!inclientfile ) { cerr << "File could not be opened" << endl; return 1; } char name[ 30 ]; int age; while ( inclientfile >> name >> age ) cout << name << ' ' << age << endl; return 0; } 8/18
Δείκτεσ ςε κζςθ αρχείου Δείκτεσ ςε κζςθ ςτο αρχείο o Number of next byte to read/write o Συναρτιςεισ αλλαγισ κζςθσ του δείκτθ seekg (seek get τθσ istream class) seekp (seek put τθσ ostream class) Οι κλάςεισ διακζτουν "get και "put" δείκτεσ o seekg και seekp παίρνουν ωσ ορίςματα: Offset: αρικμόσ bytes Direction (προκακοριςμζνθ τιμι ios::beg) ios::beg ςε ςχζςθ με τθν αρχι του αρχείου ios::cur ςε ςχζςθ με τθν τρζχουςα κζςθ ios::end ςε ςχζςθ με το τζλοσ 9/18
Άνοιγμα Αρχείου Η C++ δεν αναγκάηει ςυγκεκριμζνθ δομι ςτο αρχείο o Η ζννοια μιασ εγγραφισ κακορίηεται/υλοποιείται από τον προγραμματιςτι Για να ανοίξει το αρχείο δθμιουργείται αντικείμενο o δθμιουργεί «γραμμι επικοινωνίασ" από το αντικείμενο ςτο αρχείο o Κλάςεισ ifstream (μόνο για είςοδο) ofstream (μόνο για ζξοδο) fstream (I/O) o Οι δθμιουργοί παίρνουν ωσ παραμζτρουσ το όνομα του αρχείου ( file name) και τον τρόπο (file-open mode) ofstream outclientfile( "filename", fileopenmode ); o Για να ανοίξουμε ζνα αρχείο αργότερα (αφοφ δθμιουργιςουμε το αντικείμενο): Ofstream outclientfile; outclientfile.open( "filename", fileopenmode); 10/18
Παραδείγματα seekg Ραραδείγματα o fileobject.seekg(0) Ρθγαίνει ςτθν αρχι του αρχείου (location 0), προκακοριςμζνο: ios::beg o fileobject.seekg(n) Ρθγαίνει ςτο n-οςτό byte από τθν αρχι o fileobject.seekg(n, ios::cur) Μεταφζρεται n bytes μπροςτά o fileobject.seekg(y, ios::end) Ρθγαίνει πίςω y bytes από το τζλοσ o fileobject.seekg(0, ios::cur) Ρθγαίνει ςτο τελευταίο byte o seekp (όμοια) 11/18
Πρόςκετο Υλικό Μελετιςτε και τα παραδείγματα από το Κεφάλαιο 14 του βιβλίου: «C++ How to Program, 9/e Paul & Harvey Deitel» http://media.pearsoncmg.com/ph/esm/deitel/cpp_htp_9/code_examples/code_examples.zip 12/18
Χρθματοδότθςθ Το παρόν εκπαιδευτικό υλικό ζχει αναπτυχκεί ςτo πλαίςιo του εκπαιδευτικοφ ζργου του διδάςκοντα. Το ζργο «Ανοικτά Ακαδθμαϊκά Μακιματα ςτο Πανεπιςτιμιο Ακθνών» ζχει χρθματοδοτιςει μόνο τθν αναδιαμόρφωςθ του εκπαιδευτικοφ υλικοφ. Το ζργο υλοποιείται ςτο πλαίςιο του Επιχειρθςιακοφ Ρρογράμματοσ «Εκπαίδευςθ και Δια Βίου Μάκθςθ» και ςυγχρθματοδοτείται από τθν Ευρωπαϊκι Ζνωςθ (Ευρωπαϊκό Κοινωνικό Ταμείο) και από εκνικοφσ πόρουσ. 13/18
Σθμείωμα Ιςτορικοφ Εκδόςεων Ζργου Το παρόν ζργο αποτελεί τθν ζκδοςθ 1.0. 14/18
Σθμείωμα Αναφοράσ Copyright: Ρανεπιςτιμιον Ρατρϊν, Ιωάννθσ Χατηθλυγεροφδθσ, 2015. «Οντοκεντρικόσ Ρρογραμματιςμόσ». Ζκδοςθ: 1.0. Ράτρα 2015. Διακζςιμο από τθ δικτυακι διεφκυνςθ: https://eclass.upatras.gr/courses/ceid1105/ 15/18
Σθμείωμα Αδειοδότθςθσ Το παρόν υλικό διατίκεται με τουσ όρουσ τθσ άδειασ χριςθσ Creative Commons Αναφορά, Μθ Εμπορικι Χριςθ Ραρόμοια Διανομι 4.0 *1+ ι μεταγενζςτερθ, Διεκνισ Ζκδοςθ. Εξαιροφνται τα αυτοτελι ζργα τρίτων π.χ. φωτογραφίεσ, διαγράμματα κ.λ.π., τα οποία εμπεριζχονται ςε αυτό και τα οποία αναφζρονται μαηί με τουσ όρουσ χριςθσ τουσ ςτο «Σθμείωμα Χριςθσ Ζργων Τρίτων». [1] http://creativecommons.org/licenses/by-nc-sa/4.0/ Ωσ Μθ Εμπορικι ορίηεται θ χριςθ: που δεν περιλαμβάνει άμεςο ι ζμμεςο οικονομικό όφελοσ από τθν χριςθ του ζργου, για το διανομζα του ζργου και αδειοδόχο που δεν περιλαμβάνει οικονομικι ςυναλλαγι ωσ προχπόκεςθ για τθ χριςθ ι πρόςβαςθ ςτο ζργο που δεν προςπορίηει ςτο διανομζα του ζργου και αδειοδόχο ζμμεςο οικονομικό όφελοσ (π.χ. διαφθμίςεισ) από τθν προβολι του ζργου ςε διαδικτυακό τόπο Ο δικαιοφχοσ μπορεί να παρζχει ςτον αδειοδόχο ξεχωριςτι άδεια να χρθςιμοποιεί το ζργο για εμπορικι χριςθ, εφόςον αυτό του ηθτθκεί.
Διατιρθςθ Σθμειωμάτων Οποιαδιποτε αναπαραγωγι ι διαςκευι του υλικοφ κα πρζπει να ςυμπεριλαμβάνει: το Σθμείωμα Αναφοράσ το Σθμείωμα Αδειοδότθςθσ τθ διλωςθ Διατιρθςθσ Σθμειωμάτων το Σθμείωμα Χριςθσ Ζργων Τρίτων (εφόςον υπάρχει) μαηί με τουσ ςυνοδευόμενουσ υπερςυνδζςμουσ. 17/18
Σθμείωμα Χριςθσ Ζργων Τρίτων Οι διαφάνειεσ βαςίηονται ςτο βιβλίο «C++ How to Program, 8th Edition, Harvey M. Deitel, Paul J. Deitel, Prentice Hall.» 18/18