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

Σχετικά έγγραφα
Βιβλιοθήκη stdio. Προγραμματισμός II 1

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

Περιγραφείς Αρχείων & Ανακατεύθυνση EE. Προγραμματισμός II 1

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

Προγραμματισμός συστημάτων UNIX/POSIX. Διαδιεργασιακή επικοινωνία: αγωγοί (IPC inter-process communication: pipes)

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

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

Εισαγωγή στο περιβάλλον προγραμματισμού του εργαστηρίου

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

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

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

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

Streams Input / Output in C++ George Kastrinis

Εισαγωγή στο περιβάλλον προγραμματισμού του εργαστηρίου. Λειτουργικά Συστήματα Εργαστήριο Υπολογιστικών Συστημάτων ΕΜΠ

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

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

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

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

4 C Θεωρία και Πράξη. 6.8 Συναρτήσεις και στατικές μεταβλητές Αναδρομικές συναρτήσεις 119

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

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

Μη ανασταλτική/πολυπλεξία Ε/Ε (non-blocking/multiplexed I/O) Προγραμματισμός II 1

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

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

File Management και I/O στο UNIX

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

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)

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

Διάλεξη 8η: Αλφαριθμητικά (strings)

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

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

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

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

Διαδικασία Ανάπτυξης Λογισμικού

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

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

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

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

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

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

Transcript:

Βιβλιοθήκη 1 lalis@inf.uth.gr

Δεδομένα και ερμηνεία (ξανά) Τα δεδομένα στον Η/Υ έχουν δυαδική μορφή (bytes) Η ερμηνεία των bytes εξαρτάται από το πρόγραμμα που παράγει/καταναλώνει τα δεδομένα Μια δημοφιλής ερμηνεία είναι το ASCII λύνει το πρόβλημα της αναπαράστασης της πληροφορίας με μια μορφή που να κατανοεί εύκολα ένας άνθρωπος ένα ιδιαίτερα παλιό και διαδεδομένο πρότυπο 2 lalis@inf.uth.gr

Ροές δεδομένων Πηγές δεδομένων που χρησιμοποιεί το πρόγραμμα αρχεία, δεδομένα που δίνει ο χρήστης διαδραστικά Προορισμοί δεδομένων που παράγει το πρόγραμμα αρχεία, δεδομένα που βλέπει να δει ο χρήστης διαδραστικά Μπορεί να μοντελοποιηθούν ως ροές δεδομένων Μια ροή αποτελεί την επίσημη/καθιερωμένη είσοδο Μια ροή αποτελεί την επίσημη/καθιερωμένη έξοδο Η καθιερωμένη είσοδος/έξοδος (Ε/Ε) αφορά (συνήθως) την αλληλεπίδραση με τον χρήστη 3 lalis@inf.uth.gr

input streams file descriptors output streams 5 0 4 application program stdin stdout stderr 7 1 2 access structure access structure access structure access structure access structure??? file file??? 4 lalis@inf.uth.gr

Ερμηνεία δεδομένων καθιερωμένης Ε/Ε Η καθιερωμένη Ε/Ε του προγράμματος πρέπει να είναι κατανοητή/διαχειρίσιμη από τον χρήστη Οι συγκεκριμένες ροές ερμηνεύονται ως μια ακολουθία συμβόλων με κωδικοποίηση ASCII Χρειάζονται συμβάσεις για βασικά σύμβολα: ονόματα αριθμητικές τιμές (ακεραίων και πραγματικών αριθμών) Χρειάζονται επιπλέον συμβάσεις «μορφοποίησης»: διαχωρισμός ανάμεσα στα σύμβολα εμφάνιση σε συσκευές Ε/Ε 5 lalis@inf.uth.gr

Η βιβλιοθήκη Ορίστηκε από τον Dennis Ritchie το 1975 Μέρος του προτύπου ANSI C Λειτουργίες εισόδου/εξόδου υψηλού επίπεδου και ανεξάρτητες λειτουργικού συστήματος Υποστήριξη για διάβασμα/γράψιμο τιμών δεδομένων βασικού τύπου από/σε αρχεία/ροές χαρακτήρων Χρησιμοποιεί εσωτερική αποθήκη δεδομένων Χρησιμοποιεί, εσωτερικά, τις αντίστοιχες κλήσεις συστήματος open, read, write, close, 6 lalis@inf.uth.gr

εφαρμογή (application) fopen, fread, fwrite, fclose, βιβλιοθήκη open, read, write, close, αποθήκη κώδικας συστήματος user system 7 lalis@inf.uth.gr

