Πξνγξακκαηηζκόο Ι Δίζνδνο/Έμνδνο Κσλζηαληίλνο Σζεξπέο (βαζηζκέλν ζηηο δηαθάλεηεο ηνπ θ. Γεκήηξε Μηραήι) Σκήκα Πιεξνθνξηθήο θαη Σειεκαηηθήο Χαξνθόπεην Παλεπηζηήκην
Δίζνδνο/Έμνδνο Μέρξη ηώξα όπνηε ζέιακε λα δηαβάζνπκε ρξεζηκνπνηνύζακε πάληα ην πιεθηξνιόγην θαη γξάθακε πάληα ζηελ νζόλε. Η είζνδνο θαη ε έμνδνο δελ είλαη κέξνο ηεο γιώζζαο C αιιά κέξνο ηεο βηβιηνζήθεο ηεο. Δπεηδή ηα πξνγξάκκαηα ζρεηίδνληαη κε ην πεξηβάιινλ ηνπο κε πνιύ πην πνιύπινθνπο ηξόπνπο από όηη έρνπκε δεη σο ηώξα, ζα κειεηήζνπκε ιίγν ηελ βηβιηνζήθε εηζόδνπ/εμόδνπ. Χαξνθόπεην Παλεπηζηήκην 2/41
Βηβιηνζήθε Σν αξρείν πνπ πεξηέρεη ηνπο νξηζκνύο ησλ ηύπσλ θαη ησλ ζπλαξηήζεσλ πνπ είλαη απαξαίηεηεο γηα ηελ ζπλαλαζηξνθή κε ην ζύζηεκα εηζόδνπ/εμόδνπ ηεο C είλαη ην stdio.h. Σν όλνκα ηνπ αξρείνπ ζεκαίλεη Standard Input Output. Μέζσ ηνπ αξρείνπ stdio.h έλα πξόγξακκα κπνξεί λα έρεη επαθή κε ηελ ηππηθή είζνδν (ζπλήζσο πιεθηξνιόγην) θαη ηελ ηππηθή έμνδν (ζπλήζσο νζόλε). Οη ηππηθέο είζνδνη/έμνδνη παξέρνληαη ζηελ C κέζσ ηνπ εθάζηνηε ιεηηνπξγηθνύ ζπζηήκαηνο. Χαξνθόπεην Παλεπηζηήκην 3/41
Ιεξαξρία Γεδνκέλσλ 1 2 3 4 5 bit - ε κηθξόηεξε πνζόηεηα 0 ή 1 byte - 8 bits απνζήθεπζε ελόο ραξαθηήξα (αξηζκνί, γξάκκαηα, ζύκβνια,...) word - 4 bytes (ή 8 bytes) απνζήθεπζε αξηζκνύ (int, long, float,...) Αξρείν - ζπιινγή πνιιώλ bytes Βάζε δεδνκέλσλ - ζπιινγή αξρείσλ (θαη όρη κόλν) Χαξνθόπεην Παλεπηζηήκην 4/41
Αξρεία Θα ζέιακε κέζα από ηελ C λα έρνπκε πξόζβαζε ζε αξρεία, ηα νπνία δελ είλαη ήδε ζπλδεδεκέλα κε ην πξόγξακκα καο (όπσο ε ηππηθή είζνδνο θαη έμνδνο). Γηα απηό ηνλ ιόγν ε βηβιηνζήθε ηεο C καο παξέρεη ηελ ζπλάξηεζε fopen() ε νπνία αλαιακβάλεη ηελ επηθνηλσλία κε ην ιεηηνπξγηθό ζύζηεκα. Σν ιεηηνπξγηθό ζύζηεκα είλαη ππεύζπλν γηα ηελ νξγάλσζε ησλ αξρείσλ. Χαξνθόπεην Παλεπηζηήκην 5/41
Αξρεία Η ζπλάξηεζε fopen() είλαη ηεο κνξθήο FILE * fopen ( char * name, char * mode ) ; Πέξλεη δύν παξακέηξνπο 1 κηα ζπκβνινζεηξά κε ην όλνκα ηνπ αξρείνπ 2 κηα ζπκβνινζεηξά κε δηάθνξεο επηινγέο γηα ηνλ ηξόπν πξόζβαζεο ζην αξρείν θαη επηζηξέθεη έλα δείθηε ελόο ηύπνπ FILE. Χαξνθόπεην Παλεπηζηήκην 6/41
FILE Ο ηύπνο FILE νξίδεηαη κέζα ζηελ βηβιηνζήθε ηεο C κέζσ ελόο typedef. Οη ιεπηνκέξεηεο πινπνίεζεο δελ καο απαζρνινύλ. Αξθεί λα πνύκε πσο έλαο δείθηεο ηύπνπ FILE δείρλεη θάπνπ όπνπ ην ιεηηνπξγηθό ζύζηεκα θξαηάεη πιεξνθνξίεο γηα ην αξρείν πνπ καο ελδηαθέξεη. Χαξνθόπεην Παλεπηζηήκην 7/41
Άλνηγκα Αξρείσλ θαη Ρνέο Μία θιήζε ζηελ fopen() έρεη ηελ εμήο κνξθή FILE * fp ; fp = fopen ( name, mode ) ; όπνπ name είλαη ην όλνκα ηνπ αξρείνπ πνπ ζέινπκε λα επεμεξγαζηνύκε θαη mode είλαη κηα ζπκβνινζεηξά πνπ δειώλεη ηελ ρξήζε ηνπ αξρείνπ. Με ηελ ζπλάξηεζε fopen() ιέκε πσο ανοίγοσμε έλα αξρείν. Γηα λα ρξεζηκνπνηήζνπκε έλα αξρείν ζηελ C πξέπεη πξώηα λα ην αλνίμνπκε, δειαδή λα δεκηνπξγήζνπκε κηα ζύλδεζε κεηαμύ ηνπ πξαγκαηηθνύ αξρείνπ θαη ηεο γιώζζαο C. Σελ ζύλδεζε απηή, πνπ απνθαινύκε ροή ηελ θξνληίδεη ην ιεηηνπξγηθό. Χαξνθόπεην Παλεπηζηήκην 8/41
Σππηθέο Ρνέο Όηαλ μεθηλήζεη ε εθηέιεζε ελόο πξνγξάκκαηνο αλνίγνληαη απηόκαηα 3 ξνέο: 1 2 3 ε ηππηθή είζνδνο (ζπλήζσο από ην πιεθηξνιόγην) κε δείθηε stdin ε ηππηθή έμνδνο (ζπλήζσο ε νζόλε) κε δείθηε stdout ην ηππηθό ζθάικα (ζπλήζσο ε νζόλε) κε δείθηε stderr Πξνζέμηε πσο ζηα πεξηζζόηεξα ιεηηνπξγηθά ζπζηήκαηα κπνξνύκε λα αλαθαηεπζύλνπκε ηηο ηππηθέο ξνέο. Χαξνθόπεην Παλεπηζηήκην 9/41
Αξρεία θαη getchar() Η ηππηθή βηβιηνζήθε ηεο C παξέρεη πνιιέο ζπλαξηήζεηο γηα αλάγλσζε δεδνκέλσλ από αξρεία θαη εγγξαθή δεδνκέλσλ ζε αξρεία. Γηα παξάδεηγκα ε ζπλάξηεζε int fgetc ( FILE * stream ) ; δηαβάδεη έλα ραξαθηήξα από έλα αξρείν, όπσο ε getchar() δηαβάδεη από ηελ ηππηθή είζνδν. Με άιια ιόγηα ε θιήζε fgetc( stdin ) είλαη νπζηαζηηθά ηζνδύλακε κε ηελ θιήζε ηεο getchar(). Χαξνθόπεην Παλεπηζηήκην 10/41
Αξρεία θαη putchar() Γηα λα γξάςνπκε έλα ραξαθηήξα ζε έλα αξρείν ε ηππηθή βηβιηνζήθε ηεο C καο παξέρεη ηελ ζπλάξηεζε int fputc ( int c, FILE * stream ) ; ε νπνία γξάθεη ηνλ ραξαθηήξα c ζην αξρείν πνπ ζπλδέεηαη κέζσ ηεο ξνήο stream. Δίλαη δειαδή ε αληίζηνηρε ηεο ζπλάξηεζεο putchar( int c ) ε νπνία καο επηηξέπεη λα γξάθνπκε ζηελ ηππηθή έμνδν. Με άιια ιόγηα ε θιήζε fputc( 'a', stdout ) είλαη νπζηαζηηθά ηζνδύλακε κε ηελ θιήζε ηεο putchar( 'a'). Χαξνθόπεην Παλεπηζηήκην 11/41
εηξηαθή ή Σπραία Πξνζπέιαζε ηελ C κπνξνύκε λα πξνζπειάζνπκε έλα αξρείν κε 2 ηξόπνπο 1 2 ζεηξηαθή πξνζπέιαζε δηαβάδνπκε ή γξάθνπκε ζεηξηαθά από ηελ αξρή ηνπ αξρείνπ ηα αξρεία απηά είλαη αρτεία κειμένοσ ηπραία πξνζπέιαζε δηαβάδνπκε ή γξάθνπκε ζε ηπραία ζεκεία ηνπ αξρείνπ ηα αξρεία απηά είλαη δσαδικά αρτεία Χαξνθόπεην Παλεπηζηήκην 12/41
Γεκηνπξγία Αξρείνπ εηξηαθήο Πξόζβαζεο Η C δελ επηβάιιεη θάπνηα δνκή ζε έλα αξρείν. Δίλαη θαζήθνλ ηνπ πξνγξακκαηηζηή λα δνκήζεη έλα αξρείν ώζηε λα ηθαλνπνηήζεη ηηο απαηηήζεηο κηαο εθαξκνγήο. Γηα λα δεκηνπξγήζνπκε έλα αξρείν γηα γξάςηκν θαινύκε ηελ ζπλάξηεζε fopen() κε ηνλ παξαθάησ ηξόπν FILE * fd = fopen ( "filename", "w" ); Σν "w" ζεκαίλεη άλνηγκα ηνπ αξρείνπ γηα γξάςηκν. ε πεξίπησζε πνπ ην αξρείν ππάξρεη ήδε, ηα ήδε ππάξρνληα δεδνκέλα ζβήλνληαη. Χαξνθόπεην Παλεπηζηήκην 13/41
Γεκηνπξγία Αξρείνπ εηξηαθήο Πξόζβαζεο Παξάδεηγκα 1 #include <stdio.h> 2 3 main ( ) 4 { 5 int AM ; 6 char name [30] ; 7 8 FILE * fd ; 9 if ( ( fd=fopen ( "students.dat", "w" ) ) == NULL ) 10 printf ( "File could not be opened\n" ) ; 11 else { 12 printf ( "Enter AM and name,\n" ) ; 13 printf ( "Enter EOF to end input.\n" ) ; 14 printf ( "? " ) ; 15 scanf ( "%d%s", &AM, name ); 16 while (! feof ( stdin ) ) ) { 17 fprintf ( fd, "%d %s\n", AM, name ) ; 18 printf ( "? " ) ; 19 scanf ( "%d%s", &AM, name ); 20 } 21 fclose ( fd ); 22 } 23 } Χαξνθόπεην Παλεπηζηήκην 14/41
Σηκή Δπηζηξνθήο ηεο fopen() Όηαλ αλνίγνπκε έλα αξρείν πξέπεη πάληα λα θάλνπκε έιεγρν ηεο ηηκήο πνπ καο επηζηξάθεθε. Δαλ γηα θάπνην ιόγν ην αξρείν δελ αλνίρηεθε (π.ρ δελ επηηξέπεηαη ε πξόζβαζε ζηνλ θάθειν πνπ ζέινπκε, δελ ππάξρεη ρώξνο ζηνλ δίζθν, θ.η.ι.) ε ζπλάξηεζε fopen() επηζηξέθεη NULL. FILE * fd ; if ( ( fd=fopen ( "students.dat", "w" ) ) == NULL ) printf ( "File could not be opened\n" ) ; Χαξνθόπεην Παλεπηζηήκην 15/41
Έιεγρνο Σέινο Αξρείνπ End-Of-File (EOF) Πνιιέο θνξέο ζέινπκε λα δνύκε εαλ έλα αξρείν έθηαζε ζην ηέινο ηνπ. Γηα ηνλ ζθνπό απηό ε C καο παξέρεη ηελ ζπλάξηεζε int feof ( FILE * stream ) ; ε νπνία παίξλεη έλα αλνηθηό αξρείν σο παξάκεηξν θαη επηζηξέθεη αιήζεηα εαλ ην αξρείν έρεη θηάζεη ζην ηέινο ηνπ (EOF), δηαθνξεηηθά επηζηξέθεη ςέκκαηα. Με ηελ θιήζε feof(stdin) κπνξνύκε λα ειέγμνπκε γηα EOF ζηελ ηππηθή είζνδν (CTRL-z ζηα windows, CTRL-d ζε unix, θ.η.ι.). Χαξνθόπεην Παλεπηζηήκην 16/41
Γξάςηκν ζε Αξρείν fprintf() Η ζπλάξηεζε int fprintf ( FILE * stream, const char * format,... ) ; ιεηηνπξγεί αθξηβώο όπσο ε ζπλάξηεζε printf() αιιά ζηέιλεη ηελ έμνδν ζηελ ξνή stream. Οπζηαζηηθά όηαλ γξάθνπκε printf ( "hello world\n" ); ζηελ πξαγκαηηθόηεηα γξάθνπκε fprintf ( stdout, "hello world\n" ) ; Χαξνθόπεην Παλεπηζηήκην 17/41
Κιείζηκν Αξρείνπ fclose() Όηαλ ηειεηώζεη ε ρξήζε ελόο αξρείνπ, ν πξνγξακκαηηζηήο πξέπεη λα θιήζεη απηό ην αξρείν. Κιείλνληαο ην αξρείν νπζηαζηηθά ιέκε ζην ζύζηεκα πσο δελ ζέινπκε λα ρξεζηκνπνηήζνπκε άιιν ην αξρείν απηό. Η ξνή πξνο ην αξρείν θαηαζηξέθεηαη. int fclose ( FILE * fp ) ; Η fclose() θξνληίδεη ώζηε λα γξαθνύλ όηη πιεξνθνξίεο δελ έρνπλ γξαθεί (βξίζθνληαη ζε θάπνηνλ buffer). Χαξνθόπεην Παλεπηζηήκην 18/41
Κιείζηκν Αξρείνπ fclose() ε πεξίπησζε πνπ ν πξνγξακκαηηζηήο μεράζεη λα θιείζεη έλα αξρείν, ηα ζύγρξνλα ιεηηνπξγηθά ζπζηήκαηα ζα θιείζνπλ ην αξρείν απηόκαηα κεηά ην ηέινο ηνπ πξνγξάκκαηνο. Δίλαη όκσο ζσζηή πξνγξακκαηηζηηθή ηαθηηθή λα θξνληίδνπλ ηα πξνγξάκκαηα καο λα ειεπζεξώλνπλ νπνηνπζδήπνηε πόξνπο ηνπ ζπζηήκαηνο ρξεζηκνπνηνύλ. Χαξνθόπεην Παλεπηζηήκην 19/41
Γεκηνπξγία Αξρείνπ εηξηαθήο Πξόζβαζεο Παξάδεηγκα 24 #include < s t d i o. h> 25 26 main ( ) 27 { 28 int AM ; 29 char name [ 3 0 ] ; 30 31 FILE * fd ; 32 if ( ( fd=fopen ( "students.dat", "w" ) ) == NULL ) 33 printf ( "File could not be opened\n" ) ; 34 else { 35 printf ( "Enter AM and name,\n" ) ; 36 printf ( "Enter EOF to end input.\n" ) ; 37 printf ( "? " ) ; 38 scanf ( "%d%s", &AM, name ); 39 while (! feof ( stdin ) ) { 40 fprintf ( fd, "%d %s\n", AM, name ) ; 41 printf ( "? " ) ; 42 scanf ( "%d%s", &AM, name ); 43 } 44 fclose ( fd ); 45 } 46 } Χαξνθόπεην Παλεπηζηήκην 20/41
Γεκηνπξγία Αξρείνπ εηξηαθήο Πξόζβαζεο Παξάδεηγκα Δθηειώληαο ην πξνεγνύκελν πξόγξακκα Enter AM and name, Enter EOF to end input.? 11 Kwstas? 12 Eleni? 13 Nikos? δεκηνπξγείηαη ην αξρείν κε όλνκα students.dat ζηνλ ίδην θάθειν κε ην πξόγξακκα καο. Σν αξρείν απηό πεξηέρεη: 11 Kwstas 12 Eleni 13 Nikos Χαξνθόπεην Παλεπηζηήκην 21/41
Σξόπνη Αλνίγκαηνο Αξρείσλ Απιέο Μνξθέο Απιέο κνξθέο αλνίγκαηνο "w" γηα δεκηνπξγία αξρείνπ, ή γηα δηαγξαθή ησλ δεδνκέλσλ πξηλ από ηελ εγγξαθή. "r" γηα δηάβαζκα ππαξθηνύ αξρείνπ, άλνηγκα γηα αλάγλσζε. "a" γηα πξνζζήθε εγγξαθώλ ζην ηέινο ελόο ππαξθηνύ αξρείνπ, άλνηγκα γηα πξνζάξηεζε. Χαξνθόπεην Παλεπηζηήκην 22/41
Σξόπνη Αλνίγκαηνο Αξρείσλ ύλζεηεο Μνξθέο Δλεκέξσζεο ύλζεηεο κνξθέο ελεκέξσζεο (ηαπηόρξνλα αλάγλσζε θαη εγγξαθή) "r+" αλνίγεη αξρείν γηα αλάγλσζε θαη εγγξαθή. "w+" δεκηνπξγεί έλα αξρείν γηα αλάγλσζε θαη εγγξαθή. Δαλ ην αξρείν ππάξρεη ήδε ην αξρείν αλνίγεηαη θαη ράλνληαη ηα ηξέρνληα πεξηερόκελα ηνπ. "a+" άλνηγκα γηα αλάγλσζε θαη εγγξαθή, ε εγγξαθή γίλεηαη ζην ηέινο ηνπ αξρείνπ. Δαλ ην αξρείν δελ ππάξρεη, δεκηνπξγείηαη. Χαξνθόπεην Παλεπηζηήκην 22/41
Αλάγλσζε Γεδνκέλσλ από Αξρείν εηξηαθήο Πξνζπέιαζεο Γηάβαζκα δεδνκέλσλ από αξρείν ζεηξηαθήο πξνζπέιαζεο κπνξεί λα γίλεη κε ηελ ζπλάξηεζε int fscanf ( FILE * stream, const char * format,... ) ; Πξέπεη απιά λα αλνίμνπκε ην αξρείν ζηελ θαηάιιειε θαηάζηαζε, π.ρ "r". Χαξνθόπεην Παλεπηζηήκην 23/41
Αλάγλσζε Γεδνκέλσλ Αξρείν εηξηαθήο Πξνζπέιαζεο 1 #include < s t d i o. h> 2 3 main ( ) 4 { 5 int AM ; 6 char name [ 3 0 ] ; 7 8 FILE * fd ; 9 if ( ( fd=fopen ( "students.dat", "r" ) ) == NULL ) 10 printf ( "File could not be opened\n" ) ; 11 else { 12 printf ( "%-5s%-13s\n", "AM", "Name" ) ; 13 fscanf ( fd, "%d%s", &AM, name ); 14 15 while (! feof ( fd ) ) { 16 printf ( "%-5d%-13s\n", AM, name ) ; 17 fscanf ( fd, "%d%s", &AM, name ); 18 } 19 fclose ( fd ); 20 } 21 } Χαξνθόπεην Παλεπηζηήκην 24/41
Αλάγλσζε Γεδνκέλσλ Αξρείν εηξηαθήο Πξνζπέιαζεο Δθηειώληαο ην πξόγξακκα ζηνλ ίδην θάθειν κε ην αξρείν "students.dat" ην πξνεγνύκελν πξόγξακκα εθηππώλεη: AM Name 11 Kwstas 12 Eleni 13 Nikos Χαξνθόπεην Παλεπηζηήκην 25/41
Γείθηεο Θέζεο Αξρείνπ Ο δείκηης θέζης αρτείοσ δείρλεη ζηελ επόκελε ζέζε αξρείνπ πνπ ζα ρξεζηκνπνηεζεί γηα αλάγλσζε ή εγγξαθή. Γηα παξάδεηγκα όηαλ αλνίγνπκε έλα αξρείν ν δείθηεο ζέζεο αξρείνπ δείρλεη ζηελ ζέζε 0. Ο δείθηεο ζέζε αξρείνπ είλαη έλαο αξηζκόο πνπ δειώλεη ηνλ αξηζκό ηνπ επόκελνπ byte ζην αξρείν γηα αλάγλσζε ή εγγξαθή. Χαξνθόπεην Παλεπηζηήκην 26/41
Πνιιαπιή εηξηαθή Πξνζπέιαζε Πνιιέο θνξέο ζέινπκε λα δηαβάζνπκε ηα δεδνκέλα ελόο αξρείνπ πεξηζζόηεξεο απν κηα θνξέο. H C καο επηηξέπεη λα επαλαηνπνζεηήζνπκε ηνλ δείκηη θέζης αρτείοσ ελόο πξνγξάκκαηνο ζηελ αξρή ηνπ αξρείνπ. Η ζπλάξηεζε ιέγεηαη: void rewind ( FILE * stream ) ; Χαξνθόπεην Παλεπηζηήκην 27/41
Πξνβιήκαηα εηξηαθήο Πξνζπέιαζεο Οη εγγξαθέο πνπ ρξεζηκνπνηήζακε σο ηώξα δελ έρνπλ ζηαζεξό κέγεζνο. Γηα απηόλ ηνλ ιόγν δελ κπνξνύκε εύθνια λα ελεκεξώζνπκε εγγξαθέο ζηελ ίδηα ζέζε ελόο αξρείνπ. Γηα παξάδεηγκα δελ κπνξνύκε λα αλαλεώζνπκε ηελ εγγξαθή 11 Kwstas κε 11 Aleksandros αθνύ ε θαηλνύξηα εγγξαθή είλαη κεγαιύηεξε ζε κέγεζνο θαη ζα επηθαιύςεη ηελ επόκελε εγγξαθή. πλήζσο επαλαγξάθνπκε όιν ην ζεηξηαθό αξρείν εαλ ζέινπκε λα θάλνπκε ελεκεξώζεηο. Χαξνθόπεην Παλεπηζηήκην 28/41
Αξρεία Σπραίαο Πξνζπέιαζεο Η C καο παξέρεη ηελ δπλαηόηεηα λα κεηαθηλνύκε ηνλ δείθηε ζέζεο αξρείνπ. Απηό καο επηηξέπεη λα πξνζπειάζνπκε άκεζα θαη ρσξίο θαζπζηέξεζε ζπγθεθξηκέλα ζεκεία ελόο αξρείνπ. Γηα επθνιία κπνξνύκε λα νξγαλώζνπκε ην αξρείν καο κε ζηαζεξνύ κεγέζνπο εγγξαθέο θαη έηζη λα έρνπκε άκεζε πξόζβαζε ζε θάζε εγγξαθή. Χαξνθόπεην Παλεπηζηήκην 29/41
Αξρεία Σπραίαο Πξνζπέιαζεο fwrite() Η ζπλάξηεζε fwrite() κεηαθέξεη έλα ζπγθεθξηκέλν αξηζκό bytes αξρίδνληαο ζε κηα θαζνξηζκέλε ζέζε ζηελ κλήκε, ζε έλα αξρείν. size_t fwrite ( const void * ptr, size_t size, size_t nmemb, FILE * stream ) ; Πην ζπγθεθξηκέλα γξάθεη nmemb ζηνηρεία, ην θαζέλα κε κήθνο size bytes, ζηε ξνή stream. Σα ζηνηρεία βξίζθνληαη ζηελ ζέζε ptr ηεο κλήκεο. Η ζπλάξηεζε επηζηξέθεη ηνλ αξηζκό ησλ ζηνηρείσλ πνπ γξάθηεθαλ. Δαλ γίλεη θάπνην ιάζνο ηόηε ν αξηζκόο είλαη κηθξόηεξνο ή κεδέλ. Χαξνθόπεην Παλεπηζηήκην 30/41
Αξρεία Σπραίαο Πξνζπέιαζεο fread() Η ζπλάξηεζε fread() κεηαθέξεη έλα ζπγθεθξηκέλν αξηζκό bytes από έλα αξρείν ζε κηα θαζνξηζκέλε ζέζε ζηελ κλήκε. size_t fread ( void * ptr, size_t size, size_t nmemb, FILE * stream ); Πην ζπγθεθξηκέλα δηαβάδεη nmemb ζηνηρεία, ην θαζέλα κε κήθνο size bytes, από ηε ξνή stream. Σα ζηνηρεία απνζεθεύνληαη ζηελ ζέζε ptr ηεο κλήκεο. Η ζπλάξηεζε επηζηξέθεη ηνλ αξηζκό ησλ ζηνηρείσλ πνπ δηαβάζηεθαλ. Δαλ γίλεη θάπνην ιάζνο ή ζπκβεί EOF ηόηε ν αξηζκόο είλαη κηθξόηεξνο ή κεδέλ. Χαξνθόπεην Παλεπηζηήκην 31/41
Γηαθνξέο fprintf() θαη fwrite() Η ζπλάξηεζε fwrite() ρξεζηκνπνηεί ζηαζεξό αξηζκό από bytes ελώ ε fprintf() όρη. int n = 99999; FILE * fd = fopen ( "test.dat", "w" ); fprintf ( fd, "%d", n ); Η fprintf() ζα γξάςεη 5 bytes ζηελ έμνδν. Με άιια ιόγηα ην κέγεζνο ηεο εμόδνπ εμαξηάηαη από ηα ςεθία ηνπ αξηζκνύ. Χαξνθόπεην Παλεπηζηήκην 32/41
Γηαθνξέο fprintf() θαη fwrite() Η ζπλάξηεζε fwrite() ρξεζηκνπνηεί ζηαζεξό αξηζκό από bytes ελώ ε fprintf() όρη. int n = 99999; FILE * fd = fopen ( "test.dat", "w" ); fwrite ( &n, sizeof ( int ), 1, fd ); Η fwrite() γξάθεη νπνηνδήπνηε αθέξαην ρξεζηκνπνηώληαο 4 bytes. Χαξνθόπεην Παλεπηζηήκην 33/41
Αξρεία Σπραίαο Πξνζπέιαζεο πλήζσο γξάθνπκε ζπγθεθξηκέλνπ κεγέζνπο εγγξαθέο ζηα αξρεία ηπραίαο πξνζπέιαζεο, ώζηε λα κπνξνύκε άκεζα λα πξνζπειάζνπκε ηελ i εγγξαθή. 0 100 200 300 Χαξνθόπεην Παλεπηζηήκην 34/41
Γεκηνπξγία Αξρείνπ Σπραίαο Πξνζπέιαζεο εηξηαθή Αξρηθνπνίεζε 1 #include < s t d i o. h> 2 3 typedef struct { 4 int AM ; 5 char name [ 5 0 ] ; 6 } student ; 7 8 main ( ) { 9 int i ; 10 student blankstudent = { 0, "" }; 11 FILE * fd ; 12 13 if ( ( fd=fopen ( "random.dat", "w" ) ) = = NULL ) 14 fprintf ( stderr, "File could not be opened.\n" ) ; 15 else { 16 for ( i = 0; i < 100; i++ ) 17 fwrite ( &blankstudent, sizeof ( student ), 1, fd ); 18 fclose ( fd ) ; 19 } 20 } Χαξνθόπεην Παλεπηζηήκην 35/41
Μεηαθίλεζε Γείθηε Θέζεο Αξρείνπ fseek() Η ζπλάξηεζε int fseek ( FILE * stream, long offset, int whence ) ; ζέηεη ηνλ δείθηε ζέζεο αξρείνπ. Η λέα ζέζε (ζε bytes) πξνθύπηεη πξνζζέηνληαο offset ζηελ ζέζε whence. Η ζέζε whence είλαη είηε κηα ζέζε ζε bytes είηε κηα από ηηο ζηαζεξέο SEEK_SET, SEEK_CUR θαη SEEK_END. ηελ δεύηεξε πεξίπησζε ην offset είλαη ζρεηηθό κε ηελ αξρή ηνπ αξρείνπ, ηελ ησξηλή ζέζε θαη ην ηέινο ηνπ αξρείνπ αληίζηνηρα. Μηα επηηπρήο θιήζε ηεο fseek() ζβήλεη ηελ έλδεημε EOF. Χαξνθόπεην Παλεπηζηήκην 36/41
Δύξεζε Γείθηε Θέζεο Αξρείνπ ftell() Η ζπλάξηεζε long ftell ( FILE * stream ) ; επηζηξέθεη ην δείθηε ζέζεο αξρείνπ (ζε bytes). Χαξνθόπεην Παλεπηζηήκην 37/41
Δγγξαθή ζε Αξρείν Σπραίαο Πξνζπέιαζεο 1 #include < s t d i o. h> 2 3 typedef struct { 4 int id ; 5 char name [ 5 0 ] ; 6 } student ; 7 8 main ( ) 9 { 10 FILE * fd ; 11 student s ; 12 13 if ( ( fd=fopen ( "random.dat", "r+" ) ) == NULL ) 14 printf ( "File could not be opened\n" ) ; 15 else { Χαξνθόπεην Παλεπηζηήκην 38/41
Δγγξαθή ζε Αξρείν Σπραίαο Πξνζπέιαζεο πλέρεηα 16 printf ( "Enter id and name,\n" ) ; 17 printf ( "Enter EOF to end input.\n" ) ; 18 printf ( "? " ) ; 19 scanf ( "%d%s", &s. id, s. name ); 20 21 while (! feof ( stdin ) ) { 22 if ( s. id >= 0 && s. id < 100 ) { 23 fseek ( fd, s. id * sizeof ( student ), SEEK_SET ); 24 fwrite ( &s, sizeof ( student ), 1, fd ); 25 } 26 else 27 fprintf ( stderr, "0 <= id <= 99\n" ); 28 printf ( "? " ) ; 29 scanf ( "%d%s", &s. id, s. name ); 30 } 31 fclose ( fd ); 32 } 33 } Χαξνθόπεην Παλεπηζηήκην 39/41
Αλάγλσζε από Αξρείν Σπραίαο Πξνζπέιαζεο 1 #include < s t d i o. h> 2 3 typedef struct { 4 int id ; 5 char name [ 5 0 ] ; 6 } student ; 7 8 main ( ) 9 { 10 FILE * fd ; 11 student s ; 12 int id ; 13 14 if ( ( fd=fopen ( "random.dat", "r" ) ) == NULL ) 15 printf ( "File could not be opened\n" ) ; 16 else { Χαξνθόπεην Παλεπηζηήκην 40/41
Αλάγλσζε από Αξρείν Σπραίαο Πξνζπέιαζεο πλέρεηα 17 printf ( "Enter id,\n" ) ; 18 printf ( "Enter EOF to end input.\n" ) ; 19 printf ( "? " ) ; 20 scanf ( "%d", &id ); 21 22 while (! feof ( stdin ) ) { 23 if ( id >= 0 && id < 100 ) { 24 fseek ( fd, id * sizeof ( student ), SEEK_SET ); 25 fread ( &s, sizeof ( student ), 1, fd ); 26 printf ( "Student's name is %s\n", s. name ) ; 27 } 28 else 29 fprintf ( stderr, "0 <= id <= 99\n" ); 30 printf ( "? " ) ; 31 scanf ( "%d", &id ); 32 } 33 fclose ( fd ); 34 } 35 return 0 ; 36 } Χαξνθόπεην Παλεπηζηήκην 41/41