Δήλωση αρχείου |
Το θέμα της διαμορφωμένης εκτύπωσης σε αρχείο αντί στην οθόνη έχει ήδη συζητηθεί εν μέρει στο προηγούμενο κεφάλαιο. Το πρόγραμμα στο αρχείο FORMOUT.C αναπτύσσει το θέμα παραπέρα. Το πρώτο ενδιαφέρον σημείο βρίσκεται στις δηλώσεις του προγράμματος. Πέρα από τις συνηθισμένες δηλώσεις ενός πίνακα 25 χαρακτήρων με όνομα stuff και ενός μετρητή index έχουμε και τη δήλωση ενός δείκτη σε μιά μεταβλητή νέου τύπου, συγκεκριμένα του τύπου FILE. Ο δείκτης αυτός με το όνομα fp περιέχει τη διεύθυνση του απομονωτή ενός αρχείου κειμένου. Ο τύπος FILE ορίζεται στο αρχείο κεφαλή STDIO.H, όπου βρίσκονται και οι δηλώσεις προτύπων των σχετικών συναρτήσεων. Οταν λέμε απομονωτή αρχείου εννοούμε μιά θέση μνήμης η οποία αναλαμβάνει το ρόλο του ενδιαμέσου μεταξύ του προγράμματος από τη μία πλευρά και του λειτουργικού συστήματος ή και της συσκευής δευτερεύουσας μνήμης που διαχειρίζεται το αρχείο, από την άλλη. |
Άνοιγμα αρχείου |
Επομένως γιά να διαχειριστούμε ένα αρχείο πρέπει πρώτα να το δηλώσουμε μέσω ενός δείκτη σε έναν απομονωτή αρχείου. Στη συνέχεια πρέπει να ανοίξουμε το αρχείο. Αυτό σημαίνει ότι πρέπει να συνδέσουμε τον απομονωτή με κάποιο φυσικό όνομα αρχείου όπως αυτό είναι δηλωμένο στο λειτουργικό σύστημα. Η σύνδεση αυτή γίνεται με τη βοήθεια της συνάρτησης fopen. Η συνάρτηση fopen δέχεται δύο παραμέτρους σε μορφή συμβολοσειρών. Η πρώτη παράμετρος είναι το φυσικό όνομα του αρχείου στη μορφή που καθορίζει το λειτουργικό σύστημα. Στη περίπτωση του DOS αυτό σημαίνει οτι η πρώτη συμβολοσειρά έχει τη μορφή ενός ονόματος διαδρομής (pathname). Στη περίπτωσή μας το όνομα διαδρομής είναι ένα απλό όνομα αρχείου, το TENLINES.TXT. Θα μπορούσε φυσικά να είναι σύνθετο ή και μεταβλητό όνομα, δηλαδή η τιμή μιας συμβολοσειράς. Η δεύτερη παράμετρος είναι ένας από τους χαρακτήρες "r", "w", "a", ή τους συνδυασμούς "r+", "w+", "a+" (προσοχή στα διπλά εισαγωγικά). Οι τρείς χαρακτήρες αντιστοιχούν στη χρήση του αρχείου γιά: διάβασμα ("r"), γράψιμο ("w"), επέκταση ("a"). Αν το αρχείο ανοιχτεί γιά διάβασμα σημαίνει οτι πρέπει να υπάρχει ήδη όταν εκτελείται το πρόγραμμα, αλλιοώς έχουμε λάθος. Αν ανοιχθεί γιά γράψιμο ή επέκταση μπορεί είτε να υπάρχει ή να δημιουργηθεί από το πρόγραμμα. Αν το αρχείο ήδη υπάρχει και ανοίξει γιά γράψιμο τα παλιά του περιεχόμενα θα χαθούν ενώ στην επέκταση θα διατηρηθούν και θα γράψουμε στο τέλος του αρχείου. Η πρόσθεση του + μετά από έναν χαρακτήρα σημαίνει οτι επιτρέπεται και η αντίθετη χρήση ταυτόχρονα δηλαδή διάβασμα+γράψιμο, γράψιμο+διαβασμα, επέκταση+διάβασμα. Σε αυτή τη περίπτωση το αρχείο μπρεί να δημιουργηθεί πάντα από το πρόγραμμα. Στο παράδειγμά μας το αρχείο ανοίγεται γιά γράψιμο. Η δήλωση προτύπου της fopen έχει τη μορφή FILE *fopen(char *pathname, char *mode); Εκτός από τις παραμέτρους που ήδη συζητήσαμε διαπιστώνουμε οτι η συνάρτηση επιστρέφει με return την τιμή ενός δείκτη, δηλαδή μιά διεύθυνση, του τύπου FILE. Είναι η διεύθυνση της θέσης μνήμης που παραχώρησε το λειτουργικό σύστημα στον απομονωτή του αρχείου. Επομένως αυτή η διεύθυνση πρέπει να εκχωρηθεί στον δείκτη fp που δηλώθηκε στο πρόγραμμά μας, όπως και γίνεται. Σε περίπτωση ανεπιτυχούς ανοίγματος η fopen επιστρέφει έναν μηδενικό (NULL) δείκτη. Η ακριβής τιμή του μηδενικού δείκτη καθορίζεται στο αρχείο καφαλή STDIO.H. |
Διαμορφωμένο γράψιμο σε αρχείο |
Το γράψιμο στο αρχείο είναι μάλλον απλή υπόθεση. Κατ' αρχή αρχικοποιούμε το πίνακα stuff με μιά συμβολοσειρά μέσω της συνάρτησης strcpy. Στη συνέχεια γράφουμε δέκα αντίγραφα της συμβολοσειράς στο αρχείο με τη βοήθεια μιάς επενάληψης και της συνάρτησης fprinf που ήδη συνατήσαμε. Η δήλωση προτύπου της fprinf είναι int fprintf(FILE *ioptr, char *format_string [, argument...]); Αυτό που ουσιαστικά ενδιαφέρει είναι η πρώτη παράμετρος η οποία μας δίνει τη δυνατότητα να επιλέξουμε αρχείο προς εγγραφή μέσω του δείκτη στον απομονωτή του. Από εδώ μπορεί κανείς να συμπεράνει οτι θα μπορούσαμε να γράψουμε ακόμη και fprintf(stdout,"%s Line number %d\n",stuff,index); αφού τα stdin, stdout και stderr δεν είναι παρά τρείς δείκτες σε παντα δεδομένους απομονωτές αρχείων (που τυχαίνει να είναι συσκευές εισόδου εξόδου). Οι χαρακτήρες ελέγχου είναι ακριβώς οι ίδιοι όπως και στη printf. |
Κλείσιμο αρχείου |
Το κλείσιμο ενός αρχείου γίνεται με τη κλήση της συνάρτησης fclose με μοναδική παράμετρο τον δείκτη του απομονωτή αρχείου. Η δήλωση προτύπου είναι fclose(FILE *ioptr); Στη πράξη, σε απλά προγράμματα όπως το παράδειγμά μας το κλείσιμο ενός αρχείου μάλλον περιττεύει αφού το σύστημα εκτέλεσης κλείνει όλα τα ανοικτά αρχεία με τον τερματισμό του κυρίου προγράμματος. Όμως αποτελεί καλή προγραμματιστική παρακτική να κλείνουμε ρητά τα αρχεία που ανοίγουμε. Σε μεγαλύτερα προγράμματα είναι δυνατό να κλείσουμε ένα αρχείο γιά να το ξανα- ανοίξουμε αργότερα γιά διαφορετική χρήση, ή απλά γιά να μην έχουμε πάρα πολλά ανοικτά αρχεία. Το πρόγραμμα δεν παρέχει κάποιο αποτέλεσμα στην οθόνη αλλά στο αρχείο TENLINES.TXT. Μπορείτε να εκτελέσετε το πρόγραμμα και να δείτε το αποτέλεσμα με αντολές του DOS ή μέσω ανός απλού αρχείου δέσμης. Το κείμενο που θα γραφεί είναι This is an example line. Line number 1 This is an example line. Line number 2 This is an example line. Line number 3 This is an example line. Line number 4 This is an example line. Line number 5 This is an example line. Line number 6 This is an example line. Line number 7 This is an example line. Line number 8 This is an example line. Line number 9 This is an example line. Line number 10 Μην διαγράψετε το αρχείο γιατί θα το χρησιμοποιήσουμε σε επόμενα παραδείγματα. |
![]() |
![]() |
![]() |