Αρχεία εδοµένων. Προγραµµατισµός Ι 1

Σχετικά έγγραφα
FILE *fopen(const char *fname, const char *mode) void fclose(file *f) void fflush(file *f)

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

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

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

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

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

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

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

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

Επεξεργασία Αρχείων Κειµένου

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

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

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

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

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

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

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

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

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

Δυναμική δέσμευση και αποδέσμευση μνήμης. Προγραμματισμός II 1

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

Αρχεία. Προγραμματισμός II 1

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

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

scanf() scanf() stdin scanf() printf() int float double %lf float

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

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

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

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

Α' Εξάμηνο ΕΙΣΑΓΩΓΗ ΣΤΟ ΔΟΜΗΜΕΝΟ ΠΡΟΓΡΑΜΜΑΤΙΣΜΟ

Περιεχόµενα. Πρόλογος... 15

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

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

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

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

H ΓΛΩΣΣΑ C. Μάθηµα 16: Είσοδος/Έξοδος: Συναρτήσεις Eξόδου. ηµήτρης Ψούνης

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

int a[5]; a[0] a[1] a[2] a[3] a[4] 15/10/2009

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

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

Προγραµµατισµός Ι 1

Σύνθετοι Τύποι εδοµένων. Προγραµµατισµός Ι 1

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

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

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

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

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

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

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

Το λειτουργικό σύστημα. Προγραμματισμός II 1

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

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

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

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

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

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

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

Ι Ανασκόπηση και εμβάθυνση Μερικά πιο προχωρημένα θέματα. ΙΙ Τα αρχεία δεδομένων στη C

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

ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΣ Η/Υ Ακαδημαϊκό έτος ΤΕΤΡΑΔΙΟ ΕΡΓΑΣΤΗΡΙΟΥ #4

Το λειτουργικό σύστημα. Προγραμματισμός II 1

Το λειτουργικό σύστημα. Προγραμματισμός II 1

Κλείδωμα αρχείων (file locking) Προγραμματισμός II 1

Βιβλιοθήκες Αφηρημένοι τύποι δεδομένων. Προγραμματισμός II 1

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

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

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

Εισαγωγή στην C. Μορφή Προγράµµατος σε γλώσσα C

Επανάληψη για τις Τελικές εξετάσεις. (Διάλεξη 24) ΕΠΛ 032: ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΣ ΜΕΘΟΔΩΝ ΕΠΙΛΥΣΗΣ ΠΡΟΒΛΗΜΑΤΩΝ

Μεταγλώττιση και σύνδεση πολλαπλών αρχείων κώδικα. Προγραμματισμός II 1

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

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

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

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

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

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

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

Προεπεξεργαστής C. Προγραμματισμός Ι 1

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

Α. unsigned int Β. double. Γ. int. unsigned char x = 1; x = x + x ; x = x * x ; x = x ^ x ; printf("%u\n", x); Β. unsigned char

Αρχεία. Προγραμματισμός II 1

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

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

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

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

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

Προγραμματισμός Η/Υ 1 (Εργαστήριο)

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

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

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

Εισαγωγή στον Προγραµµατισµό. Διάλεξη 2 η : Βασικές Έννοιες της γλώσσας προγραµµατισµού C Χειµερινό Εξάµηνο 2011

Επανάληψη για τις Τελικές εξετάσεις

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

Προγραμματισμός Ι (HY120)

Ενδεικτικές λύσεις και στατιστικά

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

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

Πληροφορική & Τηλεπικοινωνίες K18 - Υλοποίηση Συστηµάτων Βάσεων εδοµένων Εαρινό Εξάµηνο

Π. Σταθοπούλου ή Οµάδα Α (Φοιτητές µε µονό αριθµό Μητρώου ) ιδασκαλία : Παρασκευή 11πµ-13µµ ΗΛ7

