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

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

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

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

Δομές δεδομένων (2) Αλγόριθμοι

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

Ενώσεις δεδομένων Απαριθμητές Ψηφιακοί τελεστές Αναδρομικές συναρτήσεις

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

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

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

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

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

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

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

Πίνακες: μια σύντομη εισαγωγή. Πίνακες χαρακτήρων: τα "Αλφαριθμητικά"

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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)

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

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

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

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

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

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

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

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

ΑΝΤΙΚΕΙΜΕΝΟΣΤΡΑΦΗΣ ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΣ. Ευάγγελος Γ. Ούτσιος Θεόδωρος Γ. Λάντζος Διάλεξη Νο8

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

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

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

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

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

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

Προγραμματισμός Υπολογιστών με C++

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

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

Π. Σταθοπούλου ή Οµάδα Α (Φοιτητές µε µονό αριθµό Μητρώου ) ιδασκαλία : Παρασκευή 11πµ-13µµ ΗΛ7

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

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

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

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

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

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

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

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

Παράδειγµα (2) Πίνακες (Arrays) (2) Πίνακες (Arrays) (1) int num[5];

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

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

Αρχεία εδοµένων. Προγραµµατισµός Ι 1

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

Α' Εξάμηνο ΕΙΣΑΓΩΓΗ ΣΤΟ ΔΟΜΗΜΕΝΟ ΠΡΟΓΡΑΜΜΑΤΙΣΜΟ. Ασκήσεις Επανάληψης

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

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

Η γλώσσα προγραμματισμού C Δομές (structures) στη C

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

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

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

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

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

int a[5]; a[0] a[1] a[2] a[3] a[4] 15/10/2009

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

Υπολογισμός - Συλλογή Δεδομένων - Πίνακες

Σημειώσεις όγδοης εβδομάδας

Κεφάλαιο V: Δομές και ενώσεις. 5.1 Δομές.

Γλώσσα Προγραμματισμού C

Π. Σταθοπούλου ή Οµάδα Α (Φοιτητές µε µονό αριθµό Μητρώου ) ιδασκαλία : Παρασκευή 11πµ-13µµ ΗΛ7

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

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

Οι συναρτήσεις στη γλώσσα C

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

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

Διαδιεργασιακή επικοινωνία (inter-process communication IPC) Προγραμματισμός II 1

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

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

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

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

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

ΕΡΓΑΣΤΗΡΙΟ 1 - ΣΗΜΕΙΩΣΕΙΣ

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

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

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

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

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

Transcript:

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

Αρχεία Το γενικό πλαίσιο: data stream (ρεύμα δεδομένων). stdin, stdout, stderr data stream ως προς τα δεδομένα βάσει προσπέλασης κειμένου σειριακά text files serial access αποθηκευμένα αρχεία δυαδικά binary files.. τυχαίας προσπέλασης random access Αρχεία κειμένου: δεδομένα τύπου char Δυαδικά: δεδομένα όπως ακριβώς αναπαρίστανται στη μνήμη του ΗΥ Τρόπος προσπέλασης:

Δυαδικά Αρχεία Έστω αρχείο κειμένου με τα παρακάτω περιεχόμενα: 123 255 0 209 100 107 91 200 167 Άρα: 10 bytes ανά αριθμό Πιθανός τρόπος δημιουργίας: 3 Χ 10 + 1 = 31 bytes int n1, n2, n3; ανά εγγραφή (το 1 byte για '\n') FILE *f; fprintf(f, "%10d%10d%10d\n", n1, n2, n3); αποθηκεύει ως char, ανεξαρτήτως τύπου! Αποθήκευση στη μνήμη: αριθμητικά ψηφία ως char '12' '3' '2' '5' '5' κενά διαστήματα ως char

Δυαδικά Αρχεία Τι μνήμη καταλαμβάνουν τα ίδια δεδομένα ως int; 123 255 0 209 100 107 91 200 167 int = 4 bytes Και πώς γράφονται/διαβάζονται; 12 bytes = ανά εγγραφή (+1 για '\n', αλλά όχι απαραίτητα) Αποθήκευση στη μνήμη: αριθμοί ως int Απάντηση: fwrite(void *, size_t, int, FILE *); fread (void *, size_t, int, FILE *); 123 255 0 Σύγκρινε: '12' '3' '2' '5' '5'

#include <stdio.h> #include <string.h> Δυαδικά Αρχεία Δημιουργία Εκτέλεση int main(int argc, char **argv) { int n = 0, iarr[3]; char filename[20]; FILE *fp, *gp; % cc bin.c %./a.out test.txt number of records read: 4 % more txt.bin {[][]dk[[][][][][] % strcpy(filename, argv[1]); fp = fopen(filename, "r"); gp = fopen("txt.bin", "wb"); while(fscanf(fp, "%10d%10d%10d\n", iarr,iarr+1,iarr+2) > 0) { fwrite ( iarr, sizeof ( iarr[0] ), 3, gp ); n++; printf("number of records read: %d\n", n); fclose(gp); fclose(fp); return 0;

