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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

FILE *fopen(const char *fname, const char *mode) void fclose(file *f) void fflush(file *f)

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

C: Από τη Θεωρία στην Εφαρμογή

int array[10]; double arr[5]; char pin[20]; Προγραµµατισµός Ι

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

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

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

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

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

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

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

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

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

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

C: Από τη Θεωρία στην Εφαρµογή 2 ο Κεφάλαιο

Εισαγωγή στον Προγραµµατισµό «C»

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

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

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

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

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

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

Προγραµµατισµός Ι Αλφαριθµητικά Πανεπιστήµιο Πελοποννήσου Τµήµα Πληροφορικής & Τηλεπικοινωνιών Προγραµµατισµός Ι 1 Νικόλαος Δ.

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

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

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

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

Ασκήσεις - Μελέτες περίπτωσης για το μάθημα Προγραμματισμός II

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

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

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

Αρχεία Ένα αρχείο αποτελείται από μία σειρά ομοειδών δεδομένων που ονομάζονται λογικές εγγραφές (logical record)

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

Η-Υ ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΣ. Εργαστήριο 1 Εισαγωγή στη C. Σοφία Μπαλτζή s.mpaltzi@di.uoa.gr

Προγραμματισμός Ι. Προχωρημένα Θέματα. Δημήτρης Μιχαήλ. Τμήμα Πληροφορικής και Τηλεματικής Χαροκόπειο Πανεπιστήμιο

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

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

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

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

Λειτουργικά Συστήματα (Λ/Σ)

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

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

ΑΣΚΗΣΗ 2: ΔΟΜΗ ΠΡΟΓΡΑΜΜΑΤΟΣ C, ΧΕΙΡΙΣΜΟΣ ΜΕΤΑΒΛΗΤΩΝ ΚΑΙ ΣΥΝΑΡΤΗΣΕΙΣ ΕΙΣΟΔΟΥ ΚΑΙ ΕΞΟΔΟΥ

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

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

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

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

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

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

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

Πίνακες: μια σύντομη εισαγωγή. Πίνακες χαρακτήρων: τα "Αλφαριθμητικά"

ΚΕΦΑΛΑΙΟ 9 ΒΑΣΙΚΕΣ ΕΝΤΟΛΕΣ

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

Τμήμα Πληροφορικής & Επικοινωνιών Δρ. Θεόδωρος Γ. Λάντζος

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

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

2ο ΓΕΛ ΑΓ.ΔΗΜΗΤΡΙΟΥ ΑΕΠΠ ΘΕΟΔΟΣΙΟΥ ΔΙΟΝ ΠΡΟΣΟΧΗ ΣΤΑ ΠΑΡΑΚΑΤΩ

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

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

Transcript:

Τμήμα ΜΗΧΑΝΙΚΩΝ ΠΛΗΡΟΦΟΡΙΚΗΣ ΤΕ ΤΕΙ ΔΥΤΙΚΗΣ ΕΛΛΑΔΑΣ Διαδικασιακός Προγραμματισμός Διάλεξη 15 η Αρχεία Οι διαλέξεις βασίζονται στο βιβλίο των Τσελίκη και Τσελίκα C: Από τη Θεωρία στην Εφαρμογή Σωτήρης Χριστοδούλου Αρχεία Τα αρχεία χωρίζονται σε δύο κατηγορίες: τα αρχεία κειμένου (text files) και τα δυαδικά αρχεία (binary files) Τα αρχεία κειμένου ονομάζονται και αρχεία σειριακής προσπέλασης, γιατί για να διαβάσουμε ή να γράψουμε σε ένα τέτοιο αρχείο πρέπει να ξεκινήσουμε από την αρχή του αρχείου (π.χ. για να διαβάσουμε τους χαρακτήρες της 50 ης γραμμής ενός αρχείου κειμένου πρέπει να έχουμε διαβάσει με τη σειρά τους χαρακτήρες των προηγούμενων 49 γραμμών του αρχείου) Αντίθετα, τα δυαδικά αρχεία ονομάζονται και αρχεία τυχαίας προσπέλασης, γιατί μπορούμε να διαβάσουμε ή να γράψουμε κατευθείαν σε οποιοδήποτε σημείο του αρχείου επιθυμούμε (π.χ. για να διαβάσουμε τους χαρακτήρες της 50 ης γραμμής ενός τέτοιου αρχείου δεν χρειάζεται να έχουμε διαβάσει με τη σειρά τους χαρακτήρες των προηγούμενων 49 γραμμών του αρχείου, αλλά μπορούμε να διαβάσουμε κατευθείαν τους χαρακτήρες της 50 ης γραμμής) 2 1

text files vs. binary files (Ι) Τα αρχεία κειμένου αποτελούνται από μία η περισσότερες γραμμές, οι οποίες περιέχουν χαρακτήρες Κάθε γραμμή τελειώνει με τον ειδικό χαρακτήρα που χρησιμοποιεί το λειτουργικό σύστημα για να καθορίσει το τέλος της γραμμής Ωστόσο, όταν αποθηκεύονται χαρακτήρες σε ένα αρχείο κειμένου είναι πιθανό να γίνει μετατροπή κάποιων χαρακτήρων Π.χ. ο ASCII κωδικός του χαρακτήρα νέας γραμμής '\n' (Line Feed) είναι 10 και στα Windows κάθε τέτοιος χαρακτήρας μετατρέπεται στον χαρακτήρα τέλους γραμμής, που είναι ο συνδυασμός των χαρακτήρων '\r' (Carriage Return) και '\n' (Line Feed), CR/LF, με ASCII κωδικούς 13 και 10 αντίστοιχα Αντίθετα, στα δυαδικά αρχεία τα περιεχόμενα του αρχείου δεν διαχωρίζονται σε γραμμές και δεν συμβαίνει καμία μετατροπή χαρακτήρων Π.χ. ο χαρακτήρας νέας γραμμής '\n' αποθηκεύεται απευθείας και δεν μετατρέπεται σε τέλος γραμμής 3 text files vs. binary files (ΙΙ) Στα αρχεία κειμένου μπορεί να προστεθεί ένας ειδικός χαρακτήρας που δηλώνει το τέλος του αρχείου Π.χ. στο Unix ο χαρακτήρας που δηλώνει το τέλος του αρχείου κειμένου είναι ο Control-D (CTRL-D) Στα δυαδικά αρχεία δεν υπάρχει κάποιος αντίστοιχος χαρακτήρας για τη δήλωση του τέλους του αρχείου Οι διαδικασίες εγγραφής και ανάγνωσης σε/από ένα δυαδικό αρχείο εκτελούνται πιο γρήγορα από ότι σε ένα αρχείο κειμένου 4 2