Βασικές λειτουργίες (1) FILE *fopen(const char *name, const char * mode); ανοίγει το αρχείο με όνομα name, δημιουργεί μια αντίστοιχη δομή πρόσβασης FILE, και επιστρέφει ένα δείκτη σε αυτή Η επιθυμητή πρόσβαση ορίζεται μέσω mode r: ανάγνωση υπάρχοντος αρχείου w: δημιουργία νέου αρχείου για γράψιμο (αν ήδη υπάρχει τότε τα προηγούμενα περιεχόμενα διαγράφονται) a: γράψιμο/προσθήκη στο τέλος του αρχείου r+: όπως r αλλά με γράψιμο w+: όπως w αλλά με ανάγνωση a+: όπως a αλλά με ανάγνωση 8 lalis@inf.uth.gr

Βασικές λειτουργίες (2) int fscanf(file *stream, const char *format,...) μορφοποιημένη ανάγνωση στο πνεύμα της scanf int fprintf(file *stream, const char *format,...) μορφοποιημένη εγγραφή στο πνεύμα της printf char *fgets(char *restrict s, int n, FILE *stream); ανάγνωση μιας ολόκληρης γραμμής που τερματίζεται με \n int fflush(file *stream); άδειασμα αποθήκης δεδομένων (για αρχεία δίσκου: αποθήκευση) int fclose(file *stream); κλείσιμο και απελευθέρωση πόρων/αποθήκης 9 lalis@inf.uth.gr

Καθιερωμένη είσοδος/έξοδος Υπάρχουν οι καθιερωμένοι περιγραφείς αρχείων για είσοδο (STDIN_FILENO), έξοδο (STDOUT_FILENO), και έξοδο λαθών (STDERR_FILENO) Η συνδέει αυτούς τους περιγραφείς με αντίστοιχους δείκτες σε δομές FILE *stdin, *stdout, *stderr Προσφέρει ειδικές συναρτήσεις εισόδου/εξόδου ειδικά για την καθιερωμένη είσοδο/έξοδο printf/scanf (στο πνεύμα των fscanf/fprintf) απλά γράφουν/διαβάζουν στην καθιερωμένη έξοδο/είσοδο 10 lalis@inf.uth.gr

Εσωτερική αποθήκη Η διατηρεί τους χαρακτήρες που προορίζονται για γράψιμο ή ανάγνωση σε εσωτερική αποθήκη Ξεχωριστή αποθήκη για κάθε δομή FILE γράψιμο: τα δεδομένα γράφονται προσωρινά στην αποθήκη και μεταφέρονται αυτόματα στο αρχείο/ροή όταν γεμίσει η αποθήκη ή όταν ζητηθεί ρητά άδειασμα της αποθήκης διάβασμα: τα δεδομένα μεταφέρονται στην αποθήκη, και από εκεί διαβάζονται όταν αυτό ζητηθεί από το πρόγραμμα Η εσωτερική αποθήκη δημιουργείται αυτόματα κατά την πρώτη κλήση ανάγνωσης ή εγγραφής Μείωση των κλήσεων συστήματος (write/read) ακόμα και όταν το πρόγραμμα διαβάζει/χειρίζεται τα δεδομένα byte-με-byte (χαρακτήρα-με-χαρακτήρα) 11 lalis@inf.uth.gr

char str1[]="hello"; char str2[]="world"; 00 77 72 6C 64 00 f=fopen("","w+"); fprintf(f,"%s ",str1); fprintf(f,"%s",str2); fflush(f); 12 lalis@inf.uth.gr

char str1[]="hello"; char str2[]="world"; 00 77 72 6C 64 00 f=fopen("","w+"); fprintf(f,"%s ",str1); fprintf(f,"%s",str2); fflush(f); FILE *f; fd=open("", O_RDWR Ο_CREAT,S_IRWXU); f=(file *)malloc( ); f->fd=fd; 13 lalis@inf.uth.gr

char str1[]="hello"; char str2[]="world"; 00 77 72 6C 64 00 f=fopen("","w+"); fprintf(f,"%s ",str1); fprintf(f,"%s",str2); fflush(f); FILE *f;???????????????????????????????? f->buf(char*)=malloc(bufsize); f->blen=0; 14 lalis@inf.uth.gr

char str1[]="hello"; char str2[]="world"; 00 77 72 6C 64 00 f=fopen("","w+"); fprintf(f,"%s ",str1); fprintf(f,"%s",str2); fflush(f); FILE *f;?????????????????????? cpy(&f->buf[f->blen],str1,len(str1)); f->blen+=len(str1); 15 lalis@inf.uth.gr