Προγραμματισμός Η/Υ. Χειρισμός Αρχείων. ΤΕΙ Ιονίων Νήσων Τμήμα Τεχνολόγων Περιβάλλοντος Κατεύθυνση Τεχνολογιών Φυσικού Περιβάλλοντος

Transcript:

Αρχεία εδοµένων Προγραµµατισµός Ι lalis@inf.uth.gr 1

Μόνιµη αποθήκευση δεδοµένων Η µνήµη (RAM) του Η/Υ κρατάδεδοµένα µόνο όσο της δίνεται µια ικανοποιητική παροχή ρεύµατος. Τα περιεχόµενα της µνήµης χάνονται (αµέσως) µε το που διακοπεί η τροφοδοσία ρεύµατος στον Η/Υ. Υπάρχει ανάγκη για την µόνιµη αποθήκευση δεδοµένων (των προγραµµάτων) ώστε αυτά να εξακολουθούν να υφίστανται αφού σβήσει ο Η/Υ. Αυτό επιτυγχάνεται µε µαγνητικά/οπτικά µέσα. Τα δεδοµένα «γράφονται» αλλάζοντας είτε την µαγνητική κατεύθυνση είτε την επιφανειακή δοµή του υλικού (µαγνητική ταινία, µαγνητικός δίσκος, οπτικός δίσκος, κλπ) έτσι ώστε να µπορεί να γίνει διαχωρισµός µεταξύ των καταστάσεων 0 και 1. Προγραµµατισµός Ι lalis@inf.uth.gr 2

Μοντέλο πρόσβασης Το µοντέλο µνήµης που δίνεται στον προγραµµατιστή είναι του πίνακα από bytes µε άµεση πρόσβαση σε όλαταστοιχείαµε το ίδιο κόστος (direct access). Η πρόσβαση στα µόνιµα µέσα αποθήκευσης είναι (πολύ) πιο αργή και διαφορετική στη φύση της, απαιτώντας πολύπλοκες λειτουργίες διαχείρισης. Γιααυτότολόγο(κυρίως) τα µέσα µόνιµης αποθήκευσης χρησιµοποιούνται µέσα από ένα ειδικό υποσύστηµα λογισµικού: το σύστηµα αρχείων. Το µοντέλο που δίνεται στον προγραµµατιστή για τα µέσα αποθήκευσης είναι µια ακολουθία από bytes µε σειριακή πρόσβαση (sequential access). Προγραµµατισµός Ι lalis@inf.uth.gr 3

Σχετικές συναρτήσεις #include <stdio.h> FILE fopen(const char *fname, const char *mode); void fclose(file *f); void fflush(file *f); int fgetc(file *f); int fputc(int c, FILE *f); int fscanf(file *f, const char *fmt, ); int fprintf(file *f, const char *fmt, ); size_t fread(const void *ptr, size_t size, size_t n, FILE *f); size_t fwrite(const void *ptr, size_t size, size_t n, FILE *f); int fseek(file *f, long int offset, int whence); int feof(file *f); int ferror(file *f); void clearerr(file *f); Προγραµµατισµός Ι lalis@inf.uth.gr 4

Βασικές συναρτήσεις FILE *fopen(const char *fname, const char *mode) άνοιγµα τουαρχείουµε όνοµα fname σύµφωνα µε τον προσδιορισµό mode και επιστροφή δείκτη σε αντίστοιχη δοµή πρόσβασης void fclose(file *f) κλείσιµο της δοµής πρόσβασης αρχείου f (που έχει επιστραφεί από επιτυχηµένη κλήση της fopen) void fflush(file *f) µονιµοποίηση αλλαγών που έγιναν στο αρχείο, χωρίς να γίνει κλείσιµο τουαρχείου σε κάποια συστήµατα αρχείων, η fclose δεν κάνει fflush Προγραµµατισµός Ι lalis@inf.uth.gr 5