text files vs. binary files (ΙΙΙ) Το μέγεθος των δυαδικών αρχείων είναι συνήθως μικρότερο από το μέγεθος των αρχείων κειμένου, γιατί στα δυαδικά αρχεία κάθε τύπος δεδομένων αποθηκεύεται με τον αντίστοιχο αριθμό bytes που απαιτούνται Π.χ. το μέγεθος ενός αρχείου κειμένου που περιέχει τον αριθμό 47654 (47654 10 = 1011101000100110 2 ) θα είναι 5 bytes (αφού περιέχει 5 ψηφία), ενώ το μέγεθος ενός αντίστοιχου δυαδικού αρχείου θα είναι 2 bytes Αρχείο κειμένου: Δυαδικό αρχείο: o o 00110100 Ο ASCII του κάθε ψηφίου o 00110111 00110110 00110101 00110100 4 7 6 5 4 o o 10111010 00100110 o o 4765410 = 10111010001001102 o 5 Παρατηρήσεις Ο κύριος λόγος για να επιλέξουμε να αποθηκεύσουμε δεδομένα σε ένα αρχείο κειμένου είναι γιατί τα περιεχόμενά τους εμφανίζονται σε κατανοητή μορφή από τους επεξεργαστές κειμένων Αντίθετα, αν ανοίξετε ένα δυαδικό αρχείο με κάποιον επεξεργαστή κειμένου (π.χ. notepad) είναι πολύ πιθανό να εμφανίζονται κάποιοι παράξενοι χαρακτήρες και να μην μπορείτε να διαβάσετε τα περιεχόμενά του 6 3

Πρόσβαση Αρχείων Κάθε αρχείο πρέπει να έχει ένα όνομα σύμφωνα με τους κανόνες ονοματολογίας του λειτουργικού συστήματος που εκτελείται το πρόγραμμα Ένα αρχείο μπορεί να βρίσκεται στον ίδιο φάκελο με το εκτελέσιμο πρόγραμμα ή σε διαφορετικό Αν βρίσκεται σε διαφορετικό φάκελο και το λειτουργικό σύστημα χρησιμοποιεί τον χαρακτήρα της ανάστροφης κεκλιμένης (backslash) \ για τον διαχωρισμό των φακέλων (directories), όπως π.χ. στα Windows, τότε πρέπει να προστεθεί άλλoς ένας χαρακτήρας ανάστροφης κεκλιμένης (δηλ. \\) για τον διαχωρισμό των φακέλων, διότι ο απλός χαρακτήρας \ έχει ειδική σημασία στη C Π.χ. d:\\c\\code\\test.txt Αν το αρχείο βρίσκεται στον ίδιο φάκελο με το εκτελέσιμο πρόγραμμα, τότε γράφουμε μόνο το όνομα του αρχείου Π.χ. test.txt 7 Παρατηρήσεις Αν το όνομα του αρχείου εισάγεται στο πρόγραμμα μέσω της συνάρτησης scanf() ή gets(), τότε ο χρήστης δεν χρειάζεται να προσθέσει δεύτερο backslash \ για τον διαχωρισμό των φακέλων Π.χ. d:\c\code\test.txt Αν το αρχείο βρίσκεται στον ίδιο φάκελο με το εκτελέσιμο πρόγραμμα, τότε ο χρήστης πληκτρολογεί μόνο το όνομα του αρχείου Π.χ. test.txt 8 4

Άνοιγμα Αρχείου (Ι) Για το άνοιγμα ενός αρχείου χρησιμοποιείται η συνάρτηση fopen() Το πρωτότυπο της συνάρτησης δηλώνεται στο αρχείο stdio.h και είναι το ακόλουθο: FILE* fopen(char* filename,char* mode); Αν η συνάρτηση fopen() εκτελεστεί επιτυχημένα, τότε επιστρέφει έναν δείκτη σε μία δομή τύπου FILE Το πρότυπο της δομής FILE δηλώνεται στο αρχείο stdio.h και στα πεδία αυτής της δομής αποθηκεύεται πληροφορία σχετικά με το αρχείο Όλες οι επόμενες λειτουργίες που θα εκτελεστούν στο αρχείο, π.χ. ανάγνωση ή εγγραφή σε αυτό, θα γίνονται με χρήση αυτού του δείκτη 9 Άνοιγμα Αρχείου (ΙΙ) Η παράμετρος filename περιέχει το όνομα του αρχείου και μπορεί να είναι: είτε το πλήρες όνομα του αρχείου μέσα σε διπλά εισαγωγικά (" ") Π.χ. char fname[] = "test.txt"; είτε ένας δείκτης σε έναν πίνακα χαρακτήρων που να περιέχει το πλήρες όνομα του αρχείου Π.χ. char* fname; fname = "test.txt"; 10 5