#include <stdio.h> #include <stdlib.h> int main(int argc, char **argv) { int n, iarr[3]; FILE *fp; n = atoi(argv[1]); fp = fopen("txt.bin", "r"); while(n-- > 0) { Δυαδικά Αρχεία Προσπέλαση fread ( iarr, sizeof ( iarr[0] ), 3, fp ); printf( "%10d%10d%10d\n", iarr[0], iarr[1], iarr[2]); fclose(fp); return 0; Εκτέλεση % cc read.c %./a.out 4 123 255 0 209 100 107 91 200 167 567199 176 224 % Σύγκριση % ls -l test.txt txt.bin -rw-r--r-- 1 brapt users 124 2008-12-01 15:51 test.txt -rw-r--r-- 1 brapt users 48 2008-12-01 18:35 txt.bin %

#include <stdio.h> #include <stdlib.h> int main(int argc, char **argv) { int iarr[3]; FILE *fp; Δυαδικά Αρχεία Προσπέλαση (2) fp = fopen("txt.bin", "r"); while(!feof(fp) ) { fread ( iarr, sizeof ( iarr[0] ), 3, fp ); printf( "%10d%10d%10d\n", iarr[0], iarr[1], iarr[2]); fclose(fp); return 0; Εκτέλεση % cc read.c %./a.out 4 123 255 0 209 100 107 91 200 167 567199 176 224 567199 176 224 % feof αντί EOF Συνήθως, EOF = -1, δηλαδή αποδεκτή τιμή για δυαδικά αρχεία! Σύγκριση % ls -l test.txt txt.bin -rw-r--r-- 1 brapt users 124 2008-12-01 15:51 test.txt -rw-r--r-- 1 brapt users 48 2008-12-01 18:35 txt.bin %

Δυαδικά Αρχεία Συνοψίζοντας Δυαδικά αρχεία : περιέχουν δεδομένα όπως ακριβώς παριστάνονται στη μνήμη (όχι ως χαρακτήρες) Δημιουργία και προσπέλαση: fwrite και fread, αντίστοιχα Μπορεί να καταλαμβάνουν λιγότερη μνήμη από αντίστοιχα κειμένου Αλλά, πρέπει να ξέρουμε ακριβώς τη δομή τους για να τα διαβάσουμε πάλι! Έλεγχος τερματισμού: feof(file *) καλύτερα αντί για EOF

Δομές (struct) Πίνακες: πολλές μεταβλητές ίδιου τύπου Ερώτηση: ομαδοποίηση διαφορετικών τύπων; Π.χ. οντότητα Φοιτητής με εξής ιδιότητες: Αριθμός μητρώου (int) Ονοματεπώνυμο (char) Εξάμηνο (int) Μέσος όρος βαθμών εξαμήνου (float) Οντότητα Πόλη με ιδιότητες: Όνομα πόλης (char) Πληθυσμός της πόλης (int) κλπ Δομές (struct): ομαδοποίηση μεταβλητών διαφορετικού τύπου Επιτρέπουν να ορίσουμε νέους τύπους μεταβλητών

Δομές (struct) Η οντότητα φοιτητής ως δομή Χρήση: struct Student Ορίζουμε μία δομή με όνομα student { και μέλη: int AM; AM, τύπου int, για τον αριθμό μητρώου char *name; name, τύπου char, για το όνομα char *fname; name, τύπου char, για το επώνυμο int semester; semester, τύπου int, για το εξάμηνο float grade; grade, τύπου float, για το μέσο όρο των βαθμών ; τελειώνουμε με ; struct Student = νέος (παράγωγος) τύπος struct Student someone; μπορώ να ορίσω νέες μεταβλητές someone.am = 25; someone.name = "Tade"; someone.fname = "Tadopoulos"; someone.semester = 1; someone.grade = 8.3; struct Student *sptr; sptr = &someone; sptr->αμ = 30; χρήση τελεστή μέλους τελεία (δομή.μέλος) μπορώ να ορίσω και δείκτες σε δομές τελεστής μέλους βέλος για δείκτες σε δομές.

Δομές (struct) Οι παράγωγοι τύποι (δομές, struct) μπορούν να χρησιμοποιηθούν όπως κάθε τύπος. Π.χ. πίνακες struct Student pliroforiki[100]; for(i = 0; i < 100; i++) { printf("\nαριθμός μητρώου : "); scanf("%d", &pliroforiki[i].am); printf("\n;όνομα : "); scanf("%s", pliroforiki[i].name); getchar(); printf("\nεπώνυμo : "); scanf("%s", pliroforiki[i].fname); getchar(); printf("\nεξάμηνο : "); scanf("%d", &pliroforiki[i].semester); printf("\nμέσος όρος : "); scanf("%f", &pliroforiki[i].grade); for(i = 0; i < 100; i++) { printf("\nαριθμός μητρώου : %d", pliroforiki[i].am); printf("\n;όνομα : %s", pliroforiki[i].name); printf("\nεπώνυμo : %s", pliroforiki[i].fname); printf("\nεξάμηνο : %d", pliroforiki[i].semester); printf("\nμέσος όρος : "%f", pliroforiki[i].grade);