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

Σχετικά έγγραφα
Προγραμματισμός Η/Υ (ΤΛ2007 )

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

Προγραµµατισµός. Αρχεία

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

Κεφάλαιο 12: Είσοδος και έξοδος δεδομένων σε αρχεία

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

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

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

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

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

Κεφάλαιο 8.7. Πολυδιάστατοι Πίνακες (Διάλεξη 19)

Ι Ανασκόπηση και εμβάθυνση Μερικά πιο προχωρημένα θέματα. ΙΙ Τα αρχεία δεδομένων στη C

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

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

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

Προγραμματισμό για ΗΜΥ

ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΣ ΜΑΘΗΜΑ 2 Ο. Εισαγωγή στην C Εντολές εξόδου Εντολές εισόδου Μορφοποιητές ΣΙΝΑΤΚΑΣ Ι. ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΣ

Προγραμματιστικές τεχνικές

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

Πληροφορική & Τηλεπικοινωνίες. K18 - Υλοποίηση Συστημάτων Βάσεων Δεδομένων Εαρινό Εξάμηνο

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

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

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

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

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

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

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

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

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

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

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

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

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

Πληροφορική & Τηλεπικοινωνίες K18 - Υλοποίηση Συστηµάτων Βάσεων εδοµένων Εαρινό Εξάµηνο

Transcript:

Τεχνολογικό Εκπαιδευτικό Ίδρυμα Κρήτης Σχολή Εφαρμοσμένων Επιστημών Τμήμα Ηλεκτρονικών Μηχανικών Τομέας Αυτοματισμού και Πληροφορικής Δομημένος Προγραμματισμός (ΤΛ1006) Δρ. Μηχ. Νικόλαος Πετράκης, Καθηγητής Εφαρμογών (npet@chania.teicrete.gr) Δέκατη τρίτη (13 η ) τρίωρη διάλεξη. Ιστοσελίδα Μαθήματος: https://eclass.chania.teicrete.gr/courses/el106 Εξάμηνο: Χειμερινό 2017-18

