τι περιέχει αυτό το κεφάλαιο...
Με την γλώσσα C μπορούμε να κάνουμε πάρα πολλά σχετικά με τα αρχεία μας, όπως να δημιουργήσουμε ένα νέο αρχέιο, να αντιγράψουμε τα περιεχόμενα απο ένα αρχείο σε άλλο και πολλά άλλα!
Τι χρειάζεστε για να δουλέψετε με αρχεία στην C
1. την βιβλιοθήκη, stdlib,
2. τις συναρτήσεις fopen() και fclose() για άνοιγμα και κλείσιμο του αρχείου αντίστοιχα,
3. τρόπους επανάληψης-loop για διάβασμα απο αρχείο,
4. χρήση μιας συνάρτησης που θα σας διαβάζει το κείμενο απο το αρχείο όπως, fscanf() ή fgets().
Τα παραπάνω ήταν ενδεικτικά και δεν είναι ο τρόπος που δουλεύουν όλα τα προγράμματα που έχουν να κάνουν με αρχεία. Απλά για να μπορέσετε να μπείτε λίγο λίγο στο κλίμα με τα αρχεία καλό είναι να τα έχετε στο νού σας! Εξάλου αυτά θα ακολουθήσω σε ολόκληρο τον οδηγό.
Βασική μεθοδολογία για το πως να δουλέψετε
1. δημιουργία μεταβλητών (τύπου FILE *) ΕΝΑ ΓΙΑ ΚΑΘΕ αρχείο που ανοίγετε,
2. άνοιγμα αρχείου με την συνάρτηση fopen(),
3. έλεγχος αν το άνοιγμα του αρχείου έγινε σωστά και εκτύπωση κατάληλου μυνήματος,
4. χρήση ενός while loop για διάβασμα απο το αρχείο. Στην ουσία θα το "σκανάρουμε" και θα παίρνουμε οτι χρειάζόμαστε,
5. χρήση τις συνάρτησης fclose() για κάθε ένα απο τα αρχεία που ανοίξατε για να τα κλείσετε!
Το παρακάτω παράδειγμα,
- ορίζει τον τύπο FILE *
- ανοίγει το αρχείο lala.txt
- ελέγχει αν το άνοιγμα έγινε σωστά,
- διαβάζει κάτι απο το αρχείο και
- το κλείνει!
#include <stdio.h>
#include <stdlib.h>
int main(void){
FILE *infile;
char buf[81];
infile = fopen("lala.txt","r");
if(infile == NULL){
printf("File does not exist.\n");
exit(1);
}
while(fgets(buf, 81, infile) != NULL){
fputs(buf, stdout);
}
fclose(infile);
return 0;
}
Ανάλυση:
Στις δύο πρώτες γραμμές όπως ήδη θα ξέρετε έχουμε προσθήκη των βιβλιοθηκών στο πρόγραμμά μας. Τώρα, εκτός απο την stdio.h που είναι η standard βιβλιοθήκη προσθέτουμε και την stdlib που έχει τις υπόλοιπες συναρτήσεις που θα χρησιμοποιήσουμε. Μετά ακολουθεί ο κώδικας της main σε { }. Μέσα στον κώδικα, έχουμε:
Για να μπορέσεουμε να επεξεργαστούμε αρχεία θα πρέπει να δημιουργήσουμε έναν pointer τύπου FILE *(προσοχή πρέπει να είναι κεφαλάια τα γράμαμτα), Αυτός ο pointer για να καταλάβετε “πολυ απλά” ουσιαστικά συνδέει το πρόγραμμά μας με το αρχείο. Οπότε θα έχουμε FILE * ακολουθούμενο απο ένα όνομα της επιλογής σας. Η επόμενη γραμμή είναι ένας πίνακας χαρακτήρων 81 θέσεων και θα εξηγηθεί αργότερα γιατί δεν μας χρειάζεται τώρα(το 81 είναι τυχαίο!).
Μετά, χρησιμοποιούμε την συνάρτηση fopen() για να “ανοίξουμε” το αρχείο και για να το συνδέσουμε με το πρόγραμμά μας. Αυτό που επιστρέφει η fopen (σκεφτείτε πως είναι το αρχείο) το αποθηκεύει στην μεταβλητή infile που είναι ο pointer που δημιουργήσαμε στην αρχή! Άρα στην ουσία αυτό που επιστρέφει έιναι ένας poiter *.
Οι επόμενες 4 γραμμές είναι προαιρετικές. Αυτό που κάνουν είναι να εξετάζουν αν το “άνοιγμα του αρχείου” έγινε σωστά και να εκτυπώνουν κατάληλο μήνυμα. Καλό είναι να βάζετε αυτόν το έλεγχο, γιατί σε περίπτωηση που κάνετε ένα λάθος με το αρχείο για παράδειγμα και δεν το βρίσκετε δεν θα καταλάβετε τι ακριβώς φταίει. Οι επόμενες 3 γραμμές διαβάζουν το αρχείο , με ένα while loop.
Το διάβασμα ενός αρχείου γίνεται με παραπάνω απο έναν τρόπο. Στην συγκεκριμένη περίπτωση, χρησιμοποιούμε την fgets για να δειαβάσουμε και σταματάμε όταν αυτό που διαβάσουμε είναι NULL που σημαίνει πως είμαστε στο τέλος του αρχείου! Παράλληλα, οτι διαβάσουμε το εκτυπώνουμε στην οθόνη με την fputs.
Και εδώ, μπορούμε να κάνουμε πολλά. Για παράδειγμα θα μπορούσαμε αυτό που διαβάζουμε να το τοποθετήσουμε σε ένα άλλο αρχείο η ακόμη και να το αποθηκεύσουμε σε έναν πίνακα και να το επεξεργαστούμε αργότερα! Επαρερχόμαστε στον κώδικα και αυτό που μένει είναι αν κλείσουμε το αρχείο. Για ακόμη μια φορά, και αυτό είναι προαιρετικό και πιθανώς να σας τρέξει σωστά χωρίς κάν να το γράψετε. Αλλα, το σωστό είναι όταν δεσμεύουμε χώρο με την fopen για να ανοίξουμε ένα αρχείο να τον αποδεσμεύυομε με την fclose.
Ενδεικτικό αρχείο
Κάντε Copy/Paste το παρακάτω κείμενο και αποθηκεύστε το ως “lala.txt“ στον ίδιο φάκελο που είναι και το πρόγραμμά σας.
This file is the lala.txt what everything it says here is not correct! Just to know. I am a big guy that have fun with computer mashines! I like them!!!
Όλα τα παραπάνω ήταν ένα παράδειγμα για το πώς περίπου θα ήταν καλό να χειρίζεστε αρχεία! Ας τα πάρουμε τώρα ένα ένα...
Άνοιγμα Αρχείου
Όταν ανοίγουμε ένα αρχείο σημαίνει πως τα δεδομένα που περιέχει είνα διαθέσιμα για ανάγνωση η γραφή σε κάποιο άλλο αρχείο. Θυμιθείτε πως στην ουσία η C ακόμη και την οθόνη(std. output) την διαχειρίζεται ως ένα αρχείο. Άρα εκτυπώνοντας τα σε κάποιο αρχείο που λέγεται οθόνη μπορούμε να τα δούμε. Στην C η συνάρτηση που μας επιτρέπει το άνοιγμα ενός αρχείο λέγεται fopen(). Ορίζεται ως εξής:
- Κώδικας: Επιλογή όλων
FILE *fopen(const char*filename, const char mode);
Επιστρέφει: Δείκτη τύπου FILE * ή NULL σε περίπτωση που για κάποιον λόγο αποτύχει!
Ορίσματα: Παίρνει δύο ορίσματα, ένα για το αρχείο που θα ανοίξει και το άλλο για το πως θα το ανοίξει. Δηλαδή όταν ανοίξει τι θέλουμε να κάνουμε.
1ο όρισμα;
Το filename μπορεί να είναι ένα όνομα αρχείο όπως file.txt αλλα και ένα path. Με άλλα λόγια αν το αρχείο που θέλουμε να ανοίξουμε είναι στον ίδιο κατάλογο με το πρόγραμμά μας τότε βάζουμε απλά το όνομά του. Σε περίπτωση όμως που βρίσκεται κάπου αλλού τότε θα πρέπει να βάλετε το path. Δηλαδή να γράψετε κάτι σαν:
- Κώδικας: Επιλογή όλων
"/home/user1/Desktop/MyFiles/file.txt"
2ο όρισμα:
Το δεύτερο όρισμα είναι το mod με το οποίο θα το ανοίξετε. Μπορείτε να το ανοίξετε για να διαβάσετε μόνο κάτι, αλλά ίσως θέλετε και να γράψετε κάτι. Ίσως απο την άλλη θέλετε και τα δύο. Παρακάτω μπορείτε να δείτε κάποια mod που πρέπει να βάλετε ανάλογα με το τι θέλετε να κάνετε:
"r" | Ανοίγει ένα υπάρχον αρχείο για διάβασμα |
---|---|
"w" | Δημιουργεί ένα κενό αρχείο για εγγραφή ή εάν υπάρχει ήδη ένα αρχείο με το ίδιο όνομα σβήνει τα περιεχόμενά του και γράφει στο τρέχων αρχείο |
"a" | Κάνει append σε ένα αρχείο που αν δεν υπάρχει δημιουργήται. Αυτό σημαίνει οτι πάει και επεκτείνει το αρχείο αρχίζοντας να γράφει απο το τέλος. Δεν σβήνει κάτι απο τα υπάρχοντα! |
"r+" | Ανοίγει ένα αρχείο για ανάγνωση και εγγραφή. Το αρχείο πρέπει να υπάρχει! |
"w+" | Δημιουργεί ένα αρχείο για εγγραφή και ανάγνωση. Εάν υπάρχει ήδη κάποιο αρχείο με το ίδιο όνομα το περιεχόμενό του διαγράφεται! |
"a+" | Ανοίγει ένα αρχείο για διάβασμα και επέκταση(appending). Όλες οι εγγραφές θα γίνονται στο τέλος του αρχείου και δεν σβήνεται τίποτα! Το αρχεό δημιουργήται αν δεν υπάρχει και να σημειώσω πως μπορούμε να παίξουμε με το πού θα γίνει η εγγραφή σε ένα αρχείο με κατάληλους pointers. |
Συναρτήσεις Εισόδου-Εξόδου
Συγκεκριμένα για τα αρχεία υπάρχουν οι συναρτήσεις fscanf() και fprintf(). Οι συναρτήσεις αυτές είναι παρόμοιες με τις scnaf() και printf() αλλα έχουν και ένα 'f' μπροστά που σημαίνει πως θα γίνει κάτι με αρχεία. Πιο συγκεκριμένα,
Μορφοποιημένη έξοδος αρχείου...
Η fprintf() είναι μια συνάρτηση που περιέχεται στην βιβλιοθήκη stdlib αν δεν κάνω λάθος και ουσιαστικά μπορεί να έχει και την χρήση της printf αλλα μπορεί να κάνει και άλλα. είναι πιό γενική απο την printf και χρησιμοποιείται όπως θα δείτε παρακάτω.
- Κώδικας: Επιλογή όλων
int fprintf(FILE *fp, char *fmt, ...);
Στην ουσία αν το προσέξατε αυτό που αλλάζει έιναι που θα γίνει η έξοδος. Τα ορίσματα 2, 3 υπάρχουν και στην printf(). Απλά εδώ μπορούμε να πούμε οτι, κοίταξε να δείς εγώ θέλω να τα εκτυπώσω στην οθόνη οπότε θα πρέπει αν βάλουμε ως πρώτο όρισμα "stdout". Ακόμη μπορούμε να βάλουμε και ένα αρχείο. Κάτι που ανοίξαμε προηγουμένως. Γενικά μας προσφέρει μεγάλη ευελιξία και καλό είναι να την έχουμε υπόψην μας!
- Κώδικας: Επιλογή όλων
int fscanf(FILE *fp, char *fmt, ...);
Όπως και παραπάνω έτσι και εδώ δεν υπάρχει τεράστια διαφορά με την scnaf απλά, εδώ το πρώτο όρισμα δηλώνει απο που θα διαβάσει. Μπορεί να είναι ένα αρχείο που προηγουμένως ανοίξαμε ή ακόμη και η λέξη "stdin" που υποδηλώνει το πληκτρολόγιο και σημαίνει πως έχουμε μια εντολή ίδια με την scanf. Είναι ακριβώς το ίδιο!
ΣΥΝΕΧΙΖΕΤΑΙ...!!! ΥΠΟΜΟΝΗ!!!