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

Σχετικά έγγραφα
Αρχεία. Προγραμματισμός II 1

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

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

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

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

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

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

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

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

Βασικές λειτουργίες συστήματος πάνω σε αρχεία δεδομένων. Προγραμματισμός II 1

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

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

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

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

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

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

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

Διαδιεργασιακή επικοινωνία (inter-process communication IPC) Προγραμματισμός II 1

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

Αγωγοί/Σωλήνες (Pipes) Προγραμματισμός II 1

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

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

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

Δημιουργία & Τερματισμός Διεργασιών. Προγραμματισμός II 1

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

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

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

Μνήμη Διευθύνσεις Δείκτες. Προγραμματισμός II 1

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

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

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

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

Δημιουργία & Τερματισμός Διεργασιών. Προγραμματισμός II 1

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

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

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

Προγραμματισμός συστημάτων UNIX/POSIX. Ανακατευθύνσεις (redirections)

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

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

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

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

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

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

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

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

Streams Input / Output in C++ George Kastrinis

Εισαγωγή στον Προγραμματισμό Εργαστήριο 3: Βοηθητικά προγράμματα του Linux CLI. Οκτώβριος 2014 Χ. Αλεξανδράκη Γ. Δημητρακάκης

Διάλεξη 2: Επανάληψη Προγραμματισμού Συμβολοσειρές (strings) Διδάσκων: Παναγιώτης Ανδρέου

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

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

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

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

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

Εισαγωγή στον Προγραμματισμό Εργαστήριο 3: Βοηθητικά προγράμματα του Linux CLI. Οκτώβριος 2014 Χ. Αλεξανδράκη Γ. Δημητρακάκης

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

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

Μετατροπή χαρακτήρων ASCII σε ακέραιο αριθµό (atoi) & Άνοιγµα αρχείου µέσα από τo QtSPIM, διάβασµα, και αποθήκευση του περιεχοµένου του στη µνήµη

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

Λειτουργικά Συστήματα Κεφάλαιο 2 Οργάνωση Συστήματος Αρχείων 2.1 Διαχείριση Αρχείων και Σύστημα Αρχείων(File System)

Οντοκεντρικός Προγραμματισμός ΦΡΟΝΤΙΣΤΗΡΙΟ JAVA

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

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

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

Διαχείριση Περιεχομένου Παγκόσμιου Ιστού και Γλωσσικά Εργαλεία ΔΟΜΕΣ ΔΕΔΟΜΕΝΩΝ FILE & PROCESS HANDLING

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

Λειτουργικά Συστήματα (ΙΙ) (διαχείριση αρχείων)

Εικονική Μνήμη (Virtual Memory) Προγραμματισμός II 1

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

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

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

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

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

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

Λειτουργικό Σύστημα: διαχείριση πόρων. Τι είναι ένα αρχείο ; Διαχείριση αρχείων. Λειτουργικά Συστήματα (ΙΙ) (διαχείριση αρχείων)

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

Τεχνολογία και Προγραμματισμός Υπολογιστών. Η γλώσσα προγραμματισμού C

Λειτουργικό Σύστημα: διαχείριση πόρων. Διαχείριση αρχείων. Τι είναι ένα αρχείο ; Λειτουργικά Συστήματα (ΙΙ) (διαχείριση αρχείων)

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

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

Εικονική Μνήμη (Virtual Memory) Προγραμματισμός II 1

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

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

Transcript:

Αρχεία Προγραμματισμός II 1 ais@inf.uth.gr

Μόνιμη αποθήκευση δεδομένων Οι μεταβλητές και δομές δεδομένων ενός προγράμματος υπάρχουν στην μνήμη του Η/Υ Χάνονται όταν τερματιστεί το πρόγραμμα ή σβήσει ο Η/Υ (πιθανώς λόγω βλάβης) Χρειαζόμαστε μόνιμα αποθηκευτικά μέσα που λειτουργούν χωρίς παροχή ρεύματος μαγνητικά, οπτικά, soid-state, Σημείωση: και ο ίδιος ο κώδικας (sources, binaries) είναι δεδομένα που δεν θέλουμε να χάνονται κάθε φορά που σβήνουμε τον υπολογιστή Προγραμματισμός II 2 ais@inf.uth.gr