char str1[]="hello"; char str2[]="world"; 00 77 72 6C 64 00 f=fopen("","w+"); fprintf(f,"%s ",str1); fprintf(f,"%s",str2); fflush(f); FILE *f; 20???????????????????? f->buf[f->blen]=' '; f->blen+=1; 16 lalis@inf.uth.gr

char str1[]="hello"; char str2[]="world"; 00 77 72 6C 64 00 f=fopen("","w+"); fprintf(f,"%s ",str1); fprintf(f,"%s",str2); fflush(f); FILE *f; 20 77 72 6C 64?????????? cpy(&f->buf[f->blen],str2,len(str2)); f->blen+=len(str2); 17 lalis@inf.uth.gr

char str1[]="hello"; char str2[]="world"; 00 77 72 6C 64 00 f=fopen("","w+"); fprintf(f,"%s ",str1); fprintf(f,"%s",str2); fflush(f); FILE *f; 20 77 72 6C 64?????????? cpy(&f->buf[f->blen],str2,len(str2)); f->blen+=len(str2); 18 lalis@inf.uth.gr

char str1[]="hello"; char str2[]="world"; 00 77 72 6C 64 00 f=fopen("","w+"); fprintf(f,"%s ",str1); fprintf(f,"%s",str2); fflush(f); FILE *f; 20 77 72 6C 64?????????? write(fd,f->buf,f->blen); fsync(fd); 20 77 72 6C 64 19 lalis@inf.uth.gr

char str1[]="hello"; char str2[]="world"; 00 77 72 6C 64 00 f=fopen("","w+"); fprintf(f,"%s ",str1); fprintf(f,"%s",str2); fflush(f); FILE *f; f->blen=0; 20 77 72 6C 64?????????? 20 77 72 6C 64 20 lalis@inf.uth.gr

char str1[]="hello"; char str2[]="world"; 00 77 72 6C 64 00 f=fopen("","w+"); fprintf(f,"%s ",str1); fprintf(f,"%s",str2); fflush(f); FILE *f; close(f->fd); free(f->buf); free(f); 20 77 72 6C 64?????????? 20 77 72 6C 64 21 lalis@inf.uth.gr

char str1[6]; char str2[6];???????????????????????? f=fopen("","r"); fscanf(f,"%s",str1); fscanf(f,"%s",str2); 20 77 72 6C 64 22 lalis@inf.uth.gr

char str1[6]; char str2[6];???????????????????????? f=fopen("","r"); fscanf(f,"%s",str1); fscanf(f,"%s",str2); FILE *f; fd=open("", O_RDONLY,0); f=(file *)malloc( ); f->fd=fd; 20 77 72 6C 64 23 lalis@inf.uth.gr

char str1[6]; char str2[6];???????????????????????? f=fopen("","r"); fscanf(f,"%s",str1); fscanf(f,"%s",str2); FILE *f;???????????????????????????????? f->buf(char*)=malloc(bufsize); f->blen=0; f->bpos=0; 20 77 72 6C 64 24 lalis@inf.uth.gr

char str1[6]; char str2[6];???????????????????????? f=fopen("","r"); fscanf(f,"%s",str1); fscanf(f,"%s",str2); FILE *f; 20 77 72 6C 64?????????? f->blen=read(f->fd,f->buf,bufsize); 20 77 72 6C 64 25 lalis@inf.uth.gr

char str1[6]; char str2[6];???????????????????????? f=fopen("","r"); fscanf(f,"%s",str1); fscanf(f,"%s",str2); FILE *f; 20 77 72 6C 64?????????? f->blen=read(f->fd,f->buf,bufsize); 20 77 72 6C 64 26 lalis@inf.uth.gr

char str1[6]; char str2[6]; h e l l o?????????????? f=fopen("","r"); fscanf(f,"%s",str1); fscanf(f,"%s",str2); FILE *f; 20 77 72 6C 64?????????? k=fnddelimiter(f->buf,f->bpos,f->blen); cpy(str1,f->buf[f->bpos],k); f->pos+=k; 20 77 72 6C 64 27 lalis@inf.uth.gr

char str1[6]; char str2[6]; h e l l o \0???????????? f=fopen("","r"); fscanf(f,"%s",str1); fscanf(f,"%s",str2); FILE *f; 20 77 72 6C 64?????????? str1[k]='\0'; f->bpos=skipspace(f->buf,f->bpos,f->blen); 20 77 72 6C 64 28 lalis@inf.uth.gr

