You are currently viewing Το πρόγραμμα γράφει κενό αρχείο

Το πρόγραμμα γράφει κενό αρχείο

Σαν νέος προγραμματιστής έχει τύχει πολλές φορές να υλοποιείται ένα πρόγραμμα το οποίο γράφει σε ένα αρχείο και όταν το εκτελείται ή κάποιες φορές όταν τελειώνει η εκτέλεση του, το αρχείο να είναι κενό (Δεδομένα αρχείου).

Το ερώτημα που προκύπτει και θα απαντηθεί παρακάτω είναι το εξής :

Γιατί κατά την εκτέλεση του προγράμματος δεν δημιουργούνται δεδομένα στο αρχείο;

Για το σκοπό της συζήτησής μας θα φέρουμε στο προσκήνιο τη γλώσσα γενικού σκοπού C. Το πλεονέκτημα της C έναντι των άλλων γλωσσών προγραμματισμού είναι ότι μας δίνει δυνατότητες για χαμηλού επιπέδου προγραμματισμό. Έτσι, θα είμαστε πιο κοντά στη μηχανή για να καταλάβουμε την συμπεριφορά της.

Πείραμα (Δεδομένα αρχείου)

Για τα πειράματά μας θα χρησιμοποιηθούν δύο συναρτήσεις:

  1. int open(const char *path, int oflags, mode_t mode);
  2. FILE *fopen(const char *filename, const char *mode);

Η συνάρτηση (1) χρησιμοποιείται για χαμηλού επιπέδου πρόσβασης σε αρχείο ενώ η συνάρτηση (2) ανήκει στην Standard I/O βιβλιοθήκη της C.

Οι βιβλιοθήκες που θα χρησιμοποιηθούν είναι οι εξής

#include  
#include 
#include 
#include 
#include

Για την συνάρτηση (1) ο κώδικας είναι

int main(){
   int out;
   out = open("file.out",O_WRONLY|O_CREAT, S_IRUSR|S_IWUSR);
   for (int i=0; i< 10;i++) {
       write(out,&i,1);
       sleep(2);
   }
   return 0;
}

Για την συνάρτηση (2) ο κώδικας είναι

int main(){
   FILE *out;
   out = fopen("file.out");
   for (int i=0; i< 10;i++) {
       fputc(i,out);
       sleep(2);
   }
   return 0;
}

Τα δύο προγράμματα είναι αρκετά απλά. Τυπώνουν 10 χαρακτήρες με κώδικα ASCII στο διάστημα [0-9] σε αρχείο file.out ανά δύο δευτερόλεπτα.

Εκτέλεση

Αν εκτελέσετε τα δύο τμήματα κώδικα θα διαπιστώσετε ότι κατά την εκτέλεση του πρώτου μπορείτε να δείτε τα δεδομένα του αρχείου. Από την άλλη, αν εκτελέσετε τον δεύτερο τμήμα κώδικα το αρχείο είναι άδειο. Έτσι προκύπτει το εξής υπο-ερώτημα

Ποια είναι η διαφορά των δύο τμημάτων κώδικα;

Η διαφορά οφείλεται στις δύο συναρτήσεις που γράφουν στο αρχείο. Η συνάρτηση write() κάθε φορά που εκτελείται κάνει και μία κλήση συστήματος. Οπότε, η εγγραφή γίνεται κατευθείαν στο αρχείο και έτσι ο κειμενογράφος μπορεί να διαβάσει τα δεδομένα του. Από την άλλη, η συνάρτηση fputc() γράφει τα αποτελέσματα σε μία ενδιάμεση μνήμη (buffer) και όταν κρίνει αυτή απαραίτητο “αδειάζει” τα περιεχόμενά του στο αρχείο (συνήθως όταν γεμίσει ή όταν κληθεί κάποια άλλη συνάρτηση που αναγκάζει το buffer να μεταφέρει τα δεδομένα του στην έξοδο).  Εδώ όμως προκύπτει το εξής υπο ερώτημα

Γιατί να μην χρησιμοποιηθεί η write() έναντι της fputc() ;

Για να δούμε τι πλεονέκτημα έχει η μία μέθοδος έναντι της άλλης ας αυξήσουμε το διάστημα από [0-9] σε [0-999.999] και διαγράφουμε από το κάθε τμήμα κώδικα το sleep. Αν δουλεύετε σε linux μπορείτε να χρησιμοποιήσετε το εργαλείο time για να μετρήσετε το χρόνο του κάθε τμήματος κώδικα. Οι χρόνοι που προκύψανε είναι

write(): 6,9 δευτερόλεπτα
fputc(): 0,075 δευτερόλεπτα

Η write() είναι αρκετά πιο αργή από την fputc() διότι κάθε φορά που εκτελείται γίνεται μία κλήση συστήματος. Να σημειωθεί ότι τα αποτελέσματα των χρόνων σχετίζονται με πολλούς παράγοντες (π.χ πόσες διεργασίες εκτελούνται, προδιαγραφές συστήματος κ.α). Άρα, ενδέχεται να έχετε άλλα αποτελέσματα, αλλά σίγουρα η write() θα είναι πιο αργή από την fputc().

Για περισσότερα νέα επισκεφθείτε το ιστολόγιό μας εδώ!

Αφήστε μια απάντηση