Πρόσβαση μέσων αποθήκευσης Η πρόσβαση στα μόνιμα αποθηκευτικά μέσα είναι μια αρκετά περίπλοκη υπόθεση καμία σχέση με το απλό μοντέλο της κυρίως μνήμης κάθε τεχνολογία έχει τις ιδιαιτερότητες της κάθε συσκευή μπορεί να απαιτεί διαφορετική διαχείριση Χρειάζεται ένα γενικό μοντέλο πρόσβασης ανεξάρτητου της τεχνολογίας που χρησιμοποιείται για την υλοποίηση μιας αποθηκευτικής συσκευής Επίσης χρειάζεται ελεγχόμενη πρόσβαση στις συσκευές αποθήκευσης, ώστε να παρέχεται προστασία/ασφάλεια των δεδομένων Προγραμματισμός II 3 ais@inf.uth.gr

Appications API κατάλληλη αφαίρεση; Προγραμματισμός II 4 ais@inf.uth.gr

Αρχεία Ξεχωριστές οντότητες αποθήκευσης δεδομένων Τα αρχεία είναι μόνιμα: εξακολουθούν να υφίστανται ακόμα και μετά τον τερματισμό των προγραμμάτων που τα δημιούργησαν/επεξεργάστηκαν συχνά, επιζούν πολύ παραπάνω και από τους υπολογιστές και τα προγράμματα μέσω των οποίων δημιουργήθηκαν Τα αρχεία είναι επώνυμα: κάθε αρχείο έχει «μοναδικό» όνομα/αναγνωριστικό για να μπορεί να εντοπιστεί αργότερα, είτε από το πρόγραμμα που το δημιούργησε είτε από άλλα προγράμματα, είτε από τον ίδιο τον χρήστη Προγραμματισμός II 5 ais@inf.uth.gr

Χώρος ονομάτων (name space) Τα ονόματα αρχείων δίνονται στο πλαίσιο ενός «χώρου ονομάτων» του συστήματος Ο χώρος είναι δομημένος ιεραρχικά διευκολύνει την ανάθεση μοναδικών ονομάτων διευκολύνει την διαχείριση πολλών αρχείων διευκολύνει τον έλεγχο πρόσβασης Κάθε επίπεδο ονομάζεται κατάλογος (directory) Η δομή αναπαρίσταται ως «ανεστραμμένο» δέντρο Η ρίζα (root) είναι στο ψηλότερο επίπεδο και αποτελεί την κορυφή της ιεραρχίας καταλόγων Τα αρχεία μπορεί να δημιουργηθούν/τοποθετηθούν σε οποιοδήποτε επίπεδο του χώρου ονομάτων Προγραμματισμός II 6 ais@inf.uth.gr

/ users system profs ugrads grads bin incude ibs ais emkouts progii distrsys progii a1.pdf a1.pdf Προγραμματισμός II 7 ais@inf.uth.gr

Προσδιορισμός ονομάτων Απόλυτος προσδιορισμός, σε καθολικό επίπεδο πλήρες όνομα, με βάση την κορυφή της ιεραρχίας Σχετικός προσδιορισμός, σε τοπικό επίπεδο τμήμα ονόματος, με βάση τον κατάλογο εργασίας Συμβάσεις "." για τον τρέχοντα κατάλογο εργασίας ".." για τον κατάλογο που βρίσκεται ένα επίπεδο ψηλότερα από τον τρέχοντα κατάλογο εργασίας "/" για την ρίζα του δέντρου, αλλά και ως διαχωριστικό ανάμεσα στα ονόματα καταλόγων/αρχείων ενός μονοπατιού Προγραμματισμός II 8 ais@inf.uth.gr

/ users system profs ugrads grads bin incude ibs ais emkouts progii distrsys progii a1.pdf a1.pdf όνομα: a1.pdf κατάλογος εργασίας αναφορά Προγραμματισμός II 9 ais@inf.uth.gr

/ users system profs ugrads grads bin incude ibs ais emkouts progii distrsys progii a1.pdf a1.pdf όνομα: progii/a1.pdf κατάλογος εργασίας αναφορά Προγραμματισμός II 10 ais@inf.uth.gr

/ users system profs ugrads grads bin incude ibs ais emkouts progii distrsys progii a1.pdf a1.pdf όνομα: progii/a1.pdf κατάλογος εργασίας αναφορά Προγραμματισμός II 11 ais@inf.uth.gr

