Προγραμματιςμόσ Μεκόδων Επίλυςθσ Προβλθμάτων 20. Αρχεία Ιωάννθσ Κατάκθσ
Aποκικευςθ Για να αποκθκεφςουμε δεδομζνα από ζνα πρόγραμμα, πρζπει να χρθςιμοποιιςουμε τθ δευτερεφουςα μνιμθ
Aποκικευςθ Η πιο ςυνθκιςμζνθ μορφι δευτερεφουςασ μνιμθσ θ οποία αξιοποιείται από ζνα πρόγραμμα είναι ο μαγνθτικόσ δίςκοσ Αποτελείται από ζνα ι περιςςότερουσ δίςκουσ με μαγνθτικι επικάλυψθ Σα δεδομζνα αποκθκεφονται ςε τομείσ (sectors) Οι δίςκοι διακζτουν τθ δυνατότθτα ςειριακισ αλλά και άμεςθσ πρόςβαςθσ ςτα δεδομζνα.
Επανάλθψθ ςτα λειτουργικά ςυςτιματα Ποιοσ διαχειρίηεται τουσ πόρουσ (Μνιμθ, Δίςκο, Επεξεργαςτι, κτλ) ςε ζνα Τπολογιςτικό φςτθμα? ΣΟ ΛΕΙΣΟΤΡΓΙΚΟ ΤΣΗΜΑ (Operating System)
υςτιματα διαχείριςθσ αρχείων o Κάκε γλϊςςα προγραμματιςμοφ ζχει κάποια βιβλιοκικθ θ οποία προςφζρει λειτουργίεσ πρόςβαςθσ ςε αρχεία αποκθκευμζνα ςε μονάδεσ δευτερεφουςασ μνιμθσ o τθ C, oι λειτουργίεσ αυτζσ προςφζρονται από τθ βιβλιοκικθ <stdio.h> o Η βιβλιοκικθ επικοινωνεί με το υποςφςτθμα διαχείριςθσ αρχείων (File System) του λειτουργικοφ ςυςτιματοσ το οποίο ςτθν ςυνζχεια διεκπεραιϊνει τισ λειτουργίεσ που ηθτά ο προγραμματιςτισ (το filesystem ςτα Windows είναι το FAT32 και το NTFS) o Ασ δοφμε τι περιζχουν εςωτερικά τα αρχεία (δθλαδι πωσ αποκθκεφουν τισ πλθροφορίεσ)
Αρχεία κειμζνου o Ζνα αρχείο είναι μία ακολουκία bytes π.χ. 01100011 01100001 01110010 ascii:99 ascii:97 ascii:114 c a r o Οι χαρακτιρεσ αυτοί είναι αποκθκευμζνοι ςειριακά ςτο αρχείο και διαχωρίηονται με διάφορουσ ειδικοφσ χαρακτιρεσ Αρτείο όπως ηο βλέπει ο τρήζηης Αρτείο ζηην πραγμαηικόηηηα Car Test hello Car\nTest\thelloEOF Τέλος αρτείοσ ascii: -1
Αρχεία κειμζνου Ο Πίνακασ ASCII Αρκετοί χαρακτιρεσ είναι κρυμμζνοι δθλαδι δεν φαίνονται ςτθν οκόνθ και ςτα αρχεία
Δυαδικά αρχεία Δεν αποτελοφνται όμωσ όλα τα αρχεία από χαρακτιρεσ ASCII Ασ δοφμε πωσ είναι κωδικοποιθμζνο ζνα αρχείο εικόνασ GIF (Graphics Interchange Format), ςυγκεκριμζνα τθ γνωςτι εικόνα του folder ςτα Windows Αρχή Σο ςχιμα δείχνει ότι οι εικόνεσ (όπωσ και ΌΛΑ τα αρχεία) είναι ουςιαςτικά μια ςειρά από bytes (ςτο ςχιμα κωδικοποιθμζνα ςτο δεκαεξαδικό ςφςτθμα για να κερδίςουμε χϊρο) 47 16 =1000111 2
Ειςαγωγι ςτα αρχεία o Σϊρα κα επικεντρωκοφμε ςτισ λειτουργίεσ εγγραφισ και ανάγνωςθσ ςε αρχεία τθσ βιβλιοκικθσ <stdio.h> o Η επεξεργαςία αρχείων γίνεται κατά τον ακόλουκο τρόπο υςχετίηουμε μία οντότθτα τθσ C με το αρχείο (άνοιγμα του αρχείου) Πραγματοποιοφμε τισ λειτουργίεσ ανάγνωςθσ και εγγραφισ δεδομζνων Κλείνουμε το αρχείο
Δείκτεσ αρχείων o Σο άνοιγμα ενόσ αρχείου απαιτεί τθ διαςφνδεςθ του με μια ειδικι μεταβλθτι (δείκτθσ αρχείου) ςτο πρόγραμμα o Οι μεταβλθτζσ αυτζσ δθλϊνονται ςε ζνα πρόγραμμα όπωσ όλεσ οι άλλεσ μεταβλθτζσ και ο τφποσ δεδομζνων τουσ είναι ο FILE *, ο οποίοσ είναι δθλωμζνοσ ςτο stdio.h Π.χ. #include <stdio.h> int main () FILE *arxeio; //Η μεηαβληηή arxeio μπορεί ηώρα να διαζυνδεθεί με ένα //αρχείο o Οι μεταβλθτζσ δείκτεσ αρχείων χρθςιμοποιοφνται ςε όλεσ τισ ςυναρτιςεισ χειριςμοφ αρχείων: άνοιγμα, κλείςιμο, εγγραφι, ανάγνωςθ, ζλεγχοσ κατάςταςθσ κ.τ.λ. o Ζνα πρόγραμμα μπορεί να δθλϊνει περιςςότερεσ τθσ μίασ μεταβλθτζσ δείκτεσ αρχείου, που διαςυνδζονται είτε ςτο ίδιο αρχείο ι ςε διαφορετικά
Άνοιγμα αρχείων υνάρτθςθ fopen FILE *fopen(char *filename, char *mode); Η παράμετροσ filename υποδεικνφει το όνομα του αρχείου που επικυμοφμε να ανοίξουμε Σο mode υποδεικνφει το είδοσ τθσ πράξθσ (π.χ. read, write, read-write) FILE οντότθτα διαχείριςθσ αρχείων main() FILE *fp; fp = fopen("myfile.txt", "r");.
Άνοιγμα αρχείων H παράμετροσ mode υποδεικνφει τον τρόπο με τον οποίο κζλουμε να προςπελάςουμε το αρχείο Mode r w a Σημασία Μόνο Aνάγνωση. Αν ηο αρτείο δεν σπάρτει, επιζηρέθεηαι NULL Μόνο Eγγραφή. Αν ηο αρτείο δεν σπάρτει δημιοσργείηαι, αν σπάρτει ηα περιετόμενά ηοσ διαγράθονηαι Προσθήκη. Αν ηο αρτείο δεν σπάρτει, δημιοσργείηαι r+ Ανάγνωση και εγγραφή. Αν ηο αρτείο δεν σπάρτει, επιζηρέθεηαι NULL w+ Ανάγνωση και εγγραφή. Αν ηο αρτείο δεν σπάρτει δημιοσργείηαι, αν σπάρτει ηα περιετόμενά ηοσ διαγράθονηαι a+ Προσθήκη και ανάγνωση. Αν ηο αρτείο δεν σπάρτει, δημιοσργείηαι
Κλείςιμο αρχείων Όηαν ένα πρόγραμμα ολοκληρώζει ηις λειηοσργίες εγγραθής ή ανάγνωζης ζε ένα αρτείο θα πρέπει να ηο κλείνει ώζηε να απελεσθερώνεηαι ηο αρτείο και να μπορεί εν δσνάμει να τρηζιμοποιηθεί από άλλα προγράμμαηα υνάρτθςθ fclose fclose(file *fp); main() FILE *fp; fp = fopen("myfile.txt", "r"); fclose(fp);.
Άνοιγμα / Εγγραφι / Κλείςιμο Αρχείων Γράψετε ζνα απλό πρόγραμμα που προςκζτει τθ λζξθ Hello ςε ζνα αρχείο #include <stdio.h> int main() Append mode FILE *fp; fp = fopen("myfile.txt", "a"); // άνοιγμα αρχείου fprintf(fp, "Hello"); // εκτφπωςθ ςε αρχείο fclose(fp); // κλείςιμο αρχείου return 0; Ασ δοφμε τϊρα τισ εντολζσ fprintf, fclose ςε περιςςότερο βάκοσ
Άνοιγμα / Εγγραφι / Κλείςιμο Αρχείων To ίδιο πρόγραμμα με ςυνκικθ ζλεγχου που ελζγχει αν άνοιξε επιτυχϊσ το αρχείο #include <stdio.h> main() FILE *fp; // Try to open the file if ((fp = fopen("myfile.txt", a")) == NULL) printf("error opening file\n"); exit(1); // Write to the file Hello 5 6 fprintf(fp, "Hello%d %d, 5,6); fclose(fp);
Άνοιγμα / Ανάγνωςθ Ακζραιου / Κλείςιμο #include <stdio.h> main() Mode Ανάγνωςθσ FILE *fp; int a; if ((fp = fopen("myfile.txt", r")) == NULL) printf("error opening file\n"); exit(1); // Διάβαςε ζνα αρικμό από το αρχείο fscanf(fp, %d, &a); // Κλείςε το αρχείο fclose(fp);
Άνοιγμα / Ανάγνωςθ / Εκτφπωςθ / Κλείςιμο #include <stdio.h> main() FILE *fp; int a; if ((fp = fopen("myfile.txt", r")) == NULL) printf("error opening file\n"); exit(1); // Διάβαςε ζνα αρικμό από το αρχείο fscanf(fp, %d, &a); // Εκτφπωςε τον αρικμό printf( %d, a); // Close the file fclose(fp);
Άνοιγμα / Ανάγνωςθ + Εκτφπωςθ x 2 / Κλείςιμο #include <stdio.h> main() FILE *fp; int a; if ((fp = fopen("myfile.txt", r")) == NULL) printf("error opening file\n"); exit(1); fscanf(fp, %d, &a); printf( %d, a); fscanf(fp, %d, &a); printf( %d, a); fclose(fp); Ανάγνωςθ δυο ακζραιων από αρχείο και εκτφπωςθ τουσ ςτθν οκόνθ
Πρόγραμμα Ανάγνωςθσ Πολλϊν Αρικμϊν Κάποιοσ ςασ δίδει ζνα μεγάλο αρχείο αρικμϊν. ασ ηθτά να βρείτε τον μζγιςτο αρικμό ςτο αρχείο. Myfile.txt 5 6 6 4 5 5 53 34 4 4 100 54 54 543 6
Πρόγραμμα ανάγνωςθσ πολλϊν αρικμϊν #include <stdio.h> main() FILE *fp; int a; int max=-1; if ((fp = fopen("myfile.txt", r")) == NULL) printf("error opening file\n"); exit(1); while (fscanf(fp, "%d", &a)!= EOF) //printf("%d\n", a); if (a>max) max = a; printf( max:%d, max); //Print the MAX fclose(fp); //Close the file
Άςκθςθ Σι ακριβϊσ κάνει το παρακάτω πρόγραμμα; #include <stdio.h> #include <stdlib.h> main() FILE *fp; int i; int max=-1; srand(time(null)); if ((fp = fopen("myfile.txt", "w")) == NULL) printf("error opening file\n"); exit(1); for (i=0;i<10;i++) fprintf(fp, "%d\n", rand() % 1000); fclose(fp);
Παράδειγμα Να γίνει πρόγραμμα το οποίο κα διαβάηει 10 ακζραιουσ αρικμοφσ από το χριςτθ και κα τουσ αποκθκεφει με ανάςτροφθ ςειρά ςτο αρχείο b.txt int main() FILE *fp; int A[10],i; if ((fp = fopen("b.txt","w"))!=null) for (i=9;i>=0;i--) printf("give number %d: ",10-i); scanf("%d",&a[i]); for (i=0;i<10;i++) fprintf(fp,"%d ",A[i]); fclose(fp); else printf("error opening file\n"); system("pause"); return 0;
Σζλοσ διάλεξθσ