10.2 Καταχώρηση δεδομένων σε σειριακά αρχεία

Σχετικά έγγραφα
11.5 Ολοκληρωμένο παράδειγμα Μισθοδοσία

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

Δομές Ανακυκλώσεων. Εντολές ελέγχου - 1

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

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

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

ΚΕΦΑΛΑΙΟ 2: Τύποι δεδομένων και εμφάνιση στοιχείων...33

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

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

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

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

5.6 Μελέτη περίπτωσης. Η έξοδος θα είναι:

ΤΕΜ-101 Εισαγωγή στους Η/Υ Εξεταστική Ιανουαρίου 2011 Θέματα Β

Δομές Δεδομένων. Ενότητα 4: Ο ΑΤΔ Λίστα & Υλοποίηση Λίστας με σειριακή αποθήκευση- Ο ΑΤΔ Συνδεδεμένη Λίστα- Υλοποίηση ΑΤΔ Συνδεδεμένη Λίστα με πίνακα

ΑΣΚΗΣΗ 6: ΔΕΙΚΤΕΣ. Σκοπός της Άσκησης. 1. Εισαγωγικά στοιχεία για τους Δείκτες

Η γλώσσα προγραμματισμού C Δυναμική διαχείριση μνήμης

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

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

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

Σε μία άλλη από τις εκτελέσεις του προγράμματος η αλληλεπίδραση με το χειριστή ήταν η επόμενη:

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

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

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

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

6. ΠΙΝΑΚΕΣ & ΑΛΦΑΡΙΘΜΗΤΙΚΑ

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

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

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

#include <stdlib.h> Α. [-128,127] Β. [-127,128] Γ. [-128,128]

Δομές Δεδομένων. Ενότητα 12: Κατακερματισμός: Χειρισμός Συγκρούσεων. Καθηγήτρια Μαρία Σατρατζέμη. Τμήμα Εφαρμοσμένης Πληροφορικής.

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

Πανεπιστήµιο Θεσσαλίας, THMMY HY120, Σεπτέµβριος 2015 ΟΝΟΜΑΤΕΠΩΝΥΜΟ:

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

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

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

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

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

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

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

Διδάσκων: Κωνσταντίνος Κώστα Διαφάνειες: Δημήτρης Ζεϊναλιπούρ

Η βασική συνάρτηση προγράμματος main()

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

Κεφάλαιο 4: Συνθήκες Έλεγχου (if-else, switch) και Λογικοί τελεστές / παραστάσεις. (Διάλεξη 8)

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

Εργαστήριο 2ο. Περίγραμμα Εργαστηριακής Άσκησης

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

Κεφάλαιο Αλφαριθμητικές Σειρές Χαρακτήρων (Strings) (Διάλεξη 20) 1) Strings στη C

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

Διάλεξη 5η: Εντολές Επανάληψης

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

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

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

Α Β Γ static; printf("%c\n", putchar( A +1)+2); B DB BD. int i = 0; while (++i); printf("*");

2 η Διάλεξη C++ Δρ. Χρήστος Δρόσος ΑΕΙ ΠΕΙΡΑΙΑ ΤΤ ΤΜΗΜΑ ΑΥΤΟΜΑΤΙΣΜΟΥ

Στόχοι και αντικείμενο ενότητας. Πέρασμα Πίνακα σε Συνάρτηση (συν.) Πέρασμα Πίνακα σε Συνάρτηση. #8.. Ειδικά Θέματα Αλγορίθμων

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

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

Πίνακες. Οι πίνακες αποτελούν ένα σηµαντικό δοµηµένο τύπο δεδοµένων (structured data type) ή πιο απλά µία δοµή δεδοµένων (data structure).

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)

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

Πως θα αποθηκεύσει τη λίστα με τα ψώνια του και θα την ανακτήσει στο Σ/Μ; και πως θα προσθέσει στη λίστα του επιπλέον προϊόντα;

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

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

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

ΕΝΤΟΛΕΣ ΕΠΑΝΑΛΗΨΗΣ. for (παράσταση_1; παράσταση_2; παράσταση_3) εντολή επόμενη εντολή

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

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

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

Προγραμματισμός Δομές Δεδομένων

Εισαγωγή στον Αντικειμενοστρεφή Προγραμματισμό Διάλεξη #15

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

Υπολογισμός - Εντολές Επανάληψης

Εισαγωγή στον δομημένο προγραμματισμό

5 ΕΙΣΑΓΩΓΗ ΣΤΗ ΘΕΩΡΙΑ ΑΛΓΟΡΙΘΜΩΝ