/ users system profs ugrads grads bin incude ibs ais emkouts progii distrsys progii a1.pdf a1.pdf όνομα: /users/profs/ais/progii/a1.pdf κατάλογος εργασίας αναφορά Προγραμματισμός II 12 ais@inf.uth.gr

/ users system profs ugrads grads bin incude ibs ais emkouts progii distrsys progii a1.pdf a1.pdf όνομα: /users/profs/ais/progii/a1.pdf κατάλογος εργασίας αναφορά Προγραμματισμός II 13 ais@inf.uth.gr

/ users system profs ugrads grads bin incude ibs ais emkouts progii distrsys progii a1.pdf a1.pdf όνομα:../progii/a1.pdf κατάλογος εργασίας αναφορά Προγραμματισμός II 14 ais@inf.uth.gr

/ users system profs ugrads grads bin incude ibs ais emkouts progii distrsys progii a1.pdf a1.pdf όνομα:../../grads/emkouts/progii/a1.pdf κατάλογος εργασίας αναφορά Προγραμματισμός II 15 ais@inf.uth.gr

Προστασία αρχείων / καταλόγων Για κάθε αρχείο / κατάλογο το λειτουργικό διατηρεί πληροφορία για τον ιδιοκτήτη του, καθώς και για τις άδειες πρόσβασης στο αρχείο Υποκείμενα αδειών: user, group, others Ξεχωριστές άδειες για κάθε υποκείμενο Όταν ένα πρόγραμμα επιχειρεί να προσπελάσει ένα αρχείο, το λειτουργικό ελέγχει την άδεια πρόσβασης αν ο χρήστης στο όνομα του οποίου εκτελείται το πρόγραμμα δεν έχει άδεια να προσπελάσει το αρχείο, η λειτουργία δεν εκτελείται Αλλαγές ιδιοκτησίας γίνονται μέσω chown / fchown Αλλαγές αδειών γίνονται μέσω chmod / fchmod Προγραμματισμός II 16 ais@inf.uth.gr

Προσδιορισμός αδειών με chmod Προσδιορισμός υποκειμένων u(ser) χρήστης/ιδιοκτήτης g(group) ομάδα o(thers) άλλοι a() όλοι Προσδιορισμός άδειας r(ead) ανάγνωση w(rite) γράψιμο/αλλαγή (e)x(ecute) εκτέλεση chmod u+rwx fiename chmod o+rx,o-w fiename Προγραμματισμός II 17 ais@inf.uth.gr

Οκταδική κωδικοποίηση αδειών read (octa 4) write (octa 2) execute (octa 1) 1 0 0 0 1 0 0 0 1 Προσδιορισμός άδειας 4 ανάγνωση 2 γράψιμο/αλλαγή 1 εκτέλεση Ξεχωριστά οκταδικά ψηφία για χρήστη-ομάδα-άλλους με αυτή την σειρά Πιο εύκολη προσθαφαίρεση αδειών chmod 755 fiename user group others Προγραμματισμός II 18 ais@inf.uth.gr

Γράψιμο/διάβασμα δεδομένων σε/από αρχείο Τα bytes γράφονται/διαβάζονται σειριακά Η θέση εγγραφής/ανάγνωσης αυξάνεται αυτόματα όταν γράφονται/διαβάζονται bytes (κατά τον αριθμό των bytes που γράφτηκαν/διαβάστηκαν) Η θέση εγγραφής/ανάγνωσης μπορεί να αλλάξει (προς τα εμπρός ή πίσω) και με ρητό τρόπο Το αρχείο επεκτείνεται/μεγαλώνει αυτόματα, όταν γράφονται bytes πέρα από το τέλος του Το αρχείο μπορεί να συρρικνωθεί/κοπεί, από το τέλος προς την αρχή αυτό πρέπει να γίνει ρητά δεν υπάρχει λειτουργία για το σβήσιμο/αποκοπή περιεχομένων από την αρχή ή το μέσο του αρχείου Προγραμματισμός II 20 ais@inf.uth.gr

πρώτο byte θέση ανάγνωσης/εγγραφής τελευταίο byte περιεχόμενα αρχείου Προγραμματισμός II 21 ais@inf.uth.gr