Άνοιγμα Αρχείου (ΙΙΙ) Η παράμετρος mode δηλώνεται όπως η παράμετρος filename και καθορίζει τις ενέργειες που μπορούν να εκτελεστούν στο αρχείο, σύμφωνα με τον παρακάτω πίνακα 11 Άνοιγμα Αρχείου (ΙV) Για το άνοιγμα ενός δυαδικού αρχείου πρέπει να προστεθεί ο χαρακτήρας b (το πρώτο γράμμα της λέξης binary), μετά την επιλογή ανοίγματος Παραδείγματα: Η παράμετρος "rb", ανοίγει ένα δυαδικό αρχείο για ανάγνωση Η παράμετρος "w+b", ανοίγει ένα δυαδικό αρχείο για ανάγνωση και εγγραφή Αν αποτύχει η εκτέλεση της συνάρτησης fopen(), τότε αυτή επιστρέφει την τιμή NULL Παραδείγματα αποτυχίας: Περίπτωση προσπάθειας ανάγνωσης ενός αρχείου, ενώ η παράμετρος filename περιέχει το όνομα ενός αρχείου που δεν υπάρχει Περίπτωση δημιουργίας ενός αρχείου, όταν η παράμετρος filename δεν περιέχει ένα έγκυρο όνομα κ.ο.κ... 12 6

Παραδείγματα χρήσης της fopen() fopen("test.txt","r"); Ανοίγει για ανάγνωση το αρχείο κειμένου test.txt, το οποίο βρίσκεται στον ίδιο φάκελο με το εκτελέσιμο πρόγραμμα fopen("c:\\src\\test.txt","r"); Ανοίγει για ανάγνωση το αρχείο κειμένου test.txt, το οποίο βρίσκεται στον φάκελο c:\src fopen("test.txt","w"); Ανοίγει για εγγραφή το αρχείο κειμένου test.txt, που βρίσκεται στον ίδιο φάκελο με το εκτελέσιμο πρόγραμμα Αν το test.txt δεν υπάρχει, τότε δημιουργείται στον ίδιο φάκελο με το εκτελέσιμο πρόγραμμα fopen("d:\\src\\test.dat","a+b"); Ανοίγει για ανάγνωση και προσάρτηση το δυαδικό αρχείο test.dat, που βρίσκεται στον φάκελο d:\src Αν το test.dat δεν υπάρχει στον συγκεκριμένο φάκελο, τότε δημιουργείται μέσα στον φάκελο αυτόν (d:\src) 13 Παράδειγμα Τί κάνει το παρακάτω πρόγραμμα??? Διαβάζει το όνομα ενός αρχείου και εμφανίζει μήνυμα για το αν αυτό μπορεί να διαβαστεί ή όχι... 14 7

Παρατηρήσεις Η τιμή επιστροφής της συνάρτησης fopen() πρέπει πάντα να ελέγχεται και μόνο αν αυτή είναι διαφορετική από NULL, θα πρέπει να επιτρέπεται να γίνουν διάφορες ενέργειες στο αρχείο Ο έλεγχος της επιστροφής της fopen() θα μπορούσε να γίνει σε μία γραμμή κώδικα ως εξής: if((fp = fopen(fname,"r")) == NULL) Οι εσωτερικές παρενθέσεις μπαίνουν για λόγους προτεραιότητας Όταν τελειώνει η επεξεργασία ενός αρχείου να το κλείνετε με χρήση της συνάρτησης fclose(), η οποία παρουσιάζεται παρακάτω Οι συναρτήσεις που περιγράφονται παρακάτω λειτουργούν και στους δύο τύπους αρχείων (αρχεία κειμένου και δυαδικά αρχεία) 15 Η τιμή EOF Η ειδική τιμή -1 χρησιμοποιείται για να μας ενημερώσει ότι: είτε φτάσαμε στο τέλος του αρχείου είτε συνέβη κάποιο λάθος στην εκτέλεση μίας λειτουργίας στο αρχείο (π.χ. εγγραφή) Η τιμή αυτή δηλώνεται με τη συμβολική σταθερά End Of File (EOF) στο αρχείο stdio.h Συγκεκριμένα, οι περισσότερες συναρτήσεις εγγραφής/ανάγνωσης επιστρέφουν την τιμή EOF, είτε όταν φτάσουν στο τέλος του αρχείου είτε αν συμβεί κάποιο λάθος κατά την εκτέλεσή τους 16 8

Κλείσιμο Αρχείου Η συνάρτηση fclose() χρησιμοποιείται για το κλείσιμο ενός ανοικτού αρχείου Το πρωτότυπο της συνάρτησης δηλώνεται στο αρχείο stdio.h και είναι το ακόλουθο: int fclose(file* fp); Η παράμετρος fp είναι ο δείκτης σε μία δομή τύπου FILE, που επιστρέφεται από τη συνάρτηση fopen() Η συνάρτηση fclose() επιστρέφει 0 αν το αρχείο έκλεισε επιτυχώς, αλλιώς επιστρέφει ΕΟF 17 Προσπέλαση Αρχείου Για κάθε ανοικτό αρχείο υπάρχει ένα πεδίο-δείκτης στη δομή FILE που δείχνει σε ποια θέση του αρχείου θα γίνει η επόμενη λειτουργία εγγραφής ή ανάγνωσης Π.χ. όταν ανοίγει ένα αρχείο για ανάγνωση ή εγγραφή, τότε αυτός ο δείκτης δείχνει στην αρχή του αρχείου Αν όμως ανοίγει ένα αρχείο μόνο για προσάρτηση, τότε αυτός ο δείκτης δείχνει στο τέλος του αρχείου Κάθε φορά που εκτελείται μία λειτουργία εγγραφής ή ανάγνωσης, η τιμή αυτού του δείκτη θέσης ενημερώνεται αυτόματα Π.χ. αν ανοίξει ένα αρχείο για ανάγνωση και με μία εντολή ανάγνωσης διαβαστούν 50 χαρακτήρες, τότε ο δείκτης μετακινείται δεξιά και δείχνει στη θέση του αρχείου που είναι 50 bytes μετά από την αρχή του αρχείου Αντίστοιχα, σε μία εγγραφή δεδομένων ο δείκτης μετακινείται δεξιά κατά τόσες θέσεις όσες και ο αριθμός των bytes που γράφτηκαν στο αρχείο Η συνάρτηση fseek() που θα παρουσιαστεί παρακάτω χρησιμοποιείται για να μετακινήσει τον δείκτη θέσης του αρχείου σε οποιοδήποτε σημείο του αρχείου 18 9