Προγραμματισμός Η/Υ Ι (Χρήση της C) 6 η Θεωρία ΜΟΝΟΔΙΑΣΤΑΤΟΙ ΠΙΝΑΚΕΣ

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

Παρακάτω δίνεται o σκελετός προγράμματος σε γλώσσα C. Σχολιάστε κάθε γραμμή του κώδικα.

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

Στόχοι και αντικείμενο ενότητας. Τύπος πίνακα. Τύπος πίνακα (συν.) #6. Πίνακες και Δείκτες

ΕΛΛΗΝΙΚΟ ΑΝΟΙΚΤΟ ΠΑΝΕΠΙΣΤΗΜΙΟ

Γλώσσα Προγραμματισμού C. Προγραμματισμός HY: Γλώσσα Προγραμματισμού C. Γρήγορος Πίνακας Αναφοράς Σύνταξης. Εισήγηση #4. Επαναληπτικές δομές:

Transcript:

240 χνητά επιβαλόμενη κατάσταση καθώς όλα τα αποθηκευτικά μέσα επιτρέπουν την τυχαία προσπέλαση. 10.2 Καταχώρηση δεδομένων σε σειριακά αρχεία Για τη μελέτη της σειριακής επεξεργασίας αρχείων θα δημιουργήσουμε ένα πακέτο προγραμμάτων για την καταγραφή και την (αναζήτηση και) άντληση πληροφοριών που αφορούν τις ξενοδοχειακές μονάδες μιας περιοχής (π.χ. της Νομαρχίας Δωδεκανήσου). Το πακέτο θα βασισθεί σε τρία προγράμματα. Όλα τα δεδομένα θα αποθηκεύονται σε ένα αρχείο εγγραφών σταθερού μήκους το οποίο θα είναι σειριακό. Ο όρος σειριακό αποδίδει την υποχρεωτική προσπέλαση όλων των εγγραφών που προηγούνται από την ζητούμενη, ακόμα και αν αυτές δεν έχουν καμία σημασία για το προγραμμά μας. Το πρώτο πρόγραμμα σκοπό έχει την δημιουργία του αρχείου και την καταχώρηση των δεδομένων. Το δεύτερο πρόγραμμα σκοπό έχει την αναζήτηση πληροφοριών για τα καταλύματα (ξενοδοχεία) για το νησί που θα προσδιορίζει ο χειριστής. Το δεύτερο πρόγραμμα του πακέτου περιορίζεται μόνο στην αναζήτηση πληροφοριών και δεν πραγματοποιεί καμία άλλη μορφή επεξεργασίας (ενημέρωση, διαγραφή και προσθήκη εγγραφής) καθώς αυτές είναι ιδιαίτερα «επώδυνες» στα σειριακά αρχεία. (Θα αναφερθούμε στη γενική μορφή που μπορεί να έχουν οι παραληφθείσες μορφές επεξεργασίας, στο τέλος του κεφαλαίου.) Το τρίτο πρόγραμμα σκοπό έχει τη διάταξη των εγγραφών του αρχείου καταλυμάτων (ξενοδοχείων) ανά νησί (ονομασία νησιού). Στα προγράμματα του πακέτου καταλυμάτων θα χρησιμοποιήσουμε προκαθορισμένες ρουτίνες χειρισμού αρχείων, σε αντίθεση με τις πρωτογενείς κλήσεις χειρισμού αρχείων που χρησιμοποιήσαμε στα δύο προηγούμενα πακέτα. Σκοπός αυτής της αλλαγής είναι: να συμβάλει στην εξοικείωση του αναγνώστη με όσες περισσότερες από τις γνώσεις που θα χρειασθεί στην καριέρα του, να παρέχει μια ευρύτητα γνώσης για το αντικείνενο που αποφάσισε να ασχοληθεί ο αναγνώστης, να επιτρέψει στον αναγνώστη να αποφασίσει ο ίδιος πως θα χειρίζεται τα αρχεία στα πακέτα προγραμμάτων που θα αναπτύξει (ο ίδιος, εκ του μηδενός) και