Ερμηνεία περιεχομένων ενός αρχείου Το λειτουργικό σύστημα διαβάζει/γράφει bytes από/σε αρχεία χωρίς να τα ερμηνεύει Η σημασία/ερμηνεία των περιεχομένων ενός αρχείου είναι ευθύνη του προγράμματος Χρειάζονται κατάλληλες συμβάσεις/πρότυπα κωδικοποίησης/ερμηνείας των δεδομένων Η τιμή ενός ή πολλών bytes μπορεί να ερμηνευθεί με πολλούς διαφορετικούς τρόπους Text fie: το περιεχόμενο του αρχείου πρέπει να ερμηνευθεί χρησιμοποιώντας την σύμβαση ASCII Binary fie: ένα αρχείο που δεν είναι (μόνο) text Προγραμματισμός II 22 ais@inf.uth.gr

Η βιβλιοθήκη stdio Ορίστηκε από τον Dennis Ritchie το 1975 Μέρος του προτύπου ANSI C Λειτουργίες υψηλού επιπέδου για ανάγνωση και γράψιμο δεδομένων, ανεξάρτητες του εκάστοτε λειτουργικού συστήματος Διάβασμα/γράψιμο από/σε ροές δεδομένων (streams) Υποστήριξη για μορφοποιημένη εκτύπωση/σκανάρισμα συμβολοσειρών (strings) και αριθμητικών τιμών Χρησιμοποιεί εσωτερική αποθήκη δεδομένων Χρησιμοποιεί, εσωτερικά, αντίστοιχες κλήσεις συστήματος open, read, write, cose, Προγραμματισμός II 23 ais@inf.uth.gr

εφαρμογή (appication) fopen, fread, fwrite, fcose, βιβλιοθήκη stdio open, read, write, cose, αποθήκη κώδικας συστήματος user system Προγραμματισμός II 24 ais@inf.uth.gr

Μοροφοποιμένο σκανάρσιμα/εκτύπωση Μετατροπή ανάμεσα στην «εσωτερική» αναπαράσταση / κωδικοποίηση των δεδομένων που υπάρχουν στην μνήμη του προγράμματος, και μια (εντελώς) διαφορετική μορφή που είναι κατανοητή στον άνθρωπο (human readabe) Η stdio παρέχει μια σειρά από τέτοιες λειτουργίες, για την ροή της καθιερωμένης εισόδου/εξόδου αλλά και για οποιαδήποτε άλλη ροή θελήσει να δημιουργήσει η εφαρμογή getc(), putc(), scanf(), printf(), fgetc(), fputc(), fscanf(), fprintf(), Η stdio δημιουργεί αυτόματως ανοιχτές ροές για την συμβατική είσοδο, έξοδο και έξοδο λαθών FILE *stdin, *stdout, *stderr Προγραμματισμός II 25 ais@inf.uth.gr

Βασικές λειτουργίες αρχείων (1) FILE *fopen(const char *fiename, const char *mode) O τρόπος με τον οποίο πρόκειται να χρησιμοποιηθεί το αρχείο προσδιορίζεται μέσω της παραμέτρου mode r: για διάβασμα, το αρχείο πρέπει να υπάρχει w: δημιουργία κενού αρχείου για γράψιμο, αν το αρχείο υπάρχει, σβήνονται όλα τα περιεχόμενα του και μένει κενό a: για προσθήκη στο τέλος, το αρχείο δημιουργείται αν δεν υπάρχει r+: για διάβασμα και γράψιμο, το αρχείο πρέπει να υπάρχει w+: δημιουργία κενού αρχείου για διάβασμα και γράψιμο, αν το αρχείο υπάρχει, σβήνονται όλα τα περιεχόμενα του και μένει κενό a+: για διάβασμα και προσθήκη στο τέλος, το αρχείο πρέπει να υπάρχει Προγραμματισμός II 26 ais@inf.uth.gr

Βασικές λειτουργίες αρχείων (2) size_t fread(void *ptr, size_t size, size_t nmemb, FILE *stream) ανάγνωση bytes με αντιγραφή στην διεύθυνση ptr ο αριθμός των bytes που διαβάζονται είναι size x nmemb size_t fwrite(const void *ptr, size_t size, size_t nmemb, FILE *stream) γραψιμο bytes με αντιγραφή από την διεύθυνση ptr ο αριθμός των bytes που γράφονται είναι size x nmemb int fcose(file *stream) κλείσιμο, με απελευθέρωση πόρων (εσωτερικών buffers) Προγραμματισμός II 27 ais@inf.uth.gr