Ενώσεις Η ένωση (union) είναι ένας τύπος της C που μοιάζει με τη δομή. Μια ένωση έχει στοιχεία διαφορετικών τύπων, όπως η δομή, αλλά μόνο ένα από αυτά μπορεί να χρησιμοποιείται κάθε φορά. Για τα στοιχεία της ένωσης δεσμεύεται ένας κοινός χώρος μνήμης, ίσος με το μέγεθος του μεγαλύτερου στοιχείου. H ανάθεση τιμής σε ένα στοιχείο της ένωσης «γράφει» στην περιοχή μνήμης που μπορεί να υπήρχε τιμή για άλλο στοιχείο. Παράδειγμα: union shared { char c; int i; ; union shared generic_variable = {'@'; Χρησιμοποιούμε τον τελεστή μέλους (dot operator) για να προσπελαύνουμε τα μέλη της ένωσης. 2

Παράδειγμα #include <stdio.h> #define CHARACTER 'C' #define INTEGER 'I' #define FLOAT 'F' main() { struct generic_tag var; var.type = CHARACTER; var.shared.c = '$'; print_function(var); struct generic_tag{ char type; union shared_tag { char c; int i; float f; ; shared; void print_function(struct generic_tag gen); var.type = FLOAT; var.shared.f = (float)3.1415; print_function(var); var.type = 'x'; var.shared.i = 111; print_function(var); return 0; 3

Παράδειγμα (συνέχεια) void print_function(struct generic_tag gen) { printf("\n\nthe generic value is..."); switch(gen.type) { case CHARACTER: printf("%c", gen.shared.c); break; case INTEGER: printf("%d", gen.shared.i); break; case FLOAT: printf("%f", gen.shared.f); break; default: printf("an unknown type: %c\n", gen.type); break; return ; Αποτέλεσμα: The generic value is...$ The generic value is...3.1415 The generic value is...an unknown type: x 4

Ροές ή Ρεύματα Κειμένου (Text Streams ) Στη C ο όρος (text) stream ορίζει μία πηγή στοιχείων εισόδου, ή ένα προορισμό για στοιχεία εξόδου (μία ακολουθία bytes δεδομένων) και είναι συνώνυμο με το αρχείο (κειμένου). Δύο βασικά και οριζόμενα αυτόματα από τη C streams είναι το πληκτρολόγιο (keyboard) για είσοδο (input) [stdin], και η οθόνη (screen ή terminal), για έξοδο (output) [stdout], Τα μεγάλα προγράμματα μπορούν να έχουν πολλές πηγές εισόδου π.χ. Modems, CD drives, files, κλπ. Τα προγράμματα συνήθως διαβάζουν στοιχεία από μια πηγή και στέλνουν αποτελέσματα σε ένα προορισμό (που μπορεί να είναι πηγή στοιχείων για κάποιο άλλο πρόγραμμα). Στη C θα μπορούσαμε να χειριστούμε μια ροή είτε ως κειμένου (text) είτε ακόμα και ως δυαδική (binary). 5

Προκαθορισμένες ροές Η ΑΝSI C έχει τρεις προκαθορισμένες ροές: stdin (προκαθορισμένη είσοδος πληκτρολόγιο), stdout (προκαθορισμένη έξοδος οθόνη), και stderr (προκαθορισμένη έξοδος λάθους οθόνη). Με printf() ή puts() χρησιμοποιούμε την stdout, με scanf() ή gets() λαμβάνουμε είσοδο από το πληκτρολόγιο, δηλ. την stdin. Οι περισσότερες συναρτήσεις της C, είτε χρησιμοποιούν τις προκαθορισμένες ροές, είτε απαιτούν τον προσδιορισμό της ροής από το χρήστη (π.χ. getc() / getchar(), putc() / putchar(), κλπ) 6

Προσπέλαση Αρχείων Μέχρι τώρα όποτε μιλούσαμε για αρχείο εισόδου θεωρούσαμε την πρότυπη (στάνταρτ) είσοδο και όποτε μιλούσαμε για αρχείο εξόδου θεωρούσαμε την πρότυπη έξοδο, που σε κάθε πρόγραμμα C ορίζονται αυτόματα από το τοπικό λειτουργικό σύστημα. Στην συνέχεια θα δούμε πως μπορούμε να προσπελάσουμε αρχεία που δεν είναι ήδη συνδεδεμένα με το πρόγραμμα. Π.χ. cat prog1.c prog2.c // συνενώνει ένα σύνολο κατονομαζόμενων // αρχείων στην οθόνη Το πρόβλημα είναι πως να οργανώσουμε το διάβασμα ή την εγγραφή των αναφερόμενων αρχείων - δηλαδή, πως να συνδέσουμε τα εξωτερικά ονόματα που έχει στο νου του ο χρήστης, με τις εντολές που διαβάζουν τα δεδομένα. 7

Βήματα για την Προσπέλαση Αρχείων Για να μπορεί να γραφτεί ή να διαβαστεί ένα αρχείο, πρέπει να ανοιχτεί με την συνάρτηση βιβλιοθήκης fopen(), η οποία παίρνει ένα εξωτερικό όνομα (όπως το prog1.c ή prog2.c) και επιστρέφει ένα δείκτη διεύθυνσης (pointer) για να χρησιμοποιηθεί στις επόμενες αναγνώσεις ή καταγραφές του αρχείου. Ο δείκτης αυτός, που λέγεται δείκτης διεύθυνσης αρχείου (file pointer), δείχνει μια δομή που περιέχει πληροφορίες για το αρχείο, όπως η θέση μιας περιοχής ενδιάμεσης αποθήκευσης (buffer), η τρέχουσα θέση χαρακτήρα στην περιοχή ενδιάμεσης αποθήκευσης, το αν γράφεται ή διαβάζεται το αρχείο, κι αν έχουν συμβεί λάθη ή αν έχει συναντηθεί το τέλος του αρχείου. Η μόνη δήλωση που χρειάζεται να γίνει για δείκτη αρχείου είναι: FILE *fp; 8

Βήματα για την Προσπέλαση Αρχείων Το πρωτότυπο της fopen() είναι: FILE *fopen(char *name, char *mode); Η κλήση της fopen σε ένα πρόγραμμα είναι: fp = fopen (name, mode); // "r" ανάγνωση, "w" εγγραφή, "a" προσθήκη, "b" δυαδικό Προσοχή: Ο προεπιλεγμένος τύπος αρχείων είναι τα αρχεία κειμένου. π.χ. η εντολή fopen("test.dat", "wb"); ανοίγει για εγγραφή ένα δυαδικό αρχείο, ενώ η εντολή fopen("test1.txt", "w"); ανοίγει για εγγραφή ένα αρχείο κειμένου. Το επόμενο που χρειάζεται είναι ένας τρόπος για την ανάγνωση ή την καταγραφή στο αρχείο όταν αυτό είναι ανοιχτό. Υπάρχουν διάφορες δυνατότητες, από τις απλούστερες είναι οι: getc putc // int getc(file *fp); // int putc(int c, FILE *fp); // EOF για τέλος αρχείου ή λάθος Για φορμαρισμένη είσοδο και έξοδο αρχείων, μπορούν να χρησιμοποιηθούν οι συναρτήσεις: fscanf // int fscanf(file *fp, char *format ); fprintf // int fprintf(file *fp, char *format ); 9

Βήματα για την Προσπέλαση Αρχείων Η αντίστροφη της fopen() είναι η συνάρτηση : int fclose(file *fp); η οποία διακόπτει τη σύνδεση ανάμεσα στο δείκτη αρχείου και το εξωτερικό όνομα που έχει καθοριστεί με την fopen(), ελευθερώνοντας το δείκτη αρχείου. Τα λειτουργικά έχουν όριο στον αριθμό των ταυτόχρονα ανοικτών αρχείων. Σε αρχεία εξόδου αδειάζει την περιοχή ενδιάμεσης αποθήκευσης στην οποία η putc() συλλέγει την έξοδο. Κατά τον κανονικό τερματισμό του προγράμματος, η fclose() καλείται, αυτόματα για όλα τα ανοικτά αρχεία. 10

Ανίχνευση τέλους αρχείου Όταν δεν γνωρίζουμε πόσα στοιχεία περιέχει ένα αρχείο και θέλουμε να διαβάσουμε τα δεδομένα από την αρχή μέχρι το τέλος του, θα πρέπει να ανιχνεύσουμε το τέλος του αρχείου. Όταν διαβάζουμε από ένα αρχείο κειμένου χαρακτήρα προς χαρακτήρα, μπορούμε να ψάξουμε το χαρακτήρα τέλους αρχείου. Η συμβολική σταθερά ΕΟF ως -1 (ή ένα byte όλο άσσους) έχει τιμή που δε χρησιμοποιείται ποτέ από ένα πραγματικό χαρακτήρα. Όταν μία συνάρτηση διαβάσει το ΕΟF από μία ροή κειμένου, τότε ξέρουμε ότι έχουμε φτάσει στο τέλος του αρχείου. while ((c = getc(fp))!= ΕΟF ) Σε μία δυαδική ροή, ένα byte δεδομένων θα μπορούσε να έχει αυτή τη τιμή, γι αυτό μπορούμε να χρησιμοποιήσουμε τη συνάρτηση feof() για δυαδικά αρχεία αλλά και για αρχεία κειμένου. int feof(file *fp); Το όρισμα fp είναι ο δείκτης σε FILE που επιστρέφεται από τη fopen() H feof() επιστρέφει 0 αν δεν συναντήσει το τέλος του αρχείου και μη μηδενική τιμή αν το συναντήσει. Εάν μία κλήση της feof() ανιχνεύσει το τέλος του αρχείου τότε πρέπει ή να κάνουμε rewind(), fseek() ή να κλείσουμε και να ανοίξουμε το αρχείο ξανά. 11

Άλλες συναρτήσεις διαχείρισης αρχείου int remove(const char *filename); Εάν το αρχείο υπάρχει, διαγράφεται και επιστρέφει 0. Αν το αρχείο δεν υπάρχει ή είναι μόνο για ανάγνωση, επιστρέφει -1. int rename(const char *oldname, const char *newname); Επιστρέφει 0 σε επιτυχία. Αν το αρχείο δεν υπάρχει ή υπάρχει ήδη ένα αρχείο με το νέο όνομα ή επιχειρούμε να μετονομάσουμε σε διαφορετικό δίσκο τότε επιστρέφει -1. 12

#include <stdio.h> main(){ FILE *ifp, *ofp; char c; ifp = fopen("test.dat", "r"); ofp = fopen("out.dat", "w"); Παράδειγμα Να γίνει πρόγραμμα το οποίο θα διαβάζει χαρακτήρες από το αρχείο ifp ("test.dat") με getc() και θα τους αντιγράφει στο αρχείο ofp ("out.dat") με putc(). if (ifp == NULL) { printf("can not open input file\n"); return 1; if (ofp == NULL) { printf("can not open output file\n"); return 2; Προσοχή: Πάντα όταν προσπαθούμε να ανοίξουμε ένα αρχείο πρέπει να ελέγχουμε αν το άνοιγμα έγινε επιτυχώς. Σε αντίθετη περίπτωση (π.χ. αν δεν υπάρχει αρχείο με το όνομα που δώσαμε), η fopen επιστρέφει NULL. while((c = getc(ifp))!= EOF) putc(c, ofp); fclose(ifp); fclose(ofp); return 0; 13

Άσκηση: Να γίνει ένα πρόγραμμα που να αντιγράφει ένα αρχείο με κώδικα γραμμένο σε γλώσσα C, σε ένα άλλο αφαιρώντας όλα τα σχόλια (/* */). Θεωρήστε ότι τα σχόλια δεν είναι επάλληλα, δηλαδή φωλιασμένα το ένα μέσα στο άλλο. Συγκρίνετέ το με το πρόγραμμα που κάνει την ίδια δουλειά αντιγράφοντας, όμως, από την στάνταρτ είσοδο (stdin) στην στάνταρτ έξοδο (stdout) 14

#include <stdio.h> // program nocomment #define NO 0 // stdin stdout #define YES 1 #define NC-3 main() { int car, cp=nc, comment=no; printf("\n Δώστε κείμενο (^z για τέλος) :\n"); while ((car=getchar())!=eof) { if (comment==no) { if ((cp=='/')&&(car=='*')) { comment=yes; car=nc; else if (cp!=nc) putchar(cp); else if ((cp=='*')&&(car=='/')) { comment=no; car=nc; cp = car; if ((comment==no)&&(cp!=nc)) putchar(cp); return 0; 15

#include <stdio.h> // program nocomment #define NO 0 // test.c testnc.c #define YES 1 #define NC -3 main() { int car, cp=nc, comment=no; FILE *fps, *fpd; printf("\n ***Copy Files***\n"); if ((fps=fopen("test.c","r"))==null) { printf("\n File not found\n\n"); exit(1); if ((fpd=fopen("testnc.c","w"))==null) { printf("\n File not accessible\n\n"); exit (1); while ((car=getc(fps))!=eof) { if (comment==no) { if ((cp=='/')&&(car=='*')) { comment=yes; car=nc; else if (cp!=nc) putc(cp,fpd); else if ((cp=='*')&&(car=='/')) { comment=no; car=nc; cp = car; if ((comment==no)&&(cp!=nc)) putc(cp,fpd); fclose(fps); fclose(fpd); return 0; 16

Συνοπτικά Ανοίγετε ένα αρχείο πριν επιχειρήσετε να διαβάσετε ή να γράψετε σε αυτό. Πάντοτε να ελέγχετε ότι η πρόσβαση σε ένα αρχείο ήταν σωστή. Κλείνετε όλα τα αρχεία που έχετε ανοίξει και δεν χρειάζεστε πλέον. Για απορίες θα είμαι στο γραφείο μου (Νο 5, παλιό κτήριο), την Τετάρτη 31 Ιανουαρίου 2018 από τις 9:00 έως τις 12:00. Καλό διάβασμα και καλή επιτυχία! 17