Προσδιορισµοί της fopen "r" "w" "a" "r+" "w+" "a+" άνοιγµα αρχείου(που ήδη υπάρχει) για ανάγνωση άνοιγµα αρχείουπουήδηυπάρχειγιαεγγραφή (µε διαγραφήτωνδεδοµένων που υπάρχουν) ή δηµιουργία νέου αρχείου αν αυτό δεν υπάρχει άνοιγµα αρχείου που υπάρχει για εγγραφή, αποκλειστικά µε προσθήκη στο τέλος του αρχείου ήδηµιουργία νέου αρχείου αν αυτό δεν υπάρχει "r" µε εγγραφή, χωρίς δηµιουργία νέου αρχείου "w" µε ανάγνωση "a" µε ανάγνωση Μη επιτρεπτός προσδιορισµός (mode) οδηγεί σε επιστροφή λάθους (τιµής 0) από την fopen. Προγραµµατισµός Ι lalis@inf.uth.gr 6

Βασικές συναρτήσεις int fgetc(file *f) ανάγνωση του «επόµενου» byteστο αρχείο (ή EOF) int fputc(int c, FILE *f) γράψιµο του«επόµενου» byteστο αρχείο int fscanf(file *f, const char *frmt, ) ανάγνωση bytes από το αρχείο σύµφωνα µε τον προσδιορισµό frmt και αποθήκευση τιµών στις µεταβλητές των οποίων οι διευθύνσεις δίνονται σαν παράµετροι σε αντιστοιχία µε την scanf int fprintf(file *f, const char *frmt, ) γράψιµο bytes στοαρχείοσύµφωνα µε τον προσδιορισµό frmt σε αντιστοιχία µε την printf Προγραµµατισµός Ι lalis@inf.uth.gr 7

Βασικές συναρτήσεις size_t fread(const void *p, size_t size, size_t n, FILE *f) ανάγνωση από n αντικείµενα µεγέθους size bytes και αποθήκευση στη µνήµη, αρχίζοντας από την διεύθυνση p επιστρέφει τον αριθµό των αντικειµένων που διαβάστηκαν επιτυχώς size_t fwrite(const void *p, size_t size, size_t n, FILE *f) γράψιµο απόn αντικείµενα µεγέθους size bytes στο αρχείο, αρχίζοντας από την διεύθυνση p επιστρέφει τον αριθµό των αντικειµένων που γράφτηκαν επιτυχώς Προγραµµατισµός Ι lalis@inf.uth.gr 8

Βασικές συναρτήσεις int feof(file *f) επιστρέφει τιµή!0 αν η επόµενη πράξη θα προσπαθήσει να «περάσει» το µέγεθος του αρχείου, διαφορετικά 0 int ferror(file *f) επιστρέφει τιµή!0 αν παρουσιαστεί κάποιο πρόβληµα µε τις πράξεις πρόσβασης για το συγκεκριµένο αρχείο (ο λόγος της αποτυχίας αποθηκεύεται ως ακέραιος στην καθολική µεταβλητή errno, και το αντίστοιχο µήνυµα λάθους επιστρέφεται µέσω της strerror) int clearerr(file *f) επαναφέρει την κατάσταση πρόσβασης σε «κανονική», αγνοώντας τυχόν προηγούµενο πρόβληµα πρόσβασης Προγραµµατισµός Ι lalis@inf.uth.gr 9

Σειριακή πρόσβαση Για κάθε αρχείο διατηρείται (εσωτερικά) µια µεταβλητή που υποδεικνύει την θέση στο αρχείο από την οποία θα αρχίσει η επόµενη πράξη (ανάγνωσης/εγγραφής). Κάθε πράξη ανάγνωσης ή εγγραφής αυξάνει την τιµή του δείκτη κατά τον αριθµό των bytes που διαβάστηκαν από το αρχείο ή γράφτηκαν στο αρχείο. Όταν ο δείκτης φτάσει το τέλος του αρχείου, οι πράξεις ανάγνωσης δεν εκτελούνται και επιστρέφουν EOF ή/και κωδικό λάθους (οι πράξεις εγγραφής απλά επεκτείνουν το µέγεθος του αρχείου όσο χρειάζεται). Πρέπει πάντα να γίνεται έλεγχος της τιµής που επιστρέφουν οι πράξεις πρόσβασης σε αρχεία. Προγραµµατισµός Ι lalis@inf.uth.gr 10