Βασικές λειτουργίες αρχείων (3) void rewind(file *stream) επαναφορά θέσης γράψιματος/ανάγνωσης στην αρχή int fgetpos(file *stream, fpos_t *pos) επιστροφή θέσης γράψιματος/ανάγνωσης int fsetpos(file *stream, const fpos_t *pos) απόλυτη μετακίνηση της θέσης γράψιματος/ανάγνωσης int fseek(file *stream, ong int offset, int whence) σχετική μετακίνηση της θέσης ανάγνωσης/εγγραφής το whence ορίζει το σημείο αναφοράς για το offset SEEK_SET: αρχή του αρχείου SEEK_CUR: τρέχουσα θέση γραψίματος/ανάγνωσης SEEK_END: τέλος του αρχείου Προγραμματισμός II 28 ais@inf.uth.gr

Βασικές λειτουργίες αρχείων (4) int feof(file *stream) έλεγχος τέλους αρχείου int ffush(file *stream) άδειασμα εσωτερικής αποθήκης για αρχεία: γράψιμο στον δίσκο int ferror(file *stream) έλεγχος γα λάθος (από προηγούμενη λειτουργία) void perror(const char *str) εκτύπωση μηνύματος λάθος στην συμβατική έξοδο λαθών (stderr) void cearerr(file *stream) καθάρισμα (reset) λάθους και ένδειξης eof Προγραμματισμός II 29 ais@inf.uth.gr

Προσοχή στις λεπτομέρειες Διαβάστε προσεκτικά το manua Υπάρχουν διάφορα «περίεργα»... Για παράδειγμα: If a fie is opened for update (the + mode), an output operation may not be foowed by an input operation without fushing the buffer or repositioning, and an input operation may not be foowed by an output operation without fushing the buffer or repositioning, uness the input operation has reached end-of-fie. For input streams, ffush() discards any buffered data that has been fetched from the underying fie, but has not been consumed by the appication. For output streams, ffush() forces a write of a user-space buffered data for the given output or update stream via the stream's underying write function for fies, this does not ensure that the data wi actuay be written on disk. Προγραμματισμός II 30 ais@inf.uth.gr

FILE *f; char str[]="heo word"; f=fopen("test","wb+"); fwrite(str,1,5,f); ffush(f); fwrite(&str[5],1,6,f); ffush(f); fwrite(" :-)",1,4,f); ffush(f); str h e 68 65 6C 6C o 6F w o r d \0 20 77 6F 72 6C 64 00 ερμηνεία ως ASCII τιμή bytes στην μνήμη Προγραμματισμός II 31 ais@inf.uth.gr

FILE *f; char str[]="heo word"; f=fopen("test","wb+"); fwrite(str,1,5,f); ffush(f); fwrite(&str[5],1,6,f); ffush(f); fwrite(" :-)",1,4,f); ffush(f); str h e 68 65 6C 6C o 6F w o r d \0 20 77 6F 72 6C 64 00 test Προγραμματισμός II 32 ais@inf.uth.gr

FILE *f; char str[]="heo word"; f=fopen("test","wb+"); fwrite(str,1,5,f); ffush(f); fwrite(&str[5],1,6,f); ffush(f); fwrite(" :-)",1,4,f); ffush(f); str h e 68 65 6C 6C o 6F w o r d \0 20 77 6F 72 6C 64 00 test 68 65 6C 6C 6F Προγραμματισμός II 33 ais@inf.uth.gr

FILE *f; char str[]="heo word"; f=fopen("test","wb+"); fwrite(str,1,5,f); ffush(f); fwrite(&str[5],1,6,f); ffush(f); fwrite(" :-)",1,4,f); ffush(f); str h e 68 65 6C 6C o 6F w o r d \0 20 77 6F 72 6C 64 00 test 68 65 6C 6C 6F 20 77 6F 72 6C 64 Προγραμματισμός II 34 ais@inf.uth.gr

FILE *f; char str[]="heo word"; f=fopen("test","wb+"); fwrite(str,1,5,f); ffush(f); fwrite(&str[5],1,6,f); ffush(f); fwrite(" :-)",1,4,f); ffush(f); str h e 68 65 6C 6C o 6F w o r d \0 20 77 6F 72 6C 64 00 : - ) 20 3A 2D 29 /0 test 68 65 6C 6C 6F 20 77 6F 72 6C 64 20 3A 2D 29 Προγραμματισμός II 35 ais@inf.uth.gr