Κεφάλαιο 10: Σειριακή επεξεργασία αρχείων 241 να του δώσει τη δυνατότητα να συντηρεί πακέτα που έχουν κατασκευάσει άλλοι. Η εμμονή σε έναν μόνο από τους προσφερόμενους τρόπους χειρισμού αρχείων (προκαθορισμένες ρουτίνες χειρισμού αρχείων έναντι πρωτογενών κλήσεων χειρισμού αρχείων) θεωρούμε ότι είναι μία, τουλάχιστον, λανθασμένη αντιμετώπιση. Το πρώτο πρόγραμμα του πακέτου καταλυμάτων (έστω create.c) παρουσιάζεται στη συνέχεια, σε πλήρη ανάπτυξη: /* ******************************************************* * Author: Nikitas N. Karanikolas, Assistant Professor * * Creation Date: February 20, 2009 * ******************************************************* */ #include <stdio.h> typedef struct { char name[40]; char island[20]; int single_bed; int double_bed; int twin_bed; int gt_double; /* greater than double room */ char facilities[100]; hotel_rec; char *islands[]={"patmos", "Arki", "Lipsi", "Leros", "Kalymnos", "Pserimos", "Kos", "Astypalaia", "Nisyros", "Symi", "Tilos", "Chalki", "Rhodes", "Kastelorizo", "Karpathos", "Kasos"; void upper(char *str) { int i; for (i=0; i<strlen(str); i++) if ((str[i]>=97) && (str[i]<=122)) str[i]=str[i]-32; void blank(char buffer[], int size) { int i; for (i=0; i<size; i++) buffer[i]=0;