char str1[6]; char str2[6]; h w e l l o \0 o r l d?? f=fopen("","r"); fscanf(f,"%s",str1); fscanf(f,"%s",str2); FILE *f; 20 77 72 6C 64?????????? k=fnddelimiter(f->buf,f->bpos,f->blen); cpy(str2,f->buf[f->bpos],k); f->pos+=k; 20 77 72 6C 64 29 lalis@inf.uth.gr

char str1[6]; char str2[6]; h w e l l o \0 o r l d \0 f=fopen("","r"); fscanf(f,"%s",str1); fscanf(f,"%s",str2); FILE *f; 20 77 72 6C 64?????????? str2[k]='\0'; f->bpos=skipspace(f->buf,f->bpos,f->blen); 20 77 72 6C 64 30 lalis@inf.uth.gr

char str1[6]; char str2[6];???????????????????????? f=fopen("","r"); fscanf(f,"%s",str1); fscanf(f,"%s",str2); FILE *f; close(f->fd); free(f->buf); free(f); 20 77 72 6C 64?????????? 20 77 72 6C 64 31 lalis@inf.uth.gr

Χειρισμός κενών κατά την ανάγνωση Η fscanf θεωρεί πως οι τιμές της ροής/αρχείου διαχωρίζονται από ένα ή περισσότερα «κενά» χαρακτήρες που κατά σύμβαση λειτουργούν ως διαχωριστικά Τα κενά απλά αγνοούνται, δεν συμπεριλαμβάνονται στις τιμές που επιστρέφονται και αποθηκεύονται στις μεταβλητές που δίνει ο χρήστης Σε strings προστίθεται αυτόματα το τερματικό (\0) χωρίς να υπάρχει κάποιο τέτοιο byte στην ροή/αρχείο δεδομένων Για διάβασμα μιας ολόκληρης «γραμμής», χωρίς ερμηνεία των δεδομένων, μέχρι να βρεθεί το byte \n, μπορεί να χρησιμοποιηθεί η fgets χρησιμοποιείται σε συνδυασμό με την sscanf 32 lalis@inf.uth.gr

Πολιτική εσωτερικής αποθήκευσης Υποστηρίζονται 3 διαφορετικές πολιτικές Line buffered: άδειασμα σε \n Fully buffered: άδειασμα όταν η αποθήκη γεμίσει Not buffered: χωρίς ενδιάμεση αποθήκευση Η βιβλιοθήκη θέτει αυτόματα την πολιτική αποθήκευσης, ανάλογα με την περίπτωση Καθιερωμένη είσοδος/έξοδος: line buffered Καθιερωμένη έξοδος λαθών: not buffered Αρχεία δίσκου: fully buffered 33 lalis@inf.uth.gr

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

int main(int argc, char *argv[]) { char str[]="hello\nworld\n"; int i; } if (argc > 1) { not buffered if (argv[1][0] == 'n') { setvbuf(stdout,null,_ionbf,0); } else if (argv[1][0] == 'f') { setvbuf(stdout,null,_iofbf,0); } } fully buffered printf("start printing\n"); for (i=0; i<strlen(str); i++) { sleep(1); printf("%c",str[i]); } return(0); 35 lalis@inf.uth.gr

Ανακατεύθυνση και Η χρήση της βιβλιοθήκης με ανακατεύθυνση της ΕΕ σε αρχεία δεν είναι εντελώς διαφανής λόγω της πολιτικής ενδιάμεσης αποθήκευσης Αν η χρησιμοποιηθεί σε πρώτη φάση με την καθιερωμένη είσοδο/έξοδο να δείχνει στην συσκευή τερματικού, η πολιτική είναι line buffered ακόμα και αν ακολουθήσει ανακατεύθυνση σε αρχείο Αν η χρησιμοποιηθεί σε πρώτη φάση με την καθιερωμένη είδοσο/έξοδο να δείχνει ήδη σε αρχεία, η πολιτική είναι fully buffered για να γραφτούν δεδομένα στο αρχείο πρέπει να ζητηθεί ρητά το άδειασμα της ενδιάμεσης αποθήκης με fflush 36 lalis@inf.uth.gr

int fd; fully buffered fd=open("",o_wronly O_CREAT O_TRUNC,S_IRWXU); dup2(fd,stdout_fileno); /* redirect stdout to fd */ printf("hello world\n"); int fd; line buffered printf("something to set policy to line-buffered\n"); fd=open("",o_wronly O_CREAT O_TRUNC,S_IRWXU); dup2(fd,stdout_fileno); /* redirect stdout to fd */ printf("hello world\n"); 37 lalis@inf.uth.gr