Αρχεία & Ρεύματα ΑΡΧΕΙΑ & ΡΕΥΜΑΤΑ. Γεώργιος Παπαϊωάννου (2013-14) gepap@aueb.gr

Σχετικά έγγραφα
Streams Input / Output in C++ George Kastrinis

Προγραμματισμός Ι. Είσοδος/Έξοδος. Δημήτρης Μιχαήλ. Ακ. Έτος Τμήμα Πληροφορικής και Τηλεματικής Χαροκόπειο Πανεπιστήμιο

Διάλεξη 18η: Διαχείρηση Αρχείων

Δομημένος Προγραμματισμός. Τμήμα Επιχειρηματικού Σχεδιασμού και Πληροφοριακών Συστημάτων

ιαφάνειες παρουσίασης #6 (β)

(Κεφάλαιο 2.7 και 12) Αρχεία στην C. (Διάλεξη 15)

Εργαστήριο 9: Αρχεία

S, (5, -3, 34, -23, 7) ( *, _

ΣΤΟΙΧΕΙΑ ΤΗΣ ΓΛΩΣΣΑΣ C++ Constructors, Destructors, Pointers IO Streams, File Streams

Προγραμματισμός Η/Υ (ΤΛ2007 )

Μεθόδων Επίλυσης Προβλημάτων

Προγραμματισμός Υπολογιστών & Υπολογιστική Φυσική

Περιεχόμενα. Πρόλογος... 21

Συμβολοσειρές ΣΥΜΒΟΛΟΣΕΙΡΕΣ. Γεώργιος Παπαϊωάννου ( )

Διαδικασιακός Προγραμματισμός

(Κεφάλαιο 2.7 και 12) Αρχεία στην C. ( ιάλεξη 13) ιδάσκων: ηµήτρης Ζεϊναλιπούρ

ΒΑΣΙΚΟΙ ΤΥΠΟΙ ΚΑΙ ΠΙΝΑΚΕΣ

Λύβας Χρήστος Αρχική επιµέλεια Πιτροπάκης Νικόλαος και Υφαντόπουλος Νικόλαος

Δομημένος Προγραμματισμός (ΤΛ1006)

Προγραμματισμός Υπολογιστών με C++

Κεφάλαιο VΙ: Προσπέλαση Αρχείων. 5.1 Αρχεία δεδομένων.

Εισαγωγή στον Προγραμματισμό

Χωρική Βάση δεδοµένων Autocad

Οντοκεντρικός Προγραμματισμός

Ενδεικτική περιγραφή μαθήματος

Περιεχόμενα. Πρόλογος... 17

ΕΠΕΞΕΡΓΑΣΙΑ ΑΡΧΕΙΩΝ Λέµε αρχείο

#define, 70, 575 #elif, 580 #else, 580 #endif, 580 #error, 584 #if, 580 #ifdef, 583 #ifndef, 580, 583 #include, 70, 227, 574 #undef, 579

Διάλεξη 3η: Τύποι Μεταβλητών, Τελεστές, Είσοδος/Έξοδος

Συναρτήσεις πρότυπης βιβλιοθήκης 1. Μερικές συνήθεις συναρτήσεις βιβλιοθήκης int atoi(const char *p) int fclose(file *fp)

Ανάπτυξη και Σχεδίαση Λογισμικού

Ανάπτυξη και Σχεδίαση Λογισμικού

Στοιχειώδης προγραμματισμός σε C++

Η πρώτη παράμετρος είναι ένα αλφαριθμητικό μορφοποίησης

Ι Αρχεία δεδομένων, μέρος δεύτερο: δυαδικά αρχεία ΙΙ Δομές δεδομένων (struct)

2 η Διάλεξη C++ Δρ. Χρήστος Δρόσος ΑΕΙ ΠΕΙΡΑΙΑ ΤΤ ΤΜΗΜΑ ΑΥΤΟΜΑΤΙΣΜΟΥ

Διαδικαστικός Προγραμματισμός

Κλήση Συναρτήσεων ΚΛΗΣΗ ΣΥΝΑΡΤΗΣΕΩΝ. Γεώργιος Παπαϊωάννου ( )

Προγραμματισμός Ι. Δυναμική Διαχείριση Μνήμης. Δημήτρης Μιχαήλ. Ακ. Έτος Τμήμα Πληροφορικής και Τηλεματικής Χαροκόπειο Πανεπιστήμιο

Αρχές Προγραμματισμού

Αναφορές, είκτες και Αλφαριθμητικά

Βιβλιοθήκη stdio. Προγραμματισμός II 1

Προγραμματιστικές τεχνικές

Κεφάλαιο 12: Είσοδος και έξοδος δεδομένων σε αρχεία

Προγραμματισμός H/Y Ενότητα 7: Αρχεία. Επικ. Καθηγητής Συνδουκάς Δημήτριος Τμήμα Διοίκησης Επιχειρήσεων (Γρεβενά)

ΑΡ Χ Ε Ι Α Κ Ε Ι Μ Ε Ν Ο Υ (text files)

18. ΡΕΥΜΑΤΑ(STREAMS) ΚΑΙ ΑΡΧΕΙΑ (FILES)

Προγραμματισμός Ι (ΗΥ120)

Εντολές εισόδου - εξόδου. Εισαγωγή στη C++

Αντικειμενοστραφείς Γλώσσες Προγραμματισμού C++ / ROOT

Βιβλιοθήκη stdio. Προγραμματισμός II 1

Στόχοι και αντικείμενο ενότητας. Εκφράσεις. Η έννοια του τελεστή. #2.. Εισαγωγή στη C (Μέρος Δεύτερο) Η έννοια του Τελεστή

4ο σετ σημειώσεων - Χειρισμός αρχείων και structs

Προγραµµατισµός. Αρχεία

Προγραμματισμός Ι (ΗΥ120)

Μεθόδων Επίλυσης Προβλημάτων

Η γλώσσα προγραμματισμού C Χειρισμός αρχείων

HY150a Φροντιστήριο 3 24/11/2017

Δομή Προγράμματος C++, Χειρισμός Μεταβλητών και Συναρτήσεις Εισόδου - Εξόδου

ΗΥ-150. Προγραμματισμός

Προγραμματισμός Η/Υ (ΤΛ2007 )

ΗΥ-150. Προγραμματισμός

Διαδικασιακός Προγραμματισμός

Προγραμματισμός Ι. Χαρακτήρες. Πανεπιστήμιο Πελοποννήσου Τμήμα Πληροφορικής & Τηλεπικοινωνιών

Προγραμματισμός Ι (ΗΥ120)

Προγραµµατιστικές Τεχνικές

Διάλεξη 2. Μεταβλητές - Δομές Δεδομένων - Eίσοδος δεδομένων - Έξοδος: Μορφοποίηση - Συναρτήσεις. Διοργάνωση : ΚΕΛ ΣΑΤΜ

Οντοκεντρικός Προγραμματισμός

i M-1 1. ij f(i, j) N-1. (pixel) 2. M N (x, y) (x, y ) = 256. R(x, y), G(x, y), B(x, y)

Προγραμματισμός σε C. Αρχεία κειμένου (Text files)

Προγραμματισμός Υπολογιστών με C++

ΚΑΛΟΥΠΩΜΑΤΑ & ΜΕΤΑΤΡΟΠΕΣ

Φροντιςτήριο. Linked-List

αρχεία Εξωτερικά αρχεία Ηµερολόγιο υπολογισµών (log-file) εδοµένα από αρχεία m Επιστροφή στο λειτουργικό σύστηµα Επιπρόσθετες εντολές εισόδου/εξόσου

Προγραμματισμός Υπολογιστών με C++

ΑΡΧΕΙΑ ΚΕΙΜΕΝΟΥ ΣΤΗΝ C

ΑΡΧΕΣ ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΥ

ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΣ ΥΠΟΛΟΓΙΣΤΩΝ & ΥΠΟΛΟΓΙΣΤΙΚΗ ΦΥΣΙΚΗ

Δομημένος Προγραμματισμός (ΤΛ1006)

Προγραμματισμός Υπολογιστών με C++

ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΣ ΜΑΘΗΜΑ 2 Ο. Εισαγωγή στην C Εντολές εξόδου Εντολές εισόδου Μορφοποιητές ΣΙΝΑΤΚΑΣ Ι. ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΣ

Προγραμματισμός Η/Υ (ΤΛ2007 )

Προγραμματισμό για ΗΜΥ

ΔΕΙΚΤΕΣ ΚΑΙ ΔΙΕΥΘΥΝΣΕΙΣ

Δομημένος Προγραμματισμός

Γ7.2 Συμβολοσειρές (Strings) Γ Λυκείου Κατεύθυνσης

Εισαγωγή στη C++ Στην ενότητα αυτή θα µελετηθούν τα εξής επιµέρους θέµατα:

Η γλώσσα προγραμματισμού C

Διάλεξη 20: Χαμηλού Επιπέδου Προγραμματισμός II

ΥΠΟΛΟΓΙΣΤΕΣ ΙΙ. Τύποι δεδομένων ΤΥΠΟΙ ΔΕΔΟΜΕΝΩΝ ΠΡΑΞΕΙΣ ΜΕΤΑΒΛΗΤΕΣ. Ακέραιοι αριθμοί (int) Πράξεις μεταξύ ακεραίων αριθμών

Δομημένος Προγραμματισμός

Εγχειρίδιο Συναρτήσεων. Socket *sopen(const int type, const int protocol, const char *host, const char *service)

Η γλώσσα προγραμματισμού C Δυναμική διαχείριση μνήμης

ΥΠΟΛΟΓΙΣΤΕΣ ΙI. Άδειες Χρήσης. Τύποι δεδομένων, μεταβλητές, πράξεις. Διδάσκοντες: Αν. Καθ. Δ. Παπαγεωργίου, Αν. Καθ. Ε. Λοιδωρίκης

Δομημένος Προγραμματισμός (ΤΛ1006)

Εισαγωγή στην πληροφορική

Μετατροπή χαρακτήρων ASCII σε αριθμό (atoi) & διάβασμα, και αποθήκευση του περιεχομένου του στη μνήμη. (Διάλεξη. Πανεπιστήμιο Κύπρου

Δομημένος Προγραμματισμός (ΤΛ1006)

Αντικειμενοστρεφής Προγραμματισμός Ενότητα 8: Αρχεία. Επικ. Καθηγητής Συνδουκάς Δημήτριος Τμήμα Διοίκησης Επιχειρήσεων (Γρεβενά)

test.txt #include <iostream> #include <fstream> int main()

Transcript:

ΑΡΧΕΙΑ & ΡΕΥΜΑΤΑ Γεώργιος Παπαϊωάννου (2013-14) gepap@aueb.gr

Περιγραφή: Τύποι αρχείων Ρεύματα Άνοιγμα ρευμάτων Εγγραφή και ανάγνωση δεδομένων προς/από ένα ρεύμα Διαχείριση και κλείσιμο ρευμάτων Παραδείγματα Τελευταία ενημέρωση: Σεπτέμβριος 2013 Εισαγωγή - 2

Γενικά έχουμε 2 ειδών αρχεία: Κειμένου Δυαδικά (binary) Τα οποία, όπως και στη Java, μπορώ να ανοίξω είτε για ανάγνωση (read), είτε για εγγραφή (write/append), αλλά και για τα δύο Η C και η C++ μου προσφέρουν πολλούς τρόπους πρόσβασης στα αρχεία, από πολύ χαμηλό επίπεδο, μέχρι το ίδιο υψηλό με τη Java 3

Υψηλού επιπέδου αναπαράσταση αρχείων, σωληνώσεων και διαύλων επικοινωνίας (ίδια λογική με τη Java) Ιεραρχία: ios_base ios istream ostream istringstream iostream ifstream ofstream ostringstream fstream stringstream 4

[ i/o ] [ f/string ] stream i/o: input / output. io ή τίποτα: κάνουν και για είσοδο και για έξοδο f/string: Εξειδίκευση στον τύπο του stream: file / string. Ένα ρεύμα τύπου string αποθηκεύει και διαβάζει τα δεδομένα σε ένα buffer χαρακτήρων στη μνήμη Ένα ρεύμα τύπου αρχείου αποθηκεύει και διαβάζει τα δεδομένα στο σύστημα αρχείων 5

Τα ρεύματα μπορεί να περικλείουν σύνθετες δομές ελέγχου και συγχρονισμού, αλλά κατ ελάχιστο, εκφράζουν μια σειριακή δομή αποθήκευσης με: Έναν προσδιοριστή τρέχουσας θέσης στο ρεύμα Ένα σύνολο από σημαίες ελέγχου κατάστασης 01011001 00011000 00001111 00000100 00000001 0 Τρέχουσα θέση eof end of file 6

Έχει μεγάλη σημασία πως έχουμε αποθηκεύσει τα δεδομένα μας σε ένα ρεύμα, διότι καθορίζει τον τρόπο με τον οποίο περιμένουμε να τα διαβάσουμε και το αντίστροφο Για παράδειγμα, έναν αριθμό μπορούμε να τον αποθηκεύσουμε ως κείμενο, αλλά και με την δυαδική του αναπαράσταση: 11001000 200 50 2 48 0 48 0 00110010 00110000 00110000 7

Ανοίγουμε ένα αρχείο μέσω ρεύματος εισόδου ή εξόδου αρχικοποιώντας ένα αντικείμενο τύπου fstream/ifstream/ofstream: #include <fstream> #using namespace std; string filename = log.data ; ofstream file(filename, ofstream::out ofstream::binary); ifstream file2( input_report.txt ); Mode: «μάσκα» επιλογών Mode: εδώ χρησιμοποιούμε προεπιλεγμένες επιλογές 8

ifstream ( const char* filename, ios_base::openmode mode ); ή ifstream (); open( const char* filename, ios_base::openmode mode ); Το mode δίνει παραμέτρους για το άνοιγμα, όπως: ios_base::binary : Ανοίγει το αρχείο ως δυαδικό αντί για αρχείο κειμένου ios_base::app : Προσθέτει (appends) δεδομένα στο τέλος αντί να διαγράφει τα υπάρχοντα ios_base::in / out : Δηλώνει αν στο αρχείο πρόκειται να γράψουμε ή να διαβάσουμε (ή και τα δύο). Ένα ρεύμα ifstream είναι εξ ορισμού ios_base::in αλλά μπορεί να είναι επιπρόσθετα και ios_base::out Μπορώ να συνδυάσω παραμέτρους 9

οfstream ( const char* filename, ios_base::openmode mode ); ή οfstream (); open( const char* filename, ios_base::openmode mode ); Το mode δίνει παραμέτρους για το άνοιγμα, όπως: ios_base::binary : Ανοίγει το αρχείο ως δυαδικό αντί για αρχείο κειμένου ios_base::app : Προσθέτει (appends) δεδομένα στο τέλος αντί να διαγράφει τα υπάρχοντα ios_base::in / out : Δηλώνει αν στο αρχείο πρόκειται να γράψουμε ή να διαβάσουμε (ή και τα δύο). Ένα ρεύμα οfstream είναι εξ ορισμού ios_base::out αλλά μπορεί να είναι επιπρόσθετα και ios_base::in Μπορώ να συνδυάσω παραμέτρους 10

Ειδικά για τα ρεύματα αρχείων (ifstream, ofstream, fstream), υπάρχει η μέθοδος close() που κλείνει και αποδεσμεύει το αρχείο από την εφαρμογή μας Είναι απαραίτητο για την ομαλή λειτουργία της εφαρμογής και της συνεργασίας της με άλλες να κλείνουμε τα ρεύματα αρχείων αμέσως μόλις διεκπεραιώνουμε μια εργασία με αυτά Το ίδιο κάνουμε και όταν συμβεί κάποιο σφάλμα και πρέπει να τερματίσουμε τη διαδικασία ανάγνωσης / εγγραφής 11

bool fail() : Επιστρέφει true αν συνέβη κάποιο σφάλμα κατά την πρόσβαση στο ρεύμα (π.χ. έκλεισε, διαγράφηκε το σχετικό αρχείο) bool eof() : Επιστρέφει true αν κατά την ανάγνωση του ρεύματος έχουμε φτάσει στο τέλος του bool good() : Επιστρέφει true όσο καμία από τις παραπάνω συνθήκες δεν έχει ενεργοποιηθεί Το ρεύμα είναι έγκυρο 12

Η εγγραφή δυαδικών δεδομένων γίνεται πάντα κατά bytes ή αλλιώς, με δεδομένα τύπου char (1 byte) Υπάρχουν δύο δυνατότητες: ostream& put(char c) : γράψιμο ενός μεμονωμένου byte ostream& write(const char* s, streamsize n) : γράψιμο ενός συνεχόμενου block από bytes (πίνακα) Η δεύτερη δυνατότητα είναι πολύ ταχύτερη αν έχουμε πολλά δεδομένα 13

Η ανάγνωση δυαδικών δεδομένων γίνεται πάντα κατά bytes ή αλλιώς, με δεδομένα τύπου char (1 byte) Υπάρχουν (τουλάχιστο) τρεις δυνατότητες: int get() : διάβασμα ενός μεμονωμένου byte istream& get(char& c) istream& read(char* s, streamsize n) : διάβασμα το πολύ n bytes σε δεσμευμένο χώρο (υπάρχων πίνακας) int peek() : διάβασμα ενός μεμονωμένου byte χωρίς να προχωρήσει η τρέχουσα θέση στο ρεύμα (in-place)! άλλες παραλλαγές της get Η δεύτερη δυνατότητα είναι πολύ ταχύτερη αν έχουμε πολλά δεδομένα 14

Διάβασμα μιας «γραμμής» χαρακτήρων. Ως γραμμή νοείται μια ακολουθία από το πολύ n χαρακτήρες που τερματίζονται από τον ειδικό χαρακτήρα end-of-line ( \n ) ή κάποιον άλλο χαρακτήρα που προσδιορίζει ο χρήστης (βλ. παρακάτω το όρισμα delim): istream& getline (char* s, streamsize n ); istream& getline (char* s, streamsize n, char delim ); 15

std::streampos tellg() Μας επιστρέφει την τρέχουσα θέση μας μέσα στο ρεύμα istream& seekg (std::streampos pos) Μετακινούμε την τρέχουσα θέση ανάγνωσης / εγγραφής πριν από το στοιχείο στη θέση pos 16

#include <fstream> // Χρειάζεται για τα ρεύματα αρχείων #include <iostream> // Χρειάζεται για την έξοδο κειμένου στη γραμμή εντολών using namespace std; void writeshortvalue(string filename, unsigned short & value){ ofstream file(filename, ios::binary); if (!file) { cerr << "Cannot open file" << endl; return; } file.write((char*)&value, 2); // Χρησιμοποίησε τη διεύθυνση του value ως // τη διεύθυνση ενός πίνακα 2 bytes. // Γράψε τα 2 bytes του short στο αρχείο if (file.fail()){ cerr << "Could not write data" << endl; } } file.close(); return; 17

#include <fstream> #include <iostream> using namespace std; unsigned short readshortvalue(string filename){ unsigned short value; // short: 2 bytes ifstream file(filename, ios::binary); if (!file) { cerr << "Cannot open file" << endl; return 0; } file.read((char*)&value, 2); // Χρησιμοποίησε τη διεύθυνση του value ως // τη διεύθυνση ενός πίνακα 2 bytes. // Διάβασε 2 bytes σε αυτό το χώρο στη μνήμη if (file.fail()){ cerr << "Could not read data" << endl; return 0; } file.close(); return value; } 18

Αν έχουμε ανοίξει ένα αρχείο ως ρεύμα κειμένου, συνεχίζουμε να μπορούμε να γράψουμε σε αυτό δεδομένα σε δυαδική μορφή ανά πάσα στιγμή και το αντίστροφο. 19

Στα ρεύματα, ανάλογα με το είδος τους (i/o) ορίζονται 2 τελεστές: >> (τελεστής εξαγωγής): Διαβάζει κείμενο από το αρχείο και το μετατρέπει στον κατάλληλο τύπο που ακολουθεί, ενδεχομένως κάνοντας συμβολική ανάλυση του κειμένου που διάβασε (π.χ. για μετατροπή του κειμένου «1234.05» στον αριθμό float 1234.05) << (τελεστής εισαγωγής): Αποθηκεύει σε μορφή κειμένου έναν από τους βασικούς τύπους 20

Κληρονομούν από iostream To cout το χρησιμοποιούμε για να γράψουμε κείμενο (π.χ. αποτελέσματα) στην γραμμή εντολών Το cin το χρησιμοποιούμε για να διαβάσουμε δεδομένα από τη γραμμή εντολών Το cerr το χρησιμοποιούμε για να εξάγουμε μηνύματα λάθους στη γραμμή εντολών 21

istream& operator>> (bool& val); istream& operator>> (short& val); istream& operator>> (unsigned short& val); istream& operator>> (int& val); istream& operator>> (unsigned int& val); istream& operator>> (long& val); istream& operator>> (unsigned long& val); istream& operator>> (float& val); istream& operator>> (double& val); istream& operator>> (long double& val); istream& operator>> (void*& val); istream& operator>> (streambuf* sb ); istream& operator>> (istream& (*pf)(istream&)); ostream& operator<< (bool val); ostream& operator<< (short val); ostream& operator<< (unsigned short val); ostream& operator<< (int val); ostream& operator<< (unsigned int val); ostream& operator<< (long val); ostream& operator<< (unsigned long val); ostream& operator<< (long long val); ostream& operator<< (unsigned long long val); ostream& operator<< (float val); ostream& operator<< (double val); ostream& operator<< (long double val); ostream& operator<< (void* val); ostream& operator<< (streambuf* sb ); 22

void writefloat(string filename, float & value) { ofstream file(filename); if (!file) { cerr << "Cannot open file" << endl; return; } setlocale(lc_all,"greek"); Απαραίτητο για να γράψουμε σε Ελληνικά στο αρχείο (και στη γραμμή εντολών) file << "Γράψαμε το αριθμό " << value << endl; if (file.fail()){ cerr << "Could not write data" << endl; } Ο αριθμός μορφοποιείται σε κείμενο και εγγράφεται στο αρχείο με βάση το locale του υπολογιστή } file.close(); return; 23

Το αποτέλεσμα της διαδικασίας είναι ένα αρχείο με περιεχόμενο: Γράψαμε το αριθμό 2048.1 Κατά την μετατροπή του αριθμού σε χαρακτήρες, χρησιμοποιήθηκε συγκεκριμένη ακρίβεια αναπαράστασης, η οποία έκοψε κάποια δεκαδικά ψηφία! Για να αλλάξουμε την ακρίβεια αναπαράστασης των αριθμών στο ρεύμα, έχουμε ειδικές συναρτήσεις 24

float readfloat(string filename) { float value; ifstream file(filename); if (!file) { return 0.0f; } setlocale(lc_all,"greek"); stringbuf buffer; file.get(buffer, 'ό'); file.get(buffer, ' '); file >> value; cout << buffer.str() << " " << value; if (file.fail()){ file.close(); return 0.0f; } file.close(); return value; } Απαραίτητο για να καταλάβει ότι διαβάζει Ελληνικούς χαρακτήρες Θα διαβάσουμε κείμενο άγνωστου μήκους. O stringbuf (string buffer) χρησιμεύει ακριβώς σε αυτό Διαβάζουμε κείμενο μέσα στον buffer μέχρι να συναντήσουμε κάποιο μοναδικό σύμβολο πριν τον αριθμό Επειδή το σύμβολο ό δεν έχει εξαχθεί από το ρεύμα, πρέπει να διαβάσουμε κι άλλο ένα στοιχείο για να μπορέσει να διαβαστεί μετά ο αριθμός σωστά ( 1000.1 και όχι ό 1000.1 ) 25

streamsize precision (streamsize prec); Αριθμός ψηφίων μετά την υποδιαστολή streamsize width (streamsize wide); Ολικό μήκος σε χαρακτήρες που καταλαμβάνει ο αριθμός char fill (char fillch); Ο χαρακτήρες με τον οποίο θα γεμίσει το κενό που μένει μεταξύ του πραγματικού μήκους του αριθμού και του προσδιορισμένου πλάτους του (συνάρτηση width) 26

Μπορούμε να προσδιορίσουμε τη σχετική τοποθέτηση του αριθμού μέσα στο χώρο του width: int n = -77; std::cout.width(6); std::cout << std::internal << n << '\n'; std::cout.width(6); std::cout << std::left << n << '\n'; std::cout.width(6); std::cout << std::right << n << '\n'; - 77-77 -77 Μπορούμε να αλλάξουμε τη μορφή αναπαράστασης των αριθμών κινητής υποδιαστολής: std::fixed std::scientific Μπορούμε να αλλάξουμε τη βάση των αριθμών: std::dec std::hex std::oct 27

Στη C, τα αρχεία τα διαχειριζόμαστε μέσω file pointers Γιατί χρειάζομαι και δεύτερο τρόπο για να χειρίζομαι αρχεία; Συμβατότητα με μη αντικειμενοστραφή κώδικα Μεγαλύτερη ταχύτητα (χαμηλότερου επιπέδου) Απλούστερος! 28

Στη C, τα αρχεία τα διαχειριζόμαστε μέσω file pointers Βασικός τύπος «αρχείο»: FILE Βρίσκεται στο header file stdio.h Κάνω #include <stdio.h> Δήλωση ενός αρχείου: FILE *fp = nullptr; 29

FILE * fp = fopen( c:\\temp\\myfile, wt ); Η fopen (file open), ανοίγει το αρχείο ποτ δίνεται στο πρώτο όρισμα με τρόπο προσπέλασης που δηλώνεται στο δεύτερο όρισμα: w: write r: read a: append b: binary t: text 30

fclose( FILE * fp); Σημείωση: Μετά την κλήση της fopen(), ελέγχουμε αν ορθά άνοιξε το αρχείο μας ζητώντας ο File pointer να είναι διάφορος του NULL: if (fp==null) printf( error opening file\n ); 31

FILE *fp; fp = fopen("c:\\temp\a.txt","wt"); if (fp) fprintf(fp, "This is a No%d burger\n", 2); fclose(fp); Εδώ, χρησιμοποιήσαμε μια παραλλαγή της printf, την fprintf Συντάσσεται όπως και η printf Παίρνει μία ακόμα παράμετρο (την πρώτη) που είναι ο FILE pointer 32

Και πάλι, χρησιμοποιούμε παραλλαγή της scanf, την fscanf για μορφοποιημένη εισαγωγή κειμένου float a, b; int num_args = fscanf(fp, "%f%*[,\t]%f\)", &a, &b); Άλλη χρήσιμη συνάρτηση που διαβάζει κατά μέγιστο n χαρακτήρες: char buffer[100]; fgets(buffer,100,fp); 33

size_t fwrite ( const void * ptr, size_t size, size_t count, FILE * stream ); Παράδειγμα: int main () { } FILE * pfile; char buffer[] = { 'x', 'y', 'z' }; pfile = fopen ("myfile.bin", "wb"); fwrite (buffer, sizeof(char), sizeof(buffer), pfile); fclose (pfile); return 0; 34

size_t fread ( void * ptr, size_t size, size_t count, FILE * stream ); Παράδειγμα: int main () { FILE * pfile; long lsize; char * buffer; size_t result; pfile = fopen ( "myfile.bin", "rb" ); if (pfile==null) { fputs ("File error",stderr); exit (1); } 35

// Ας βρούμε το μέγεθος του αρχείου: fseek (pfile, 0, SEEK_END); lsize = ftell (pfile); rewind (pfile); buffer = (char*) malloc (sizeof(char)*lsize); if (buffer == NULL) { fputs ("Memory error",stderr); exit (2); } result = fread (buffer,1,lsize,pfile); fclose (pfile); free (buffer); return 0; } 36