FILE *f; char str[]="heo word"; f=fopen("test","wb+"); fwrite(str,1,5,f); ffush(f); fwrite(&str[5],1,6,f); ffush(f); fwrite(" :-)",1,4,f); ffush(f); str h e 68 65 6C 6C o 6F w o r d \0 20 77 6F 72 6C 64 00 test 68 65 6C 6C 6F 20 77 6F 72 6C 64 20 3A 2D 29 Προγραμματισμός II 36 ais@inf.uth.gr

fseek(f,-3,seek_cur); fread(&str[6],1,3,f); fseek(f,-9,seek_end); fwrite("there",1,5,f); ffush(f); fcose(f); str h e 68 65 6C 6C o 6F w o r d \0 20 77 6F 72 6C 64 00 test 68 65 6C 6C 6F 20 77 6F 72 6C 64 20 3A 2D 29 Προγραμματισμός II 37 ais@inf.uth.gr

fseek(f,-3,seek_cur); fread(&str[6],1,3,f); fseek(f,-9,seek_end); fwrite("there",1,5,f); ffush(f); fcose(f); str h e 68 65 6C 6C o 6F w o r d \0 20 77 6F 72 6C 64 00 test 68 65 6C 6C 6F 20 77 6F 72 6C 64 20 3A 2D 29 Προγραμματισμός II 38 ais@inf.uth.gr

fseek(f,-3,seek_cur); fread(&str[6],1,3,f); fseek(f,-9,seek_end); fwrite("there",1,5,f); ffush(f); fcose(f); str h e 68 65 6C 6C o 6F : - ) d \0 20 3A 2D 29 6C 64 00 test 68 65 6C 6C 6F 20 77 6F 72 6C 64 20 3A 2D 29 Προγραμματισμός II 39 ais@inf.uth.gr

fseek(f,-3,seek_cur); fread(&str[6],1,3,f); fseek(f,-9,seek_end); fwrite("there",1,5,f); ffush(f); fcose(f); str h e 68 65 6C 6C o 6F : - ) d \0 20 3A 2D 29 6C 64 00 test 68 65 6C 6C 6F 20 77 6F 72 6C 64 20 3A 2D 29 Προγραμματισμός II 40 ais@inf.uth.gr

fseek(f,-3,seek_cur); fread(&str[6],1,3,f); fseek(f,-9,seek_end); fwrite("there",1,5,f); ffush(f); fcose(f); str h e 68 65 6C 6C o 6F : - ) d \0 20 3A 2D 29 6C 64 00 t h e r 74 68 65 72 e /0 65 test 68 65 6C 6C 6F 20 74 68 65 72 65 20 3A 2D 29 Προγραμματισμός II 41 ais@inf.uth.gr

fseek(f,-3,seek_cur); fread(&str[6],1,3,f); fseek(f,-9,seek_end); fwrite("there",1,5,f); ffush(f); fcose(f); str h e 68 65 6C 6C o 6F : - ) d \0 20 3A 2D 29 6C 64 00 test 68 65 6C 6C 6F 20 74 68 65 72 65 20 3A 2D 29 Προγραμματισμός II 42 ais@inf.uth.gr

fseek(f,-3,seek_cur); fread(&str[6],1,3,f); fseek(f,-9,seek_end); fwrite("there",1,5,f); ffush(f); fcose(f); str h e 68 65 6C 6C o 6F : - ) d \0 20 3A 2D 29 6C 64 00 test 68 65 6C 6C 6F 20 74 68 65 72 65 20 3A 2D 29 Προγραμματισμός II 43 ais@inf.uth.gr

Κόψιμο/επέκταση αρχείου με truncate int truncate(const char *path, off_t ength); Αν η τιμή ength είναι μικρότερη από το μήκος του αρχείου, το αρχείο κόβεται σε αυτό το μήκος Αν η τιμή ength είναι μεγαλύτερη από το μήκος του αρχείου, το αρχείο επεκτείνεται σε αυτό το μήκος τα επιπλέον bytes έχουν τιμή x00 Λειτουργία του συστήματος (όχι της stdio) καλό είναι να αποφεύγεται η χρήση λειτουργιών συστήματος παράλληλα με λειτουργίες της stdio Προγραμματισμός II 44 ais@inf.uth.gr