Εγγραφή σε Αρχείο Κειμένου Οι κυριότερες συναρτήσεις που χρησιμοποιούνται για εγγραφή δεδομένων σε ένα αρχείο κειμένου είναι οι: fprintf() fputs() fputc() Οι συναρτήσεις αυτές μπορούν να χρησιμοποιηθούν και για την εγγραφή δεδομένων σε δυαδικό αρχείο, αλλά δεν συνίσταται η χρήση τους 19 Η συνάρτηση fprintf() Η συνάρτηση fprintf() χρησιμοποιείται για την εγγραφή χαρακτήρων και αριθμητικών δεδομένων σε ένα αρχείο κειμένου Η σύνταξη και η χρήση της είναι πανομοιότυπη με τη συνάρτηση printf() με τη διαφορά ότι η συνάρτηση fprintf() δέχεται μία επιπλέον παράμετρο Αυτή η παράμετρος είναι ένας δείκτης σε μία δομή τύπου FILE, που συνδέεται με το αρχείο στο οποίο θέλουμε να αποθηκεύσουμε τα δεδομένα, και επιστρέφεται από τη συνάρτηση fopen() 20 10

Παράδειγμα Ι Τί κάνει το παρακάτω πρόγραμμα??? Γράφει 5 φορές το μήνυμα "Hello" και τον αντίστοιχο αύξοντα αριθμό στο αρχείο test.txt 21 Παράδειγμα ΙΙ Ποιο είναι το μέγεθος του αρχείου που δημιουργείται με το παρακάτω πρόγραμμα σε λειτουργικό σύστημα Windows??? Απάντηση: Για τον τριψήφιο αριθμό 123 αποθηκεύονται στο αρχείο τρεις χαρακτήρες. Ο χαρακτήρας '1' με ASCII τιμή 49, ο χαρακτήρας '2' με ASCII τιμή 50 και ο χαρακτήρας '3' με ASCII τιμή 51. Επίσης, στα Windows: '\n' '\r' '\n' (άρα τελικά: 5 bytes) 22 11

Παρατηρήσεις Σημειώστε ότι, αν στο τελευταίο παράδειγμα αλλάζαμε το προσδιοριστικό μετατροπής στην fprintf() και αντί για %d χρησιμοποιούσαμε %c, δηλαδή: fprintf(fp,"%c\n",123); τότε θα αποθηκευόταν στο αρχείο μόνο ένας χαρακτήρας, αυτός που έχει ASCII τιμή 123 Άρα, σε αυτή την περίπτωση το μέγεθος του αρχείου είναι 3 bytes ένα byte για τον χαρακτήρα με ASCII τιμή 123 ένα byte για το Carriage Return ('\r') και ένα byte για το Line Feed ('\n') Στη γενική περίπτωση, όταν αποθηκεύεται στο αρχείο ένας ακέραιος αριθμός με το προσδιοριστικό %d, τότε αποθηκεύονται τόσοι χαρακτήρες, όσα και τα ψηφία του αριθμού 23 Η συνάρτηση fputs() Η συνάρτηση fputs() χρησιμοποιείται για την εγγραφή μίας ακολουθίας χαρακτήρων σε ένα αρχείο κειμένου Το πρωτότυπο της συνάρτησης δηλώνεται στο αρχείο stdio.h και είναι το ακόλουθο: int fputs(char* str,file* fp); Η παράμετρος str είναι ένας δείκτης στη μνήμη που περιέχει τους χαρακτήρες που θα αποθηκευτούν στο αρχείο Η παράμετρος fp είναι ο δείκτης σε μία δομή τύπου FILE, που επιστρέφεται από τη συνάρτηση fopen() Η fputs() δεν προσθέτει αυτόματα τον χαρακτήρα νέας γραμμής στο τέλος της ακολουθίας Η συνάρτηση fputs() επιστρέφει μία μη αρνητική τιμή, αν η εγγραφή στο αρχείο ήταν επιτυχής, αλλιώς επιστρέφει EOF 24 12

Παράδειγμα Τί κάνει το παρακάτω πρόγραμμα??? Γράφει 5 φορές το μήνυμα "Hello" στο αρχείο test.txt αλλάζοντας και γραμμή κάθε φορά... 25 Η συνάρτηση fputc() Η συνάρτηση fputc() χρησιμοποιείται για την εγγραφή ενός χαρακτήρα σε ένα αρχείο κειμένου Το πρωτότυπο της συνάρτησης δηλώνεται στο αρχείο stdio.h και είναι το ακόλουθο: int fputc(int ch,file* fp); Η παράμετρος ch είναι ο χαρακτήρας που θα αποθηκευτεί στο αρχείο Η παράμετρος fp είναι ο δείκτης σε μία δομή τύπου FILE, που επιστρέφεται από τη συνάρτηση fopen() Αν η εγγραφή στο αρχείο ήταν επιτυχής η συνάρτηση fputc() επιστρέφει την ΑSCII τιμή του χαρακτήρα που αποθηκεύτηκε, αλλιώς EOF 26 13