FILE *f; char c; f = fopen("test.txt","r+"); fputc('!',f); fflush(f); αρχείο "test.txt" 'h' 'e' 'l' 'l' 'o' Προγραµµατισµός Ι lalis@inf.uth.gr 11

FILE *f; char c; f = fopen("test.txt","r+"); fputc('!',f); fflush(f); αρχείο "test.txt" 'h' 'e' 'l' 'l' 'o' Προγραµµατισµός Ι lalis@inf.uth.gr 12

FILE *f; char c; f = fopen("test.txt","r+"); fputc('!',f); fflush(f); αρχείο "test.txt" 'h' 'e' 'l' 'l' 'o' Προγραµµατισµός Ι lalis@inf.uth.gr 13

FILE *f; char c; f = fopen("test.txt","r+"); fputc('!',f); fflush(f); αρχείο "test.txt" 'h' 'e' 'l' 'l' 'o' Προγραµµατισµός Ι lalis@inf.uth.gr 14

FILE *f; char c; f = fopen("test.txt","r+"); fputc('!',f); fflush(f); αρχείο "test.txt" 'h' 'e' 'l' 'l' 'o' Προγραµµατισµός Ι lalis@inf.uth.gr 15

FILE *f; char c; f = fopen("test.txt","r+"); fputc('!',f); fflush(f); αρχείο "test.txt" 'h' 'e' 'l' 'l' 'o' Προγραµµατισµός Ι lalis@inf.uth.gr 16

FILE *f; char c; f = fopen("test.txt","r+"); fputc('!',f); fflush(f); αρχείο "test.txt" 'h' 'e' 'l' 'l' 'o' Προγραµµατισµός Ι lalis@inf.uth.gr 17

FILE *f; char c; f = fopen("test.txt","r+"); fputc('!',f); fflush(f); αρχείο "test.txt" 'h' 'e' 'l' 'l' 'o' '!' Προγραµµατισµός Ι lalis@inf.uth.gr 18

FILE *f; char c; f = fopen("test.txt","r+"); fputc('!',f); fflush(f); αρχείο "test.txt" 'h' 'e' 'l' 'l' 'o' '!' Προγραµµατισµός Ι lalis@inf.uth.gr 19

Βασικές συναρτήσεις Ο δείκτης µπορεί να επανατοποθετηθεί σε κάποιο σηµείο του αρχείου µέσω της πράξης fseek. int fseek(file *f, long offset, int whence) τοποθέτηση σηµείου ανάγνωσης/εγγραφής στην θέση offset και σε σχέση µε τον προσδιορισµό whence Ητιµές για την παράµετρο whence: SEEK_SET (από την αρχή του αρχείου) SEEK_CUR (από την τρέχουσα θέση) SEEK_END (από το τέλος του αρχείου) Επιστρέφει 0 εάν επιτύχει, διαφορετικά -1. Προγραµµατισµός Ι lalis@inf.uth.gr 20

FILE *f; char c; f = fopen("test.txt","r+"); fseek(f,-1,seek_end); fseek(f,-5,seek_cur); fputc('i',f); fflush(f); fputc(' ',f); fflush(f); fputc('y',f); fflush(f); fputc('o',f); fflush(f); fputc('u',f); fflush(f); αρχείο "test.txt" 'h' 'e' 'l' 'l' 'o' '!' Προγραµµατισµός Ι lalis@inf.uth.gr 21

FILE *f; char c; f = fopen("test.txt","r+"); fseek(f,-1,seek_end); fseek(f,-5,seek_cur); fputc('i',f); fflush(f); fputc(' ',f); fflush(f); fputc('y',f); fflush(f); fputc('o',f); fflush(f); fputc('u',f); fflush(f); αρχείο "test.txt" 'h' 'e' 'l' 'l' 'o' '!' Προγραµµατισµός Ι lalis@inf.uth.gr 22