Μορφοποιημένο σκανάρισμα / εκτύπωση Αφορά ροές δεδομένων ASII (όχι binary) Η scanf/fscanf διαβάζει σύμβολα που διαχωρίζονται από έναν ή περισσότερους «κατά σύμβαση» διαχωριστικούς χαρακτήρες αυτοί δεν επιστρέφονται στο πρόγραμμα Η printf/fprintf εκτυπώνει όλους τους χαρακτήρες που δίνει το πρόγραμμα δεν αγνοούνται οι «λευκοί» χαρακτήρες που περιέχει η έκφραση (string) που δίνεται από το πρόγραμμα Προγραμματισμός II 45 ais@inf.uth.gr

Εσωτερική αποθήκη Η stdio διατηρεί τους χαρακτήρες που προορίζονται για γράψιμο ή ανάγνωση σε εσωτερική αποθήκη μείωση των κλήσεων συστήματος (write/read) Γράψιμο: τα δεδομένα γράφονται στην αποθήκη και μεταφέρονται στην ροή όταν γεμίσει η αποθήκη ή το ζητήσει ρητά το πρόγραμμα με ffush() Διάβασμα: τα δεδομένα διαβάζονται από την ροή στην αποθήκη, και από εκεί προωθούνται στο πρόγραμμα Ξεχωριστή εσωτερική αποθήκη για κάθε ροή, που δημιουργείται αυτόματα κατά την πρώτη κλήση μιας λειτουργίας ανάγνωσης/γραψίματος Προγραμματισμός II 46 ais@inf.uth.gr

Πολιτική εσωτερικής αποθήκευσης Υποστηρίζονται 3 διαφορετικές πολιτικές Line buffered: άδειασμα σε \n Fuy buffered: άδειασμα όταν η αποθήκη γεμίσει Not buffered: χωρίς ενδιάμεση αποθήκευση Η stdio θέτει αυτόματα την πολιτική αποθήκευσης, ανάλογα με τον «τύπο» της ροής δεδομένων Καθιερωμένη είσοδος/έξοδος: ine buffered Καθιερωμένη έξοδος λαθών: not buffered Αρχεία: fuy buffered Προγραμματισμός II 47 ais@inf.uth.gr

Αλλαγή πολιτικής αποθήκευσης Ο προγραμματιστής μπορεί να προσδιορίσει την επιθυμητή πολιτική αποθήκευσης, για κάθε ροή (FILE) int setvbuf(file *stream, char *buffer, int mode, size_t size); Καθορίζει την πολιτική αποθήκευσης, το μέγεθος της αποθήκης ή/και την μνήμη που θα χρησιμοποιηθεί για την αποθήκη Η λειτουργία setvbuf πρέπει να κληθεί μετά την fopen προτού κληθεί μια λειτουργία ανάγνωσης ή γραψίματος Προγραμματισμός II 48 ais@inf.uth.gr

int main(int argc, char *argv[]) { char str[]="heo\nword\n"; int i; } if (argc > 1) { not buffered if (argv[1][0] == 'n') { setvbuf(stdout,null,_ionbf,0); } ese if (argv[1][0] == 'f') { setvbuf(stdout,null,_iofbf,0); } } fuy buffered printf("start printing\n"); for (i=0; i<stren(str); i++) { seep(1); printf("%c",str[i]); } return(0); Προγραμματισμός II 49 ais@inf.uth.gr

Ανάγνωση δυαδικών δεδομένων (binary) Μια ροή μπορεί να περιέχει δεδομένα σε δυαδική μορφή Κλασικό παράδειγμα: binary fie Το πρόγραμμα (ο προγραμματιστής) έχει την ευθύνη για την κατάλληλη / «σωστή» ερμηνεία των δεδομένων Όπως πάντα: τα ίδια δεδομένα μπορεί να ερμηνευθούν με εντελώς διαφορετικούς τρόπους... Προγραμματισμός II 50 ais@inf.uth.gr

FILE *f; int va=0x21776f77; char str[sizeof(int)+1]; f = fopen("test","wb+"); fwrite(&va,sizeof(int),1,f); ffush(f); printf("wrote %x\n",va); rewind(f); fread(str,sizeof(char),sizeof(int),f); str[sizeof(int)]='\0'; printf("read %s\n",str); fcose(f); va 77 6F 77 21???? itte endian str? Προγραμματισμός II 51 ais@inf.uth.gr

