ΑΡ Χ Ε Ι Α Κ Ε Ι Μ Ε Ν Ο Υ (text files) Αρχείο είναι μια συλλογή δεδομένων του ίδιου τύπου. Ενα αρχείο αποθηκεύεται στην περιφερειακή μνήμη (σκληρό δίσκο, δισκέττα). Τα αρχεία είναι μόνιμα. Τα δεδομένα τους υπάρχουν και μετά την εκτέλεση του προγράμματος. Αρχεία Δεδομένων Ενα αρχείο δεδομένων είναι μια συλλογή εγγραφών. Μία εγγραφή (record) είναι μία συλλογή από συσχετισμένες τιμές δεδομένων.
Ενααρχείομπορείναείναιένααρχείο κειμένου(text file) ή ένα δυαδικό αρχείο(binary file). Ενα αρχείο κειμένου αποθηκεύει τα δεδομένα σαν αναγνώσιμους ή εκτυπώσιμους χαρακτήρες. Ενα δυαδικό αρχείο αποτελείται από τη δυαδική παράσταση των δεδομένων του και το περιεχόμενό του δεν είναι ούτε αναγνώσιμο αλλά ούτε και εκτυπώσιμο. Ρεύματα(streams) Ενα ρεύμα είναι μια σειρά από bytes συνδεδεμένη με ένα αρχείο. Το βασικό ρεύμα εισόδου θεωρείται σαν ένα αρχείο και το όνομά του είναι stdio.
Το βασικό ρεύμα εξόδου θεωρείται σαν ένα αρχείο και το όνομά του είναι stdout. Το βασικό ρεύμα λάθους είναι το ρεύμα εξόδου, αλλά έχει διαφορετικό όνομα αρχείου, stderr. Δήλωση Αρχείων FILE Παράδειγμα Ανοιγμα Αρχείου *αρχείο_1, *αρχείο_2, *αρχείο_3; FILE *arxeio; Εσωτ_Ον_Αρχείου=fopen(εξωτερικό_όν_αρχείου, τρόπος_ανοίγματος);
Εξωτερικό_Ονομα_Αρχείου : a:foitites.txt Οι πιο συνηθισμένοι τρόποι ανοίγματος r, για διάβασμα δεδομένων από το αρχείο. Το αρχείο πρέπει να υπάρχει, διαφορετικά η fopen θα αποτύχει. w, γράψιμο δεδομένων στο αρχείο ενώ καταστρέφει τα δεδομένα αν το αρχείο ήδη υπάρχει. a, για προσθήκη δεδομένων στο τέλος του ήδη υπάρχοντος αρχείου. r+, για ενημέρωση των δεδομένων του αρχείου (διάβασμα και γράψιμο)
w+, για καταστροφή του αρχείου αν υπάρχει και άνοιγμα ενός νέου αρχείου για ενημέρωση. a+, για ενημέρωση έτσι ώστε το γράψιμο να γίνεται στο τέλος του αρχείου. Παράδειγμα Δίνεται ένα αρχείο με εξωτερικό όνομα a:eisodos.txt. Να προετοιμασθεί το αρχείο αυτό για διάβασμα. #define onoma_arxeiou FILE *dedomena; a:eisodos.txt dedomena = fopen( onoma_arxeiou, r );
Παράδειγμα Δίνονται δύο ονόματα αρχείων από το πληκτρολόγιο. Το ένα ανοίγεται για διάβασμα και το άλλο για γράψιμο. char eis_arxeio[20], ex_arxeio[20]; FILE *eis_dedomena, *ex_dedomena; printf( Εισάγετε το εξωτερικό όνομα αρχείου για διάβασμα ); gets(eis_arxeio); printf( Εισάγετε το εξωτερικό όνομα αρχείου για γράψιμο ); gets(ex_arxeio); eis_dedomena = fopen(eis_arxeio, r ); ex_dedomena = fopen(ex_arxeio, w );
Αν ένα αρχείο δεν υπάρχει, τότε το άνοιγμά του θα αποτύχει. Παράδειγμα #include <stdlib.h>.. If ((eis_dedomena = fopen(eis_arxeio, r )) ==NULL) { printf( Λάθος στο άνοιγμα του αρχείου %s, eis_arxeio); exit(-1); }
Κλείσιμο Αρχείου fclose(εσωτερικό_όνομα_αρχείου); Προαιρετικό αλλά συνιστάται. Αλλαγή του τρόπου επεξεργασίας. Ανώτατο όριο ανοικτών αρχείων.
Οι ακόλουθες εντολές αλλάζουν τον τρόπο επεξεργασίας ενός αρχείου : FILE *foitites_arxeio; foitites_arxeio = fopen( a:foit.dat, w ); /*Εντολές για τη δημιουργία του αρχείου */ fclose(foitites_arxeio); foitites_arxeio = fopen( a: foit.dat, r ); /* Εντολές για διάβασμα του αρχείου*/ fclose(foitites_arxeio); Ησυνάρτηση feof feof(εσωτερικό_όνομα_αρχείου);
Παράδειγμα /* εντολές που διαβάζουν δεδομένα από το αρχείο foititis_arxeio */ while (!feof(foititis_arxeio) ) { /* εντολές επεξεργασίας των δεδομένων */ /* εντολές που διαβάζουν δεδομένα από το αρχείο foititis_arxeio */ } /* τέλος while */
Αρχεία Κειμένου Περιέχουν αναγνώσιμους και εκτυπώσιμους χαρακτήρες. Μια ακολουθία χαρακτήρων που τελειώνει με \n είναι μία εγγραφή. Επεξεργασία κατά γραμμές. Οι εντολές εισόδου-εξόδου για τα αρχεία κειμένου είναι όμοιες με τις εντολές εισόδου-εξόδου στη διαλογική επεξεργασία.
Δημιουργία αρχείου κειμένου fprintf(εσωτ_όν_αρχείου, προσδιοριστής_μορφής, λίστα); fputc(χαρακτήρας, εσωτερικό_όνομα_αρχείου); fputs(συμβολοσειρά, εσωτερικό_όνομα_αρχείου); Παράδειγμα Αν int ar1=5, ar2=15; double ar3=14.25; char xar1= x, xar2= y ; char seira[20]= Programmatismos ;
Τότε Εντολές Εκτύπωσης Γράψιμο Εγγραφής fprintf(exodos, %d\n, ar1); 5 fprintf(exodos, %d %d\n, ar1, ar2); 5 15 fprintf(exodos, %c%c\n, xar1, xar2); xy fputc(xar1, exodos); fputc(xar2, exodos); xy fputc( \n, exodos);
fputs(seira, exodos); fputs( \n, exodos); Programmatismos Πρόβλημα Να γραφεί μία συνάρτηση η οποία να δημιουργεί ένα αρχείο κειμένου, κάθε εγγραφή του οποίου αποτελείται από ένα ακέραιο αριθμό που δίνεται από το πληκτρολόγιο.
void dimiourgia_arxeiou (char on_arxeiou[]) { FILE *exodos; int akeraios; if ((exodos =fopen(on_arxeiou, w ))==NULL) { fprintf(stderr, Λάθος ανοίγματος στο αρχείο %s, on_arxeiou); exit(-1); }
printf( \nεισάγετε ένα ακέραιο ( 0 για τερματισμό): ); scanf( %d, &akeraios); while (akeraios!=0) { fprintf(exodos, %d\n, akeraios); printf( \nεισάγετε ένα ακέραιο ( 0 για τερματισμό): ); scanf( %d, &akeraios); } fclose(exodos); }/* τέλος της dimiourgia_arxeiou */
} Πρόβλημα Να γραφεί μία συνάρτηση, η οποία να δημιουργεί ένα αρχείο κειμένου από χαρακτήρες στο οποίο κάθε εγγραφή να περιέχει ένα οποιοδήποτε πλήθος χαρακτήρων. void dimiourgia_arx_xarakthron(char on_arxeiou[]) { FILE *arx_xar; char xar; if ((arx_xar=fopen(on_arxeiou, w ))==NULL){ fprintf(stderr, Λάθος στο άνοιγμα του αρχείου : %s, exit(-1); on_arxeiou);
printf( \nεισάγετε μία εγγραφή( Δώστε \ για τέλος δεδομένων) : ); scanf( %c, &xar); while (xar!= \\ ) /* Ο χαρακτήρας \ δηλώνεται σαν \\ */ { fputc(xar, arx_xar); if (xar== \n ) printf( \nεισάγετε μία εγγραφή( Δώστε \ για τέλος δεδομένων) : ); scanf( %c, &xar); } fclose(arx_xar); }
Να γραφεί ένα πρόγραμμα που να καλεί τη συνάρτηση dimiourgia_arx_xarakthron. void dimiourgia_arx_xarakthron(char on_arxeiou[]); int main(void) { char onoma_arxeiou[20]; printf( \nεισάγετε ένα εξωτερικό όνομα για το αρχείο: ); gets(onoma_arxeiou); printf( \nδημιουργία αρχείου εκτύπωσης %s, onoma_arxeiou); dimiourgia_arx_xaraktiron(onoma_arxeiou); printf( \nτο αρχείο %s έχει δημιουργηθεί ); return 0; }
Διάβασμα Αρχείου Κειμένου Οι εντολές διαβάσματος αρχείου είναι κλήσεις των ακόλουθων συναρτήσεων: fscanf(εσωτερικό_όνομα_αρχείου, προσ/τής μορφής, λίστα); fgetc(εσωτερικό_όνομα_αρχείου); fgets(συμβολοσειρά, μέγεθος, εσωτερικό_όνομα_αρχείου);
Πρόβλημα Δίνεται ένα αρχείο κειμένου κάθε εγγραφή του οποίου είναι ένας ακέραιος αριθμός. Να γραφεί μία συνάρτηση, η οποία να διαβάζει τους ακέραιους αριθμούς του αρχείου και να υπολογίζει και τυπώνει το πλήθος τους και τη μέση τιμή τους. void mesi_timi(char onoma_arxeiou[]) { FILE *arxeio; int arithmos, athroisma, plithos; float mesos_oros;
athroisma=0; plithos =0; if ((arxeio=fopen(onoma_arxeiou, r ))==NULL){ printf(stderr, Λάθος στο άνοιγμα του αρχείου : %s, onoma_arxeiou); exit(-1); } fscanf(arxeio, &arithmos); while (!feof(arxeio)) { athroisma += arithmos; plithos ++; fscanf(arxeio, arithmos); }
fclose(arxeio); if (plithos ==0) mesos_oros = 0; else mesos_oros = (float)athroisma / plithos; printf( \nπλήθος αριθμών : %d, plithos); printf( \nμέση τιμή : %f, mesos_oros); } Πρόβλημα Να γραφεί ένα πρόγραμμα, το οποίο να χρησιμοποιεί τις συναρτήσεις dimiourgia_arxeiou και mesi_timi.
#include <stdio.h> #include <stdlib.h> void dimiourgia_arxeiou(char on_arxeiou[]); void mesi_timi(char onoma_arxeiou[]); int main(void) { char on_arxeiou[20]; printf( \nεισάγετε το εξωτερικό όνομα του αρχείου : ); gets(on_arxeiou); printf( \nδημιουργία του αρχείου εκτύπωσης : %s, on_arxeiou); dimiourgia_arxeiou(on_arxeiou); printf( \nτο αρχείο %s δημιουργήθηκε, on_arxeiou);
printf( \nεπεξεργασία του αρχείου %s, on_arxeiou); mesi_timi(on_arxeiou); return 0; } Διάβασμα Μορφοποιημένων Αρχείων Αν 14.3515.6517.85 είναι μία εγγραφή. Τότε η fscanf(eisodos, %6lf%4lf%5lf, &x, &y, &z); έχει σαν αποτέλεσμα x=14.351 y=5.65 z=17.85
Αν είναι μία εγγραφή, τότε abcd, 50, 60, 70 1. fscanf(eisodos, %4s%c%d%c%d%c%d, onoma, &xar, &x, &xar, &y, &xar, &z); 2. fscanf(eisodos, %4s, %d, %d, %d, onoma, &x, &y, &z); 3. fscanf(eisodos, %4s%*c%d%*c%d%*c%d, onoma, &x, &y, &z); έχουν το ίδιο αποτέλεσμα onoma=abcd x=50 y=60 z=70
Αντιγραφή Αρχείων Πρόβλημα Να γραφεί ένα πρόγραμμα που να αντιγράφει ένα δεδομένο αρχείο κειμένου σε ένα άλλο. Ανάλυση Διαβάζεται ένας χαρακτήρας από το δεδομένο αρχείο και τυπώνεται στο νέο αρχείο μεχρις ότου συναντηθεί το τέλος του αρχείου.
#include <stdio.h> #include <stdlib.h> void antigrafi_arxeiou(char arxeio_1[], arxeio_2[]); int main(void) { char eis_arxeio[20], ex_arxeio[20]; printf( \nεισάγετε το όνομα του αρχείου που θα αντιγραφεί : ); gets(eis_arxeio); printf( \nεισάγετε το όνομα του νέου αρχείου: ); gets(ex_arxeio); antigrafi_arxeiou(eis_arxeio, ex_arxeio); return 0; }
void antigrafi_arxeiou(char arxeio_1[], arxeio_2[]) { FILE *eisodos, *exodos; char xar; if ((eisodos=fopen(arxeio_1, r ))==NULL) { fprintf(stderr, Λάθος στο άνοιγμα του αρχείου:%s, arxeio_1); exit(-1); } if ((exodos=fopen(arxeio_2, w ))==NULL){ fprintf(stderr, Λάθος στο άνοιγμα του αρχείου:%s, arxeio_2); exit(-1); }
xar=fgetc(eisodos); while (!feof(eisodos)) { fputc(xar, exodos); xar=fgetc(eisodos); } fclose(eisodos); fclose(exodos); }/* τέλος της antigrafi_arxeiou */