Παρατηρήσεις Αν στα προηγούμενα παραδείγματα η παράμετρος fp των συναρτήσεων fprintf(), fputs() και fputc() αντικατασταθεί με τη λέξη stdout, τότε τα δεδομένα θα εμφανίζονται στην οθόνη Το stdout (standard output) αποτελεί το αρχείο εξόδου, το οποίο ανοίγει όταν ξεκινάει η εκτέλεση του προγράμματος και συνδέεται με την οθόνη 27 Διάβασμα από Αρχείο Κειμένου Οι κυριότερες συναρτήσεις που χρησιμοποιούνται για διάβασμα δεδομένων από ένα αρχείο κειμένου είναι οι: fscanf() fgets() fgetc() Τις συναρτήσεις αυτές τις χρησιμοποιούμε συγκρίνοντας την τιμή επιστροφής των με την τιμή που δηλώνει την επιτυχή ανάγνωση, ώστε, αν δεν είναι ίσες, να καταλάβουμε ότι είτε φτάσαμε στο τέλος του αρχείου είτε συνέβη κάποιο άλλο λάθος Ένας εναλλακτικός τρόπος για να διαπιστώσουμε αν φτάσαμε στο τέλος του αρχείου είναι με τη χρήση της συνάρτησης feof(), την οποία θα δούμε παρακάτω 28 14

Παρατηρήσεις Οι συναρτήσεις fscanf(), fgets() και fgetc() μπορούν να χρησιμοποιηθούν και για το διάβασμα δεδομένων από δυαδικό αρχείο, αλλά δεν συνίσταται η χρήση τους Για λόγους ευκολίας, προτείνουμε τα δεδομένα να διαβάζονται με τον ίδιο τρόπο με τον οποίο αποθηκεύτηκαν 29 Η συνάρτηση fscanf() Η συνάρτηση fscanf() χρησιμοποιείται για το διάβασμα χαρακτήρων και αριθμητικών δεδομένων από ένα αρχείο κειμένου Η σύνταξη και η χρήση της είναι πανομοιότυπη με τη συνάρτηση scanf() με τη διαφορά ότι η fscanf() δέχεται μία επιπλέον παράμετρο Αυτή η παράμετρος είναι ένας δείκτης σε μία δομή τύπου FILE, που συνδέεται με το αρχείο στο οποίο θέλουμε να αποθηκεύσουμε τα δεδομένα, και επιστρέφεται από τη συνάρτηση fopen() Όταν διαβάζονται διαφορετικά δεδομένα από το αρχείο η συνάρτηση fscanf(), όπως και η scanf(), χρησιμοποιεί το κενό διάστημα, για να ξεχωρίσουν οι τιμές μεταξύ των Η συνάρτηση fscanf() επιστρέφει το πλήθος των στοιχείων που διάβασε επιτυχημένα από το αρχείο, ενώ, όταν φτάσουμε στο τέλος του αρχείου ή αν συμβεί κάποιο άλλο λάθος, τότε η fscanf() επιστρέφει την τιμή EOF 30 15

Παράδειγμα Τί κάνει το παρακάτω πρόγραμμα??? Διαβάζει τους ακέραιους που περιέχονται στο αρχείο test.txt και τους εμφανίζει στην οθόνη 31 Παρατηρήσεις Όταν χρησιμοποιείτε την fscanf() πρέπει να γνωρίζετε με ποιον τρόπο είναι αποθηκευμένα τα δεδομένα στο αρχείο και τους αντίστοιχους τύπους δεδομένων Για παράδειγμα, αν κάθε γραμμή του αρχείου test.txt περιέχει έναν χαρακτήρα, έναν ακέραιο και έναν πραγματικό αριθμό, τότε ένα πρόγραμμα (όπως το επόμενο) θα μπορεί να διαβάσει σωστά τα δεδομένα από το αρχείο μόνο αν γνωρίζει τη συγκεκριμένη διάταξη, ώστε να χρησιμοποιήσει τους αντίστοιχους τύπους των δεδομένων δηλαδή char, int και float 32 16

Παράδειγμα Παρατηρείστε το '\n' στην fscanf(). Απαιτείται??? Ο χαρακτήρας '\n' προστίθεται έτσι ώστε να αγνοήσει η fscanf() τον χαρακτήρα '\n' που υπάρχει στο τέλος της γραμμής και να διαβάσει τον χαρακτήρα που υπάρχει στην επόμενη γραμμή. Αν δεν μπει, δεν θα λειτουργήσει σωστά το πρόγραμμα. 33 Η συνάρτηση fgets() Η συνάρτηση fgets() χρησιμοποιείται για το διάβασμα μίας ακολουθίας χαρακτήρων σε ένα αρχείο κειμένου Το πρωτότυπο της συνάρτησης δηλώνεται στο αρχείο stdio.h και είναι το ακόλουθο: char* fgets(char* str,int size,file* fp); Η παράμετρος str είναι ένας δείκτης στη μνήμη, στην οποία θα αποθηκευτεί η ακολουθία των χαρακτήρων Η παράμετρος size δηλώνει τον αριθμό των χαρακτήρων που θα αποθηκευτούν στη δεσμευμένη μνήμη και προφανώς - δεν πρέπει να είναι μεγαλύτερος από το μέγεθος της δεσμευμένης μνήμης (Σημ. η fgets() προσθέτει στο τέλος τον τερματικό χαρακτήρα '\0') Η παράμετρος fp είναι ο δείκτης σε μία δομή τύπου FILE, που επιστρέφεται από τη συνάρτηση fopen() Η συνάρτηση fgets() σταματάει να διαβάζει χαρακτήρες από το αρχείο, όταν διαβάσει τον χαρακτήρα νέας γραμμής ή όταν διαβάσει size-1 χαρακτήρες ενώ η επόμενη κλήση της fgets() συνεχίζει το διάβασμα των χαρακτήρων από εκεί που σταμάτησε η τελευταία Όταν φτάσουμε στο τέλος του αρχείου ή αν συμβεί κάποιο άλλο λάθος, τότε η fgets() επιστρέφει την τιμή NULL 34 17

