Contia

Η τάση για διαδίκτυο

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

data file

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

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

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

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

Για το σκοπό της συζήτησής μας θα φέρουμε στο προσκήνιο τη γλώσσα γενικού σκοπού 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().


Leave a Reply

Προσφατα αρθρα

Κατηγοριες Αρθρων

Αρθρα – Ημερολογιακα

Καντε μια δωρεα

Βοηθήστε μας να βελτιώσουμε το ιστολόγιό μας. Αν τα άρθρα μας ανήκουν στα ενδιαφέροντά σας, κάντε την προσφορά σας
1,00
Προσωπικές Πληροφορίες

Συνολική Δωρεά 1,00€