FILE *f; int va=0x21776f77; char str[sizeof(int)+1]; f = fopen("test","wb+"); fwrite(&va,sizeof(int),1,f); ffush(f); printf("wrote %x\n",va); rewind(f); fread(str,sizeof(char),sizeof(int),f); str[sizeof(int)]='\0'; printf("read %s\n",str); fcose(f); va 77 6F 77 21???? str? test Προγραμματισμός II 52 ais@inf.uth.gr

FILE *f; int va=0x21776f77; char str[sizeof(int)+1]; f = fopen("test","wb+"); fwrite(&va,sizeof(int),1,f); ffush(f); printf("wrote %x\n",va); rewind(f); fread(str,sizeof(char),sizeof(int),f); str[sizeof(int)]='\0'; printf("read %s\n",str); fcose(f); va 77 6F 77 21???? str? test 77 6F 77 21 Προγραμματισμός II 53 ais@inf.uth.gr

FILE *f; int va=0x21776f77; char str[sizeof(int)+1]; f = fopen("test","wb+"); fwrite(&va,sizeof(int),1,f); ffush(f); printf("wrote %x\n",va); rewind(f); fread(str,sizeof(char),sizeof(int),f); str[sizeof(int)]='\0'; printf("read %s\n",str); fcose(f); va 77 6F 77 21???? str? test 77 6F 77 21 Προγραμματισμός II 54 ais@inf.uth.gr

FILE *f; int va=0x21776f77; char str[sizeof(int)+1]; f = fopen("test","wb+"); fwrite(&va,sizeof(int),1,f); ffush(f); printf("wrote %x\n",va); rewind(f); fread(str,sizeof(char),sizeof(int),f); str[sizeof(int)]='\0'; printf("read %s\n",str); fcose(f); va 77 6F 77 21 77 6F 77 21 str? test 77 6F 77 21 Προγραμματισμός II 55 ais@inf.uth.gr

FILE *f; int va=0x21776f77; char str[sizeof(int)+1]; f = fopen("test","wb+"); fwrite(&va,sizeof(int),1,f); ffush(f); printf("wrote %x\n",va); rewind(f); fread(str,sizeof(char),sizeof(int),f); str[sizeof(int)]='\0'; printf("read %s\n",str); fcose(f); va 77 6F 77 21 77 6F 77 21 str 00 test 77 6F 77 21 Προγραμματισμός II 56 ais@inf.uth.gr

FILE *f; int va=0x21776f77; char str[sizeof(int)+1]; f = fopen("test","wb+"); fwrite(&va,sizeof(int),1,f); ffush(f); printf("wrote %x\n",va); rewind(f); fread(str,sizeof(char),sizeof(int),f); str[sizeof(int)]='\0'; printf("read %s\n",str); fcose(f); va 77 6F 77 21 77 6F 77 21 str 00 w o w! \0 ASCII string test 77 6F 77 21 Προγραμματισμός II 57 ais@inf.uth.gr

FILE *f; int va=0x21776f77; char str[sizeof(int)+1]; f = fopen("test","wb+"); fwrite(&va,sizeof(int),1,f); ffush(f); printf("wrote %x\n",va); rewind(f); fread(str,sizeof(char),sizeof(int),f); str[sizeof(int)]='\0'; printf("read %s\n",str); fcose(f); va 77 6F 77 21 77 6F 77 21 str 00 test 77 6F 77 21 Προγραμματισμός II 58 ais@inf.uth.gr

Τύποι αρχείων Το λειτουργικό δεν διατηρεί πληροφορία τύπου για τα αρχεία που δημιουργούν τα προγράμματα ούτε ενδιαφέρεται να ερμηνεύσει τα περιεχόμενα τους Πληροφορία «τύπου» προστίθεται στο αρχείο, κωδικοποιημένη μέσα στα περιεχόμενα του, από το πρόγραμμα που δημιουργεί το αρχείο Οι καταλήξεις αρχείων (π.χ.,.pdf) είναι απλά μια σύμβαση για πιο εύκολη αναζήτηση από τον χρήστη σε πιο ψηλό επίπεδο από ίδιο το σύστημα αρχείων καθαρά ενδεικτική για τα περιεχόμενα του αρχείου (ένα αρχείο με κατάληξη.pdf δεν σημαίνει ότι *είναι* pdf) Προγραμματισμός II 59 ais@inf.uth.gr