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


Ένα αρχείο για να χρησιμοποιηθεί από ένα πρόγραμμα C πρέπει πρώτα  να aνοιχθεί. Αυτό πραγματοποιείται μέσω της συνάρτησης βιβλιοθήκης fopen().

• Η fopen() παίρνει ως όρισμα το όνομα ενός αρχείου (π.χ. f.txt) και  επιστρέφει έναν δείκτη προς αυτό το αρχείο ο οποίος δείκτης  χρησιμοποιείται από μία πληθώρα άλλων συναρτήσεων για την  ανάγνωση από και εγγραφή δεδομένων προς το αρχείο αυτό.
• Ο δείκτης αυτός ονομάζεται δείκτης σε αρχείο (file pointer) και  δηλώνεται ως εξής:
FILE *fp; /*Ορίζουμε μία μεταβλητή fp τύπου δείκτη σε  αρχείο.*/
• Οι δείκτες αρχείων stdin, stdout, stderr έχουν ήδη δηλωθεί  στο <stdio.h>. Το stdin αναφέρεται στο πληκτρολόγιο και τα stdout,stderr αναφέρονται στην οθόνη.

Συναρτήσεις Επεξεργασίας Αρχείων Κειμένου

Η λειτουργικότητα της fopen() περιγράφεται παρακάτω:
FILE *fopen(char *name, char *mode):
Η συνάρτηση fopen() ανοίγει το αρχείο με όνομα name  σύμφωνα με τον τρόπο που θα το χρησιμοποιήσουμε και που περιγράφεται με το όρισμα mode. Πιθανοί τρόποι είναι  ανάγνωση (“r”), εγγραφή ( “w”) και επέκταση ( “a”).
Αν το αρχείο που ανοίγεται για εγγραφή ή επέκταση δεν  υπάρχει τότε δημιουργείται. Σε περίπτωση λάθους  επιστρέφεται NULL.

• Οι βασικές συναρτήσεις επεξεργασίας αρχείων κειμένου περιγράφονται  αναλυτικά πιο κάτω:
1. int getc(FILE *fp)
Η συνάρτηση αυτή επιστρέφει τον επόμενο χαρακτήρα από το αρχείο  στο οποίο αναφέρεται ο δείκτης fp. Επιστέφει EOF σε περίπτωση τέλους του αρχείου ή λάθους κατά την ανάγνωση.
2. int putc(int c, FILE *fp)
Η συνάρτηση αυτή γράφει το χαρακτήρα c στο αρχείο στο οποίο  αναφέρεται ο δείκτης fp και επιστρέφει το χαρακτήρα που γράφτηκε ή  EOF σε περίπτωση λάθους.
3. int fscanf(FILE *fp, char format, …)
Όμοια με την scanf() με τη διαφορά ότι η ανάγνωση γίνεται από το  αρχείο στο οποία αναφέρεται ο δείκτης fp. Επιστρέφεται EOF σε  περίπτωση λάθους ή τέλος του αρχείου, αλλοιώς επιστρέφεται ο  αριθμός των αντικειμένων στα οποία πραγματοποιήθηκε η ανάγνωση.

1. int fprintf(FILE *fp, char format, …) Ομοια με  την printf() με τη διαφορά ότι η εκτύπωση γίνεται στο  αρχείο στο οποίο αναφέρεται ο δείκτης fp. Επιστρέφεται ένας
αρνητικός αριθμός σε περίπτωση λάθους ή διαφορετικά το  πλήθος των χαρακτήρων που γράφτηκαν στο αρχείο.
2. int fclose(FILE *fp) Το αρχείο κλείνεται και  ελευθερώνεται ο δείκτης fp για επόμενη χρήση.
3. int feof(FILE *fp) Επιστρέφει μη-μηδενική τιμή σε περίπτωση που έχουμε φτάσει στο τέλος του αρχείου στο οποίο αναφέρεται ο δείκτης fp. Διαφορετικά επιστρέφεται μηδέν.

Αρχεία Γενικά (συν)
Σε περίπτωση που θέλουμε να κάνουμε ανάγνωση ή εγγραφή ολόκληρων
γραμμών από ένα αρχείο χρησιμοποιούμε τις συναρτήσεις:
• char *fgets(char *line, int maxline, FILE *fp)
Η συνάρτηση αυτή διαβάζει το πολύ maxline –1 χαρακτήρες από το  αρχείο και τους τοποθετεί στον πίνακα χαρακτήρων line. Αν βρεί πρώτα τον χαρακτήρα newline σταματά και δεν διαβάζει όλους τους maxline –1 χαρακτήρες. Ο χαρακτήρας newline τοποθετείται επίσης στον πίνακα line και το string line τερματίζεται με το
χαρακτήρα ΄´. Η συνάρτηση επιστρέφει το δείκτη line.
Διαφορετικά επιστρέφει την τιμή NULL σε περίπτωση που  βρισκόμαστε στο τέλος του αρχείου ή σε περίπτωση λάθους.
• int *fputs(char *line, FILE *fp) Η συνάρτηση αυτή γράφει  το string line (το οποίο δε χρειάζεται να περιέχει το χαρακτήρα  newline) στο αρχείο που καθορίζεται από το δείκτη fp. Επιστρέφει  έναν μη-αρνητικό αριθμό ή EOF σε περίπτωση λάθους.