FILE *f; char c; f = fopen("test.txt","r+"); fseek(f,-1,seek_end); fseek(f,-5,seek_cur); fputc('i',f); fflush(f); fputc(' ',f); fflush(f); fputc('y',f); fflush(f); fputc('o',f); fflush(f); fputc('u',f); fflush(f); αρχείο "test.txt" 'h' 'e' 'l' 'l' 'o' '!' Προγραµµατισµός Ι lalis@inf.uth.gr 23

FILE *f; char c; f = fopen("test.txt","r+"); fseek(f,-1,seek_end); fseek(f,-5,seek_cur); fputc('i',f); fflush(f); fputc(' ',f); fflush(f); fputc('y',f); fflush(f); fputc('o',f); fflush(f); fputc('u',f); fflush(f); αρχείο "test.txt" 'h' 'e' 'l' 'l' 'o' '!' Προγραµµατισµός Ι lalis@inf.uth.gr 24

FILE *f; char c; f = fopen("test.txt","r+"); fseek(f,-1,seek_end); fseek(f,-5,seek_cur); fputc('i',f); fflush(f); fputc(' ',f); fflush(f); fputc('y',f); fflush(f); fputc('o',f); fflush(f); fputc('u',f); fflush(f); αρχείο "test.txt" 'h' 'e' 'l' 'l' 'o' '!' Προγραµµατισµός Ι lalis@inf.uth.gr 25

FILE *f; char c; f = fopen("test.txt","r+"); fseek(f,-1,seek_end); fseek(f,-5,seek_cur); fputc('i',f); fflush(f); fputc(' ',f); fflush(f); fputc('y',f); fflush(f); fputc('o',f); fflush(f); fputc('u',f); fflush(f); αρχείο "test.txt" 'h' 'i' 'l' 'l' 'o' '!' Προγραµµατισµός Ι lalis@inf.uth.gr 26

FILE *f; char c; f = fopen("test.txt","r+"); fseek(f,-1,seek_end); fseek(f,-5,seek_cur); fputc('i',f); fflush(f); fputc(' ',f); fflush(f); fputc('y',f); fflush(f); fputc('o',f); fflush(f); fputc('u',f); fflush(f); αρχείο "test.txt" 'h' 'i' ' ' 'l' 'o' '!' Προγραµµατισµός Ι lalis@inf.uth.gr 27

FILE *f; char c; f = fopen("test.txt","r+"); fseek(f,-1,seek_end); fseek(f,-5,seek_cur); fputc('i',f); fflush(f); fputc(' ',f); fflush(f); fputc('y',f); fflush(f); fputc('o',f); fflush(f); fputc('u',f); fflush(f); αρχείο "test.txt" 'h' 'i' ' ' 'y' 'o' '!' Προγραµµατισµός Ι lalis@inf.uth.gr 28

FILE *f; char c; f = fopen("test.txt","r+"); fseek(f,-1,seek_end); fseek(f,-5,seek_cur); fputc('i',f); fflush(f); fputc(' ',f); fflush(f); fputc('y',f); fflush(f); fputc('o',f); fflush(f); fputc('u',f); fflush(f); αρχείο "test.txt" 'h' 'i' ' ' 'y' 'o' '!' Προγραµµατισµός Ι lalis@inf.uth.gr 29

FILE *f; char c; f = fopen("test.txt","r+"); fseek(f,-1,seek_end); fseek(f,-5,seek_cur); fputc('i',f); fflush(f); fputc(' ',f); fflush(f); fputc('y',f); fflush(f); fputc('o',f); fflush(f); fputc('u',f); fflush(f); αρχείο "test.txt" 'h' 'i' ' ' 'y' 'o' 'u' Προγραµµατισµός Ι lalis@inf.uth.gr 30