Παρατηρήσεις Το μέγεθος της μνήμης που δεσμεύεται για την αποθήκευση των χαρακτήρων πρέπει να είναι μεγαλύτερο από το πλήθος των χαρακτήρων της κάθε γραμμής 35 Παράδειγμα Τί κάνει το παρακάτω πρόγραμμα??? Διαβάζει ένα αλφαριθμητικό μέχρι 100 χαρακτήρες, το αποθηκεύει στο αρχείο test.txt και κλείνει το αρχείο. Στη συνέχεια, ανοίγει πάλι το αρχείο, διαβάζει το αλφαριθμητικό και το εμφανίζει στην οθόνη 36 18

Η συνάρτηση fgetc() Η συνάρτηση fputc() χρησιμοποιείται για το διάβασμα ενός χαρακτήρα από ένα αρχείο κειμένου Το πρωτότυπο της συνάρτησης δηλώνεται στο αρχείο stdio.h και είναι το ακόλουθο: int fgetc(file* fp); Η παράμετρος fp είναι ο δείκτης σε μία δομή τύπου FILE, που επιστρέφεται από τη συνάρτηση fopen() H συνάρτηση fgetc() επιστρέφει τον χαρακτήρα που διαβάστηκε Όταν φτάσουμε στο τέλος του αρχείου ή αν συμβεί κάποιο άλλο λάθος, τότε η fgetc() επιστρέφει την τιμή EOF 37 Τέλος Αρχείου Υπενθυμίζεται ότι στα αρχεία κειμένου υπάρχει ένας ειδικός χαρακτήρας που καθορίζει το τέλος του αρχείου, ενώ στα δυαδικά αρχεία δεν υπάρχει κάποιος αντίστοιχος χαρακτήρας Για λειτουργικά συστήματα Windows ο ειδικός αυτός χαρακτήρας είναι ο Ctrl+Z με ASCII τιμή 26 Για λειτουργικά συστήματα Unix ο ειδικός αυτός χαρακτήρας είναι ο χαρακτήρας Ctrl+D με ASCII τιμή 4 38 19

Εγγραφή και διάβασμα σε/από δυαδικό αρχείο Στα δυαδικά αρχεία οι συναρτήσεις που χρησιμοποιούνται για την εγγραφή και την ανάγνωση δεδομένων είναι: για εγγραφή δεδομένων η συνάρτηση fwrite() για διάβασμα δεδομένων η συνάρτηση fread() 39 Η συνάρτηση fwrite() (I) Η συνάρτηση fwrite() χρησιμοποιείται κυρίως για άμεση αποθήκευση δεδομένων από τη μνήμη σε δυαδικό αρχείο Το πρωτότυπο της συνάρτησης δηλώνεται στο αρχείο stdio.h και είναι το ακόλουθο: int fwrite(void* buf,int size,int count,file* fp); Η παράμετρος buf είναι ένας δείκτης στη διεύθυνση μνήμης που βρίσκονται τα δεδομένα που θα αποθηκευτούν στο αρχείο Ο τύπος του δείκτη είναι void, ώστε να μπορεί να αποθηκευτεί οποιοσδήποτε τύπος δεδομένων Η παράμετρος size καθορίζει το μέγεθος ενός μεμονωμένου στοιχείου σε bytes, ενώ η παράμετρος count καθορίζει το πλήθος των στοιχείων που θα αποθηκευτούν στο αρχείο Για να βρούμε το μέγεθος ενός μεμονωμένου στοιχείου χρησιμοποιούμε τον τελεστή sizeof() Η παράμετρος fp είναι ο δείκτης σε μία δομή τύπου FILE, που επιστρέφεται από τη συνάρτηση fopen() 40 20

Η συνάρτηση fwrite() (II) int fwrite(void* buf,int size,int count,file* fp); Το γινόμενο των παραμέτρων size και count πρέπει να είναι ίσο με τον αριθμό των bytes που επιθυμούμε να αποθηκευτούν στο αρχείο Π.χ. αν θέλαμε να αποθηκεύσουμε σε ένα δυαδικό αρχείο έναν πίνακα 10 ακεραίων, τότε η τιμή του size θα ήταν όσο και το μέγεθος μίας μεταβλητής ακέραιου τύπου σε bytes, δηλαδή 4, και η τιμή του count ίση με 10 Η συνάρτηση fwrite() επιστρέφει το πλήθος των στοιχείων που αποθηκεύτηκαν επιτυχημένα στο αρχείο Αν αυτή η τιμή δεν είναι ίση με count, τότε σημαίνει ότι η εγγραφή δεν ήταν επιτυχής 41 Παραδείγματα χρήσης της fwrite() Π.χ. Αποθήκευση του πραγματικού αριθμού a σε δυαδικό αρχείο: float a; fwrite(&a,sizeof(float),1,fp); Π.χ. Αποθήκευση των 100 ακεραίων που περιέχονται στον πίνακα arr σε δυαδικό αρχείο: int arr[100]; fwrite(arr,sizeof(int),100,fp); ΠΑΡΑΤΗΡΗΣΕΙΣ: Η συνάρτηση fwrite() είναι η πλέον κατάλληλη συνάρτηση για την άμεση αποθήκευση μεγάλου όγκου δεδομένων, όπως πίνακες, δομές, πίνακες δομών,..., από τη μνήμη σε δυαδικό αρχείο 42 21