242 main () { hotel_rec h1; char tmp_str[40]; int i, k, howmany; FILE *fp; fp=fopen("hotels.dat","ab"); if (fp==null) { printf("can not open Hotels.Dat for appending data"); exit(1); do { blank(&h1,sizeof(hotel_rec)); printf("\ngive hotel name: "); gets(h1.name); printf("[%s]\n",h1.name); strcpy(tmp_str,h1.name); upper(tmp_str); if (strcmp(tmp_str,"quit")==0) break; do { printf("\ngive the island ("); for (i=0; i<sizeof(islands)/sizeof(char *); i++) { printf("%d=%s", i+1, islands[i]); if (i==sizeof(islands)/sizeof(char *)-1) printf(") "); else printf(", "); scanf("%d",&k); /* printf("[%d]\n",k); */ while ((k<1) (k>sizeof(islands)/sizeof(char *))); printf("[%s]\n",islands[k-1]); strcpy(h1.island,islands[k-1]); gets(tmp_str); /* garbage collection */ printf("\ngive number of single, double, twin-bed and " "greater-than-double rooms: "); scanf("%d %d %d %d", &h1.single_bed, &h1.double_bed, &h1.twin_bed, &h1.gt_double); printf("[%d] [%d] [%d] [%d]\n", h1.single_bed, h1.double_bed, h1.twin_bed, h1.gt_double); gets(tmp_str); /* garbage collection */ printf("\ndescribe facilities: "); gets(h1.facilities); printf("[%s]\n",h1.facilities); howmany=fwrite(&h1,sizeof(hotel_rec),1,fp);

Κεφάλαιο 10: Σειριακή επεξεργασία αρχείων 243 /* printf("\nhowmany=%d\n", howmany); */ while (1); fclose(fp); Η δομή του προγράμματος δημιουργίας του αρχείου και εισαγωγής των δεδομένων, όπως και στα αντίστοιχα προγράμματα των πακέτων ηλεκτρονικής ατζέντας, βασίζεται σε ένα επαναλληπτικό σχήμα do while. Σε κάθε επανάλληψη, ο χειριστής εισαγάγει πληροφορίες που χρησιμοποιούνται για τη σύνθεση μίας εγγραφής που αποθηκεύεται (γράφεται) στο αρχείο ("hotels.dat"). Παρατηρούμε ότι δεν χρησιμοποιούμε εντολές creat ή open. Αντί αυτών χρησιμοποιούμε την εντολή: fp=fopen("hotels.dat","ab"); Την εντολή fopen την έχουμε ξανασυναντήσει, και εξηγήσει, στο κεφάλαιο οκτώ. Τότε όμως την είχαμε χρησιμοποιήσει σε συνδυασμό με τις εντολές putc, fprintf και fclose για την δημιουργία ενός αρχείου κειμένου. Τώρα, εδώ, τη χρησιμοποιούμε σε συνδυασμό με την εντολή fwrite και fclose για τη δημιουργία αρχείου εγγραφών: howmany=fwrite(&h1,sizeof(hotel_rec),1,fp); Η επικεφαλίδα της συνάρτησης fwrite είναι: int fwrite(char *buffer, unsigned int size, int n, FILE *fp); Το πρώτο όρισμα είναι ένας δείκτης στην εγγραφή (ή σε μια ακολουθία από διαδοχικές εγγραφές) που θα αποθηκευτούν, το δεύτερο όρισμα είναι το μέγεθος της (μίας) εγγραφής, το τρίτο όρισμα είναι το πλήθος των εγγραφών που θα αποθηκευτούν και το τέταρτο όρισμα είναι ο δείκτης σε μια δομή FILE που περιλαμβάνει πληροφορίες για το (ανοικτό) αρχείο στο οποίο θα γίνει η εγγραφή. Η συνάρτηση fwrite επιστρέφει τον αριθμό των bytes που τελικά εγγράφησαν στο αρχείο. Μπορούμε να πουμε ότι ο συνδυασμός πρωτογενών κλήσεων χειρισμού αρχείων creat / open, write και close μπορεί να αντικατασταθεί από το συνδυασμό προκαθορισμένων ρουτινών χειρισμού αρχείων fopen, fwrite και fclose, για τη δημιουργία και αποθήκευση δεδομένων σε αρχείο εγγραφών.

244 Η εκτέλεση του πρώτου προγράμματος (create.c) του πακέτου καταλυμάτων (τα τελευταία βήματα αλληλεπίδρασης με το χρήστη) εμφανίζονται στην επόμενη εικόνα:

Κεφάλαιο 10: Σειριακή επεξεργασία αρχείων 245 10.3 Αναζήτηση δεδομένων από σειριακά αρχεία Το δεύτερο πρόγραμμα, όπως έχουμε αναφέρει στην αρχή του κεφαλαίου, σκοπό έχει την αναζήτηση πληροφοριών για τα καταλύματα (ξενοδοχεία) για το νησί που έχει προσδιορίσει ο χειριστής. Δηλαδή το κριτήριο αναζήτησης είναι η ονομασία του νησιού. Είναι προφανές ότι στο αρχείο δεδομένων μπορεί να μην υπάρχει καμία εγγραφή, να υπάρχει μόνο μία ή ακόμα και να υπάρχουν πολλές εγγραφές αν στο νησί αυτό υπάρχουν (και έχουν καταχωρηθεί) πολλά καταλύματα. Επίσης οι εγγραφές, που τελικά ικανοποιούν το κριτήριο, μπορεί να βρίσκονται διάσπαρτες μέσα στο αρχείο και να μην είναι συγκεντρωμένες σε διαδοχικές θέσεις. Αυτό συμβαίνει γιατί το αρχείο δεν διαθέτει καμία διάταξη, ως προς κανένα από τα πεδία των εγγραφών. Συνεπώς το πρόγραμμα αναζήτησης θα πρέπει υποχρεωτικά να διασχίσει (αναγνώσει) όλες τις εγγραφές αλλά να εμφανίζει τα περιεχόμενα μόνο από εκείνες που ικανοποιούν το κριτήριο αναζήτησης. Το έργο αυτό κάνει με επιτυχία το επόμενο πρόγραμμα (έστω search.c): /* ******************************************************* * Author: Nikitas N. Karanikolas, Assistant Professor * * Creation Date: February 20, 2009 * ******************************************************* */ #include <stdio.h> typedef struct { char name[40]; char island[20]; int single_bed; int double_bed; int twin_bed; int gt_double; char facilities[100]; hotel_rec; char *islands[]={"patmos", "Arki", "Lipsi", "Leros", "Kalymnos", "Pserimos", "Kos", "Astypalaia", "Nisyros", "Symi", "Tilos", "Chalki", "Rhodes", "Kastelorizo", "Karpathos", "Kasos"; main () { hotel_rec h1; int i, k, howmany;

246 FILE *fp; fp=fopen("hotels.dat","rb"); if (fp==null) { printf("can not open Hotels.Dat for reading data"); exit(1); do { printf("\ngive the island ("); for (i=0; i<sizeof(islands)/sizeof(char *); i++) { printf("%d=%s", i+1, islands[i]); if (i==sizeof(islands)/sizeof(char *)-1) printf(") "); else printf(", "); scanf("%d",&k); while ((k<1) (k>sizeof(islands)/sizeof(char *))); printf("[%s]\n",islands[k-1]); do { howmany=fread(&h1,sizeof(hotel_rec),1,fp); if (howmany<1) break; if (strcmp(h1.island,islands[k-1])==0) { printf("\nname:%s, facilities:%s\n", h1.name,h1.facilities); printf("rooms single:%d, double:%d, " "twin:%d, greater:%d\n", h1.single_bed, h1.double_bed, h1.twin_bed, h1.gt_double); while (1); fclose(fp); Το πρόγραμμα αυτό ζητά από το χειριστή να προσδιορίσει το νησί για το οποίο ζητάει πληροφορίες καταλυμάτων. Στη συνέχεια, με τη βοήθεια ενός do while επαναληπτικού σχήματος και του πίνακα islands, υποχρεώνει το χειριστή να επιλέξει ένα από τα τυποποιημένα ονόματα των νησιών της περιοχής ενδιαφέροντος. Το δεύτερο επαναληπτικό σχήμα διασχίζει (διαβάζει) μία προς μία όλες τις εγγραφές. Σε κάθε βήμα της επανάληψης διαβάζεται μία εγγραφή, με την εντολή fread, και ελέγχεται αν το όνομα νησιού που

Κεφάλαιο 10: Σειριακή επεξεργασία αρχείων 247 περιέχει η εγγραφή είναι ίδιο με αυτό το όνομα που έχει προσδιορίσει ο χειριστής. Αν ο έλεγχος έχει αληθές αποτέλεσμα, εμφανίζονται τα στοιχεία της εγγραφής (του καταλύματος). Διαφορετικά τα στοιχεία της εγγραφής δεν αξιοποιούνται (δεν τα κάνει τίποτα το πρόγραμμα). Το πρόγραμμα αυτό χρησιμοποιεί το συνδυασμό ρουτινών fopen, fread και fclose για να σαρώσει διαδοχικά τα δεδομένα του αρχείου καταλυμάτων. Μπορούμε να πουμε ότι ο συνδυασμός πρωτογενών κλήσεων χειρισμού αρχείων open, read και close, που είδαμε σε προηγούμενα κεφάλαια, μπορεί να αντικατασταθεί από το συνδυασμό προκαθορισμένων ρουτινών χειρισμού αρχείων fopen, fread και fclose, για την σάρωση των δεδομένων από αρχείο εγγραφών. Η μόνη νέα συνάρτηση είναι η fread. Η επικεφαλίδα της οποίας είναι: int fread(char *buffer, unsigned int size, int n, FILE *fp); Το πρώτο όρισμα είναι ένας δείκτης στην εγγραφή (ή σε μια ακολουθία από διαδοχικές εγγραφές) που θα φορτωθούν (καταχωρηθούν) τα στοιχεία (εγγραφές) που θα διαβάσει η fread, το δεύτερο όρισμα είναι το μέγεθος της (μίας) εγγραφής, το τρίτο όρισμα είναι το πλήθος των εγγραφών που απαιτείται να διαβασθούν και το τέταρτο όρισμα είναι ο δείκτης σε μια δομή FILE που περιλαμβάνει πληροφορίες για το (ανοικτό) αρχείο από το οποίο θα γίνει η ανάγνωση. Η συνάρτηση επιστρέφει τον αριθμό των εγγραφών που τελικά διαβάσθηκαν. Συνήθως, όταν η συνάρτηση επιστρέψει ένα α- ριθμό μικρότερο από τον αριθμό εγγραφών που απαιτήθηκε να διαβασθούν, έχουμε φτάσει στο τέλος αρχείου. Σε αυτή την ιδιότητα (υπόθεση) βασίζεται και το πρόγραμμά μας και διακόπτει (τερματίζει) το επαναληπτικό σχήμα ανάγνωσης στοιχείων από το αρχείο των καταλυμάτων, όταν η fread διαβάσει λιγότερες από μία εγγραφές. Η εκτέλεση του δεύτερου προγράμματος του πακέτου καταλυμάτων (δύο διαδοχικές εκτελέσεις) εμφανίζονται στην επόμενη εικόνα:

248 10.4 Αλγόριθμοι ενημέρωσης και διαγραφής εγγραφών από σειριακά αρχεία Η ενημέρωση μίας ή περισσοτέρων εγγραφών ενός σειριακού αρχείου, με δεδομένη την αδυναμία επιστροφής σε μία εγγραφή που έχει αναγνωσθεί (μετακίνηση προς τα πίσω), επιβάλει τη χρήση δύο αρχείων. Ο επόμενος Αλγόριθμος (ψευδοκώδικας) αποτυπώνει την κεντρική ιδέα στην οποία μπορούμε να βασισθούμε για να κατασκευάσουμε ένα πρόγραμμα που μεταβάλει κάποιες εγγραφές (όποιες επαληθεύουν κάποιο κριτήριο) ενός σειριακού αρχείου: Ανοιξε για ανάγνωση το κύριο αρχείο Δημιούργησε ένα βοηθητικό αρχείο για εγγραφή Όσο δεν εξαντλήθηκαν οι εγγραφές του κύριου αρχείου Δίαβασε μία εγγραφή από το κύριο αρχείο Αν η εγγραφή που αναγνώσθηκε ικανοποιεί το κριτήριο Κάνε μεταβολές στην εγγραφή Αποθήκευσε την αλλαγμένη εγγραφή στο βοηθητικό αρχείο Διαφορετικά αποθήκευσε την εγγραφή στο βοηθητικό αρχείο Τέλος Αν