FILE *f; char c; f = fopen("test.txt","r+"); fseek(f,-1,seek_end); fseek(f,-5,seek_cur); fputc('i',f); fflush(f); fputc(' ',f); fflush(f); fputc('y',f); fflush(f); fputc('o',f); fflush(f); fputc('u',f); fflush(f); αρχείο "test.txt" 'h' 'i' ' ' 'y' 'o' 'u' Προγραµµατισµός Ι lalis@inf.uth.gr 31

#include <stdio.h> int main(int argc, char *argv[]) { FILE *f; char c; } f = fopen(argv[1],"w"); do { c = getchar(); fputc(c,f); } while (c!= '~'); fflush(f); f = fopen(argv[1],"r"); while (!feof(f)) { c = fgetc(f); putchar(c); } Προγραµµατισµός Ι lalis@inf.uth.gr 32

#include <stdio.h> int main(int argc, char *argv[]) { FILE *f; char s[64]; f = fopen(argv[1],"w"); do { scanf("%63s",s); fprintf(f,"%s ",s); } while (strcmp(s,"end")); fflush(f); κενός χαρακτήρας ως διαχωριστικό ανάµεσα στα δύο αλφαριθµητικά f = fopen(argv[1],"r"); while (!feof(f)) { fscanf(f,"%63s",s); printf("%s ",s); } } Προγραµµατισµός Ι lalis@inf.uth.gr 33

Αποθήκευση binary / ASCII Μπορούµε να αποθηκεύσουµε τα δεδοµένα σε µορφή binary ήσεµορφή χαρακτήρων ASCII (text). Για την ίδια πληροφορία διαφέρει ο αριθµός και φυσικά(!) οι τιµές των bytes που γράφονται. Π.χ. int i=1; binary: x00 0x00 0x00 0x01 ascii: 0x31 Π.χ. int i=100000000; binary: 0x3Β 0x9Α 0xCA 0x00 ascii: 0x31 0x30 0x30 0x30 0x30 0x30 0x30 0x30 0x30 0x30 Προγραµµατισµός Ι lalis@inf.uth.gr 34

Αποθήκευση binary Γίνεται µε την συνάρτηση fwrite. εν απαιτούνται (απαραίτητα) διαχωριστικά bytes καθώς για κάθε τύπο δεδοµένων γράφεται ένας συγκεκριµένος αριθµός bytes ακριβώς όσα bytes αντιστοιχούν στο µέγεθος του τύπου. Κατά την ανάγνωση, µέσω fread, διαβάζονται όσα bytes αντιστοιχούν στο µέγεθος του τύπου. Υπάρχει πρόβληµα ασυµβατότητας, αν τα δεδοµένα γράφονται / διαβάζονται από προγράµµατα που εκτελούνται σε περιβάλλοντα µε διαφορετικές συµβάσεις (α) για τα µεγέθη βασικών και σύνθετων τύπων ή/και (β) την αποθήκευση τους στην µνήµη. Προγραµµατισµός Ι lalis@inf.uth.gr 35

f=fopen("test","w"); i=1; j=1000000000; fwrite((void*)&i,sizeof(int),1,f); fwrite((void*)&j,sizeof(int),1,f); fflush(f); τα όρια µεταξύ των δεδοµένων δίνονται έµµεσα από το µέγεθος των τύπων 0x01 0x00 0x00 0x00 0x00 0xCA 0x9A 0x3Β αρχείο "test" Προγραµµατισµός Ι lalis@inf.uth.gr 36

Συµβάσεις κωδικοποίησης δεδοµένων Για να επιτευχθεί µεταφερσιµότητα των δεδοµένων, υιοθετούνται κοινές συµβάσεις εξωτερικής αναπαράστασης, για το πως αποθηκεύονται τιµές όλων των βασικών τύπων δεδοµένων µε τρόπο που είναι ανεξάρτητος της µεθόδου αποθήκευσης δεδοµένων στην µνήµη του εκάστοτε περιβάλλοντος εκτέλεσης (γλώσσα, µεταφραστής, επεξεργαστής). Σηµείωση: το ίδιο πρόβληµα πρέπει να λυθεί για να επιτευχθεί ανταλλαγή δεδοµένων πάνω από δίκτυο. Μια κλασική λύση: αποθήκευση σε µορφή ASCII. Προγραµµατισµός Ι lalis@inf.uth.gr 37