Η συνάρτηση fread() (I) Η συνάρτηση fwrite() χρησιμοποιείται κυρίως για άμεσο διάβασμα δεδομένων από ένα δυαδικό αρχείο στη μνήμη Το πρωτότυπο της συνάρτησης δηλώνεται στο αρχείο stdio.h και είναι το ακόλουθο: int fread(void* buf,int size,int count,file* fp); Η παράμετρος buf είναι ένας δείκτης στη διεύθυνση μνήμης που θα αποθηκευτούν τα δεδομένα που θα διαβαστούν από το αρχείο Ο τύπος του δείκτη είναι void, ώστε να μπορεί να διαβαστεί οποιοσδήποτε τύπος δεδομένων Η παράμετρος size καθορίζει το μέγεθος ενός μεμονωμένου στοιχείου σε bytes, ενώ η παράμετρος count καθορίζει το πλήθος των στοιχείων που θα αποθηκευτούν στη μνήμη Για να βρούμε το μέγεθος ενός μεμονωμένου στοιχείου χρησιμοποιούμε τον τελεστή sizeof() Η παράμετρος fp είναι ο δείκτης σε μία δομή τύπου FILE, που επιστρέφεται από τη συνάρτηση fopen() 43 Η συνάρτηση fread() (IΙ) int fread(void* buf,int size,int count,file* fp); Η συνάρτηση fread() επιστρέφει το πλήθος των στοιχείων που διαβάστηκαν επιτυχημένα από το αρχείο Αν αυτή η τιμή δεν είναι ίση με count, τότε σημαίνει είτε ότι η ανάγνωση δεν ήταν επιτυχής είτε ότι φτάσαμε στο τέλος του αρχείου 44 22

Παραδείγματα χρήσης της fread() Π.χ. Διάβασμα ενός πραγματικού αριθμού από δυαδικό αρχείο και αποθήκευση στη μεταβλητή a: float a; fread(&a,sizeof(float),1,fp); Π.χ. Διάβασμα 100 ακεραίων από δυαδικό αρχείο και αποθήκευση στον πίνακα ακεραίων arr : int arr[100]; fread(arr,sizeof(int),100,fp); ΠΑΡΑΤΗΡΗΣΕΙΣ: Η συνάρτηση fwrite() είναι η πλέον κατάλληλη συνάρτηση για τo άμεσο διάβασμα μεγάλου όγκου δεδομένων, όπως πίνακες, δομές, πίνακες δομών,..., από δυαδικό αρχείο στη μνήμη Οι συναρτήσεις fwrite() και fread() προτείνεται να χρησιμοποιούνται σε δυαδικά αρχεία και όχι σε αρχεία κειμένου Π.χ. μία εντολή εγγραφής 50 χαρακτήρων σε ένα αρχείο κειμένου θα εγγράψει λιγότερους χαρακτήρες αν αυτοί δεν είναι στην ίδια γραμμή, λόγω της ενδεχόμενης αντικατάστασης του χαρακτήρα νέας γραμμής από δύο χαρακτήρες 45 Η συνάρτηση feof() Έως τώρα, για να διαπιστώσουμε αν φτάσαμε στο τέλος κάποιου αρχείου, ελέγχαμε την τιμή επιστροφής της συνάρτησης που χρησιμοποιούσαμε για διάβασμα από το αρχείο Π.χ. η συνάρτηση fgets() επιστρέφει NULL, όταν φτάσουμε στο τέλος του αρχείου Ένας εναλλακτικός τρόπος για να ανιχνεύσουμε το τέλος κάποιου αρχείου είναι με τη χρήση της συνάρτησης feof() Το πρωτότυπό της δηλώνεται στο αρχείο stdio.h και είναι το ακόλουθο: int feof(file* fp); Η παράμετρος fp είναι ο δείκτης σε μία δομή τύπου FILE, που επιστρέφεται από τη συνάρτηση fopen() Η συνάρτηση feof() επιστρέφει μη μηδενική τιμή όταν φτάσουμε στο τέλος του αρχείου, αλλιώς επιστρέφει την τιμή 0 46 23