Υπενθύμιση. Στη C κάθε ανάθεση, όπως π.χ. η c = getchar()  θεωρείται ως μία έκφραση η οποία έχει τιμή. Η τιμή κάθε  ανάθεσης ως έκφραση ισούται με την τιμή του ΑΡΙΣΤΕΡΟΥ
μέλους μετά την εκτέλεση της ανάθεσης. Δηλαδή, η τιμή της  ανάθεσης c = getchar() είναι η τιμή της μεταβλητής c μετά την  εκτέλεση της ανάθεσης.
• Προσέξτε την παρακάτω συνάρτηση αντιγραφής αρχείων:
void filecopy(FILE *ifp, FILE *ofp){char c; /* μη ασφαλής δήλωση!! */ while ((c = getc(ifp)) != EOF) putc(c, ofp); }

Το παραπάνω πρόγραμμα έχει μία ατέλεια. Σε πολλές αρχιτεκτονικές  ο τύπος char αναφέρεται στην αποθήκευση χαρακτήρων που δίνονται  από το πληκτρολόγιο και αποθηκεύει μόνο θετικές τιμές που  αντιπροσωπεύουν τον κωδικό κάθε χαρακτήρα.
• Η συνάρτηση getc() όμως σε περίπτωση τέλους του αρχείου  επιστρέφει EOF που η τιμή του είναι (συχνά) -1. Η τιμή όμως αυτή δεν  μπορεί να αναπαρασταθεί μέσω του τύπου char (σε ορισμένες πάντα  αρχιτεκτονικές) και συνεπώς η σύγκριση του while ποτέ δεν θα γίνει  αληθής!!!!
• Η παραπάνω υλοποίηση της συνάρτησης θα είναι συνεπώς σε πολλές  αρχιτεκτονικές λάθος.
• Μία ασφαλή υλοποίηση τέτοιων συναρτήσεων πρέπει να χρησιμοποιεί  τη δήλωση μεταβλητών για χαρακτήρες κάνοντας χρήση του τύπου int.Θα ορίζουμε λοιπόν int c; για μία μεταβλητή τύπου χαρακτήρα σε παρόμοιες περιπτώσεις ώστε τα προγράμματά μας να εκτελούνται σωστά σε όλες τις αρχιτεκτονικές.

Παράδειγμα….
• Να γραφεί ένα πρόγραμμα το οποίο παίρνει n ορίσματα (εκτός από το  όνομα του προγράμματος) όλα από τα οποία είναι ονόματα αρχείου και  και κατά την κλήση του αντιγράφει τα n-1 πρώτα αρχεία στο  τελευταίο.ορ.
• Για παράδειγμα αν το πρόγραμμα αυτό λέγεται copy, τότε μία κλήση της  μορφής:

$ copy f1.txt f2.txt f3.txt f4.txt
Θα δημιουργούσε ένα αρχείο f4.txt το οποίο θα είχε ως περιεχόμενα  τα περιεχόμενα των f1.txt, f2.txt και f3.txt μαζί. Οι τυπικές  παράμετροι της συνάρτησης main θα έχουν τιμές:

argc = 5 argv[0] = “copy”
argv[1] = “f1.txt”
argv[2] = “f2.txt”
argv[3] = “f3.txt”
argv[4] = “f4.txt”
argv[5] = “”

#include <stdio.h>
#include <stdlib.h>
int main(int argc, char *argv[]) {
int i, ch;
FILE *inp, *outp;
if (argc < 2) { printf(“Λάθος σύνταξη στη χρήση του προγράμματος …

\n”);exit(1);}

outp = fopen(argv[argc-1], “w”);
for ( i=1; i < argc-1; i++) {inp = fopen(argv[i], “r”);
for (ch=getc(inp); ch != EOF; ch=getc(inp))
putc(ch,outp);
fclose(inp);}
fclose(outp);
printf(“All files copied to %s\n”, argv[argc-1]);
return(0);}

PEEGEE  http://www.cs.ucy.ac.cy/

About sooteris kyritsis

Job title: (f)PHELLOW OF SOPHIA Profession: RESEARCHER Company: ANTHROOPISMOS Favorite quote: "ITS TIME FOR KOSMOPOLITANS(=HELLINES) TO FLY IN SPACE." Interested in: Activity Partners, Friends Fashion: Classic Humor: Friendly Places lived: EN THE HIGHLANDS OF KOSMOS THROUGH THE DARKNESS OF AMENTHE
This entry was posted in Computers and Internet and tagged , , , . Bookmark the permalink.

Leave a Reply

Please log in using one of these methods to post your comment:

WordPress.com Logo

You are commenting using your WordPress.com account. Log Out / Change )

Twitter picture

You are commenting using your Twitter account. Log Out / Change )

Facebook photo

You are commenting using your Facebook account. Log Out / Change )

Google+ photo

You are commenting using your Google+ account. Log Out / Change )

Connecting to %s