Αποθήκευση ASCII Γίνεται µε την συνάρτηση fprintf. Απαιτείται η εισαγωγή επιπλέον χαρακτήρων µορφοποίησης έτσι ώστε να οριοθετούνται τα διάφορα δεδοµένα που αποθηκεύονται. Ως διαχωριστικό χρησιµοποιούνται συνήθως οι χαρακτήρες ' ' ή '\n', όπως και για τις τιµές που εκτυπώνουµε στην οθόνη µέσω printf, για να µπορεί ο χρήστης να εντοπίζει (οπτικά) τον τερµατισµό µιας τιµής και την αρχή της επόµενης. Σηµείωση: χρειάζεται προσοχή για τον σωστό χειρισµό των«διαχωριστικών» χαρακτήρων που τυχόν δηµιουργούνται (ότι δεν είναι γράµµα/ψηφίο). Προγραµµατισµός Ι lalis@inf.uth.gr 38

f=fopen("test","w"); i=1; j=1000000000; fprintf(f,"%d %d",i,j); fflush(f); κενός χαρακτήρας ως διαχωριστικό ανάµεσα στα δύο αλφαριθµητικά '1' ' ' '1' '0' '0' '0' '0' '0' '0' '0' '0' '0' αρχείο "test" Προγραµµατισµός Ι lalis@inf.uth.gr 39

Σύµβαση γραψίµατος/ανάγνωσης Ανεξάρτητα µε τηνµορφή που γίνεται η αποθήκευση, binary ή ASCII, πρέπει να υπάρχει κοινή σύµβαση γραψίµατος και ανάγνωσης δεδοµένων την οποία να ακολουθεί τόσο ο κώδικας γραψίµατος όσο και ο κώδικας ανάγνωσης των δεδοµένων. Πρέπει να καθοριστούν: (α) η µορφή αποθήκευσης,, (β) η κωδικοποίηση των δεδοµένων, καθώς και (γ) η σειρά (και η λογική) µε την οποία γράφονται τα δεδοµένα στο αρχείο και σύµφωνα µε την οποία θα διαβαστούν τα δεδοµένα από το αρχείο. Αυτήησύµβαση πρέπει να τεκµηριωθεί κατάλληλα. Η µετατροπή πολύπλοκων δοµών σε αποθηκεύσιµη µορφή ονοµάζεται συχνά και «σειριοποίηση». Προγραµµατισµός Ι lalis@inf.uth.gr 40

αποθήκευση δεδοµένων σε δοµές κυρίως µνήµης Η/Υ σειριοποίηση αποθήκευση δεδοµένων σε «επίπεδη» µορφή αποσειριοποίηση Προγραµµατισµός Ι lalis@inf.uth.gr 41

Παρένθεση (σώσιµο και επαναφορά βάσης δεδοµένων σε αρχείο) Προγραµµατισµός Ι lalis@inf.uth.gr 42

Πρόβληµα Ζητούµενο: επιθυµούµε νασώσουµε ταδεδοµένα που διαχειριζόµαστε µέσω της δοµής στην κυρίως µνήµη σεένααρχείο, καθώς και να επαναφέρουµε µια «προηγούµενη»κατάσταση ανά πάσα στιγµή διαβάζοντας τα δεδοµένα από το αντίστοιχο αρχείο. ιαδικασία εγγραφής διασχίσουµε τηνδοµή τωνδεδοµένων για κάθε στοιχείο / κόµβο που είναι υπό χρήση, πραγµατοποιούµε αντίστοιχη εγγραφή στο αρχείο ιαδικασία ανάγνωσης δηµιουργούµε µια «άδεια» δοµή για κάθε εγγραφή που διαβάζουµε απότοαρχείο, προσθέτουµε ένα αντίστοιχο στοιχείο / κόµβο Προγραµµατισµός Ι lalis@inf.uth.gr 43