Παρατηρήσεις Η ανίχνευση του τέλους ενός αρχείου προτείνεται να γίνεται ελέγχοντας την τιμή επιστροφής της συνάρτησης που χρησιμοποιείται για το διάβασμα των περιεχομένων του (π.χ. fgets(), fscanf(),...) και όχι με την feof() Άρα πότε πρέπει να χρησιμοποιείται η feof()? Η feof() πρέπει να χρησιμοποιείται όταν θέλετε να επιβεβαιώσετε ότι μία εντολή ανάγνωσης απέτυχε, επειδή φτάσατε στο τέλος του αρχείου και όχι για κάποιον άλλον λόγο Π.χ. if(fgets(text,sizeof(text),fp) == NULL) { if(feof(fp) printf("end of file\n"); else printf("fgets() failed\n"); } Η συνάρτηση feof() μπορεί να χρησιμοποιηθεί και σε δυαδικά αρχεία και σε αρχεία κειμένου 47 Άμεση εγγραφή δεδομένων στο αρχείο Οι συναρτήσεις fprintf(), fputs(), fputc() και fwrite() που είδαμε, χρησιμοποιούνται για την εγγραφή δεδομένων σε αρχεία κειμένου και σε δυαδικά αρχεία Στην πραγματικότητα, τα δεδομένα δεν αποθηκεύονται κατευθείαν στο αρχείο που βρίσκεται στον δίσκο, αλλά αποθηκεύονται προσωρινά σε ένα τμήμα μνήμης που έχει δεσμευτεί γι αυτόν τον σκοπό Δηλαδή, για κάθε αρχείο που ανοίγει για εγγραφή, το λειτουργικό σύστημα δεσμεύει ένα μπλοκ μνήμης, στο οποίο αποθηκεύονται προσωρινά τα δεδομένα, πριν αυτά εγγραφούν στο αρχείο Όταν αυτή η μνήμη γεμίσει με δεδομένα, τότε το λειτουργικό σύστημα αυτόματα παίρνει τα δεδομένα από τη μνήμη και τα αποθηκεύει στο αρχείο Ωστόσο, αν συμβεί κάποιο πρόβλημα στη λειτουργία του προγράμματος (π.χ. crash) ή στη λειτουργία του υπολογιστή (π.χ. διακοπή ή πτώση τάσης), τότε τα δεδομένα που βρίσκονται στη μνήμη μπορεί να χαθούν και να μην αποθηκευτούν στο αρχείο 48 24

Η συνάρτηση fflush() Τη συνάρτηση fflush() την έχουμε ήδη χρησιμοποιήσει, πριν από το διάβασμα νέων δεδομένων, για τη διαγραφή των χαρακτήρων που πιθανόν να έχουν παραμείνει στη μνήμη που συνδέεται με το πληκτρολόγιο Μία άλλη χρήση της συνάρτησης fflush() είναι για την άμεση εγγραφή των δεδομένων στο αρχείο Όταν δηλαδή καλείται η συνάρτηση fflush() τα δεδομένα που βρίσκονται στη μνήμη αποθηκεύονται άμεσα στο αρχείο Το πρωτότυπό της δηλώνεται στο αρχείο stdio.h και είναι το ακόλουθο: int fflush(file* fp); Η παράμετρος fp είναι ο δείκτης σε μία δομή τύπου FILE, που επιστρέφεται από τη συνάρτηση fopen() Η συνάρτηση fflush() επιστρέφει την τιμή 0, αν η άμεση αποθήκευση των δεδομένων στο αρχείο ήταν επιτυχής, αλλιώς επιστρέφει την τιμή EOF 49 Παρατηρήσεις Η κλήση της συνάρτησης fflush() με παράμετρο NULL, δηλαδή fflush(null); αποθηκεύει όλα τα δεδομένα που υπάρχουν στις μνήμες στα αντίστοιχα ανοικτά αρχεία Το stdin δηλώνεται στο αρχείο stdio.h και είναι ένας δείκτης στο αρχείο εισόδου, το οποίο ανοίγει όταν ξεκινάει η εκτέλεση του προγράμματος και συνδέεται με την εισαγωγή δεδομένων από το πληκτρολόγιο, δηλ. με την εντολή fflush(stdin); διαγράφονται οι χαρακτήρες που μπορεί να έχουν παραμείνει στο αρχείο εισόδου (ΠΡΟΣΟΧΗ όμως, η συγκεκριμένη χρήση της fflush() δεν υποστηρίζεται από το πρότυπο) 50 25

Η συνάρτηση fseek() (Ι) Η συνάρτηση fseek() χρησιμοποιείται για να μετακινήσει τον δείκτη που δείχνει σε κάποια θέση του αρχείου, σε οποιοδήποτε σημείο του αρχείου Το πρωτότυπό της δηλώνεται στο αρχείο stdio.h και είναι το ακόλουθο: int fseek(file* fp,long offset,int origin); Η παράμετρος fp είναι ο δείκτης σε μία δομή τύπου FILE, που επιστρέφεται από τη συνάρτηση fopen() Η παράμετρος offset δηλώνει πόσα bytes θα απέχει η νέα θέση του δείκτη από τη θέση που καθορίζεται στο πεδίο origin Η τιμή του offset μπορεί να είναι και αρνητική, γεγονός που σημαίνει ότι η μετατόπιση του δείκτη γίνεται προς τα πίσω μέσα στο αρχείο) 51 Η συνάρτηση fseek() (ΙΙ) int fseek(file* fp,long offset,int origin); Η παράμετρος origin καθορίζει το σημείο εκκίνησης από το οποίο θα μετακινηθεί ο δείκτης και οι επιτρεπτές τιμές φαίνονται στον πίνακα Σταθερά Τιμή Περιγραφή SEEK_SET 0 ο δείκτης θέσης του αρχείου μεταφέρεται offset bytes από την αρχή του αρχείου SEEK_CUR 1 ο δείκτης θέσης του αρχείου μεταφέρεται offset bytes από την τρέχουσα θέση του SEEK_END 2 ο δείκτης θέσης του αρχείου μεταφέρεται offset bytes από το τέλος του αρχείου Η συνάρτηση fseek() επιστρέφει την τιμή 0, αν ο δείκτης μετακινήθηκε επιτυχώς, αλλιώς επιστρέφει μία μη μηδενική τιμή 52 26

Παρατηρήσεις Η συνάρτηση fseek() χρησιμοποιείται κυρίως σε δυαδικά αρχεία και όχι σε αρχεία κειμένου, γιατί, εξαιτίας της μετατροπής του χαρακτήρα νέας γραμμής ('\n') στον χαρακτήρα τέλους γραμμής και αντίστροφα, μπορεί να μην λειτουργήσει σωστά Σε αρχεία κειμένου η fseek() θα λειτουργήσει σίγουρα σωστά, αν η τιμή του πεδίου offset είναι μηδέν (0) και για οποιαδήποτε τιμή του πεδίου origin 53 Παραδείγματα Ποια είναι η έξοδος του παρακάτω προγράμματος??? 54 27