αποµάκρυνση προσθήκη επόµενο στοιχείο προς αποθήκευση νέων δεδοµένων... στοιχεία υπό χρήση ελεύθερα στοιχεία Προγραµµατισµός Ι lalis@inf.uth.gr 44

/* phone book */ #define N 100 struct entry { char used; char name[64]; char phone[64]; }; struct entry entries[n]; void phonebook_init() { int i; for (i=0; i<n; i++) { entries[i].used=0; } } Προγραµµατισµός Ι lalis@inf.uth.gr 45

void phonebook_save_binary(const char *fname) { int i; FILE *f; } f = fopen(fname,"w"); for (i=0; i<n; i++) { if (entries[i].used) { fwrite(&entries[i],sizeof(struct entry),1,f); } } void phonebook_load_binary(const char *fname) { int i; FILE *f; char tag; } phonebook_init(); /* clean state */ f = fopen(fname,"r"); i=0; while (fread(&entries[i],sizeof(struct entry),1,f)) { i++; } Προγραµµατισµός Ι lalis@inf.uth.gr 46

Σχόλιο Οι συναρτήσεις save και restore αποθήκευουν τα δεδοµένα σε µορφή binary, και µάλιστα «ως έχουν» στην µνήµη του περιβάλλοντος εκτέλεσης του Η/Υ. Η υλοποίηση δεν επιτυγχάνει µεταφερσιµότητα δεδοµένων, π.χ. στην περίπτωση που το πρόγραµµα (ξανα)µεταφραστεί µε διαφορετικό µεταφραστή ή/και εκτελεστεί πάνω σε διαφορετική αρχιτεκτονική. Για να επιτευχθεί µεταφερσιµότητα πρέπει να ορίσουµε και να υλοποιήσουµε µια κωδικοποίηση που είναι ανεξάρτητη περιβάλλοντος εκτέλεσης. Μια «εύκολη» λύση: µετατρέπουµε ταδεδοµένα σε/από χαρακτήρες ASCII, µέσω fprintf/fscanf. Προγραµµατισµός Ι lalis@inf.uth.gr 47

void phonebook_save_ascii(const char *fname) { int i; FILE *f; } f = fopen(fname,"w"); for (i=0; i<n; i++) { if (entries[i].used) { fprintf(f,"%s %s\n",entries[i].name,entries[i].phone); } } void phonebook_load_ascii(const char *fname) { int i,tag; FILE *f; } phonebook_init(); /* clean state */ f = fopen(fname,"r"); i=0; while (fscanf(f,"%s %s",entries[i].name,entries[i].phone)==2) { entries[i].used = 1; i++; } Προγραµµατισµός Ι lalis@inf.uth.gr 48

Σε µια σοβαρή εφαρµογή Θα γινόταν έλεγχος για περίπτωση αποτυχίας µετά από κάθε πράξη εγγραφής / ανάγνωσης αρχείου. Κατά την ανάγνωση θα γινόταν έλεγχος για το κατά πόσο υπάρχει πρόβληµα ακεραιότητας του αρχείου (για την αποφυγή ανάγνωσης αρχείων που δεν περιέχουν δεδοµένα του προγράµµατος ή αρχείων που έχουν «καταστραφεί»). Ηαντικατάστασητωνδεδοµένων του προγράµµατος θα γινόταν εφόσον η διαδικασία ανάγνωσης των δεδοµένων ολοκληρωνόταν επιτυχώς. Προγραµµατισµός Ι lalis@inf.uth.gr 49

Παρένθεση (σώσιµο και επαναφορά βάσης δεδοµένων σε αρχείο) Προγραµµατισµός Ι lalis@inf.uth.gr 50