C είσοδος/έξοδος αρχείων

Η γλώσσα προγραμματισμού C παρέχει μια πρότυπη βιβλιοθήκη με συναρτήσεις για προσπέλαση αρχείων. Αυτές οι συναρτήσεις βρίσκονται στο αρχείο επικεφαλίδας <stdio.h> . Αυτή η συλλογή συναρτήσεων προέρχεται από την βιβλιοθήκη "portable I/Ο package" (=φορητή βιβλιοθήκη συναρτήσεων εισόδου/εξόδου) του Mike Lesk από τα εργαστήρια της Bell αρχές της δεκαετίας του 1970 .

Η λειτουργικότητα εισόδου-εξόδου της C είναι χαμηλού επιπέδου συγκρινόμενη με τα σύγχρονες βιβλιοθήκες. Σήμερα οι λειτουργίες προσπέλασης αρχείων γίνεται με αφαιρετικές δομές ροών δεδομένων (bytes) streams εισόδου ή εξόδου. Σε αντίθεση με ορισμένες μεταγενέστερες γλώσσες προγραμματισμού η γλώσσα C δεν έχει απευθείας δυνατότητα τυχαίας προσπέλασης αρχείων δεδομένων. Για να διαβαστεί η πληροφορία στο κέντρο του αρχείου ο προγραμματιστής θα πρέπει να δημιουργήσει μια ροή δεδομένων (stream) και στην συνέχεια να προσπελάσει το σημείο αυτό.

Το μοντέλο με τις ροές δεδομένων για είσοδο/έξοδο αρχείων έχει χρησιμοποιηθεί στο λειτουργικό σύστημα Unix το οποίο έχει υλοποιηθεί σε γλώσσα προγραμματισμού C. Αρκετά σύγχρονα λειτουργικά συστήματα έχουν κληρονομήσει τις ροές δεδομένων του Unix και πολλές γλώσσες προγραμματισμού της κατηγορίας γλωσσών C έχουν κληρονομήσει την διεπαφή ροών δεδομένων της C (για παράδειγμα η γλώσσα σεναρίων PHP). Η γλώσσα προγραμματισμού C++ στην πρότυπη βιβλιοθήκη χρησιμοποιεί την ιδέα της ροής δεδομένων στο συντακτικό των βιβλιοθηκών όπως της iostream.

 Παρουσίαση των συναρτήσεων 
Οι περισσότερες συναρτήσεις της C για είσοδο/έξοδο βρίσκονται ορισμένες στο αρχείο επικεφαλίδας stdio.h (cstdio είναι το αρχείο επικεφαλίδας στην C++).

 Χαρακτήρας τύπουByte Χαρακτήρας τύπουWide Περιγραφή Πρόσβαση αρχείου fopen ανοίγει ένα αρχείο freopen  ανοίγει ένα διαφορετικό αρχείο χρησιμοποιώντας την ίδια ροή δεδομένων (stream) fflush  συγχρονίζει την έξοδο της ροής δεδομένων με το συγκεκριμένο αρχείο που έχει ανοικτεί fclose  κλείσιμο του αρχείου setbuf  ορίζει το ενταμιευτή (buffer) για τη συγκεκριμένη ροή δεδομένων (stream) setvbuf  ορίζει το ενταμιευτή (buffer) και το μέγεθος της συγκεκριμένης ροής δεδομένων fwide  αλλαγή μεταξύ μιας ροής δεδομένων χαρακτήρων wide εισόδου/εξόδου με μια απλή ροή δεδομένων χαρακτήρων byte Κατευθείαν  είσοδος/έξοδος fread  διάβασμα από το αρχείο fwrite  γράψιμο στο αρχείο Μη φορμαρισμένη  είσοδος/έξοδος fgetcgetc  fgetwcgetwc διαβάζει ένα byte/wchar_t από μια ροή αρχείου fgets  fgetws διαβάζει ένα byte/wchar_t συμβολοσειρά (string) από μια ροή αρχείου fputcputc fputwcputwc γράφει ένα byte/wchar_t σε μια ροή αρχείου fputs fputws γράφει ένα byte/wchar_t συμβολοσειρά σε μια ροή αρχείου getchar  getwchar διαβάζει ένα byte/wchar_t από το stdin (προκαθορισμένη είσοδος - πληκτρολόγιο συνήθως) gets  μη-διαθέσιμη διαβάζει μια συμβολοσειρά bytes από το stdin (αμφισβητήθηκε η χρήση στη C99, είναι ξεπερασμένη στη C11) putchar  putwchar γράφει ένα byte/wchar_t στο stdout (προκαθορισμένη έξοδος - συνήθως η οθόνη) puts μη-διαθέσιμη γράφει μια συμβολοσειρά bytes στο stdout ungetc  ungetwc τοποθετεί ένα byte/wchar_t πίσω στη ροή δεδομένων του αρχείου Φορμαρισμένη  είσοδος/έξοδος scanffscanfsscanf wscanffwscanfswscanf διαβάζει την φορμαρισμένη είσοδο byte/wchar_t από την προκαθορισμένη είσοδο,ροή δεδομένων αρχείου ή ενταμιευτή - buffer vscanfvfscanfvsscanf vwscanfvfwscanfvswscanf διαβάζει την φορμαρισμένη είσοδο byte/wchar_t από την προκαθορισμένη είσοδο stdin,ροή δεδομένων αρχείου ή ένα ενταμιευτή - buffer χρησιμοποιώντας μια μεταβλητή λίστα παραμέτρων printffprintfsprintfsnprintf wprintffwprintfswprintf τυπώνει φορμαρισμένη byte/wchar_t έξοδο στην προκαθορισμένη έξοδο stdout,ροή δεδομένων ή ένα ενταμιευτή - buffer vprintfhttp://code-reference.com/c/stdio.h/vfprintf vfprintf]vsprintfvsnprintf vwprintfvfwprintfvswprintf τυπώνει την φορμαρισμένη έξοδο byte/wchar_t στην προκαθορισμένη έξοδο stdout,ροή δεδομένων ή ένα ενταμιευτή - buffer χρησιμοποιώντας μεταβλητή λίστα παραμέτρων Θέση αρχείου ftell επιστρέφει την τωρινή θέση αρχείου fgetpos παίρνει το δείκτη θέσης αρχείου fseek μετακίνηση του δείκτη θέσης αρχείου σε μια συγκεκριμένη τοποθεσία στο αρχείο fsetpos αλλαγή του δείκτη θέσης αρχείου σε μια συγκεκριμένη θέση στο αρχείο  rewind μετακίνηση του δείκτη θέσης αρχείου στην αρχή του αρχείου Διαχείρισηλαθών clearerr καθαρισμό όλων των μηνυμάτων λαθών feof έλεγχος για τέλος αρχείου ferror έλεγχος για σφάλμα αρχείου perror εμφάνισε την συμβολοσειρά που περιγράφει το σφάλμα στην προκαθορισμένη έξοδο λαθών stderr Operations on files [hhttp://code-reference.com/c/stdio.h/remove remove] σβήσιμο ενός αρχείου rename μετονομασία αρχείου tmpfile επιστρέφει ένα δείκτη στο προσωρινό αρχείο tmpnam επιστρέφει ένα μοναδικό όνομα αρχείου

 Σταθερές 
Οι σταθερές οι οποίες είναι ορισμένες στο αρχείο επικεφαλίδας stdio.h περιέχουν:
 Όνομα  ΣημειώσειςEOF  ένας αρνητικός ακέραιος τύπου int ο οποίος χρησιμοποιείται για να δείξει την συνθήκη τέλους αρχείου (end-of-file EOF)BUFSIZ  ένας ακέραιος ο οποίος δείχνει το μέγεθος του ενταμιευτή - buffer ο οποίος χρησιμοποιείται από την συνάρτηση setbuf()FILENAME_MAX  το μέγεθος του πίνακα τύπου char ο οποίος είναι αρκετά μεγάλος για να αποθηκεύσει το κάθε όνομα αρχείου το οποίο δύναται να ανοιχθείFOPEN_MAX  ο αριθμός των αρχείων τα οποία μπορούν να ανοίξουν συγχρόνως - τουλάχιστον 8 πρέπει να είναι η τιμή_IOFBF  συντομογραφία του "input/output fully buffered" (είσοδος/έξοδος συνεχή με χρήση ενταμιευτή-buffer) - είναι ένας ακέραιος αριθμός ο οποίος περνάει ως παράμετρος στην συνάρτηση setvbuf() ώστε να γίνει αίτημα για  block buffered (με μπλοκ ενταμιευτή) εισόδου για μια ανοικτή ροή δεδομένων (stream) _IOLBF  μια συντομογραφία για το "input/output line buffered" (γραμμή εισόδου/εξόδου ενταμιευτή) - είναι ένας ακέραιος αριθμός ο οποίος μπορεί να περάσει ως παράμετρος στη συνάρτηση setvbuf() για να γίνει αίτημα line buffered (γραμμής ενταμιευτή) εισόδου και εξόδου για μια ανοικτή ροή δεδομένων (stream) _IONBF  μια συντομογραφία του "input/output not buffered" (είσοδος/έξοδος χωρίς ενταμιευτή-buffer) - είναι ένας ακέραιος αριθμός ο οποίος μπορεί να περάσει ως παράμετρος στην συνάρτηση setvbuf() για να γίνει αίτημα  unbuffered (χωρίς ενταμιευτή) εισόδου/εξόδου για μια ανοικτή ροή δεδομένων (stream) L_tmpnam  το μέγεθος ενός πίνακα τύπου char ο οποίος είναι αρκετά μεγάλος για να αποθηκεύει το προσωρινό όνομα αρχείου που δημιουργείται από την συνάρτηση tmpnam()NULL   ένα μάκρο σε μια κενή σταθερά "null pointer" - είναι μια σταθερά που αντιπροσωπεύει ένα δείκτη οποίος σε καμία περίπτωση δεν είναι αντικείμενο μέσα στην μνήμη του υπολογιστή SEEK_CUR   ένας ακέραιος ο οποίος μπορεί να περάσει ως παράμετρος στη συνάρτηση fseek() για να γίνει αίτημα σχετικής θέσης στο αρχείο από την τωρινή θέσηSEEK_END  ένας ακέραιος ο οποίος μπορεί να περάσει ως παράμετρος στην συνάρτηση fseek() για να γίνει αίτημα σχετικής θέσης σε σχέση με το τέλος του αρχείουSEEK_SET  ένας ακέραιος ο οποίος μπορεί να περάσει ως παράμετρος στην συνάρτηση fseek() για να γίνει αίτημα σχετικής θέσης σε σχέση με την αρχή του αρχείουTMP_MAX  ο μέγιστος αριθμός μοναδικών ονομάτων που μπορούν να δημιουργηθούν από την συνάρτηση tmpnam() - η τιμή πρέπει να είναι τουλάχιστον 25

 Μεταβλητές 
Οι μεταβλητές οι οποίες ορίζονται στο αρχείο επικεφαλίδας stdio.h περιέχουν:
 Όνομα  Σημειώσειςstdin  ένας δείκτης σε ένα αρχείο FILE το οποίο αναφέρεται στην προκαθορισμένη είσοδο του συστήματός (συνήθως είναι το πληκτρολόγιο).stdout  ένας δείκτης σε ένα αρχείο FILE το οποίο αναφέρεται στην προκαθορισμένη έξοδο του συστήματός (συνήθως είναι το τερματικό της οθόνης). stderr   ένας δείκτης σε ένα αρχείο FILE το οποίο αναφέρεται στην προκαθορισμένη έξοδο σφαλμάτων του συστήματός (συνήθως είναι το τερματικό της οθόνης). 

 Τύποι δομών δεδομένων 
Δομές δεδομένων οι οποίες ορίζονται μέσα στο αρχείο επικεφαλίδας stdio.h περιέχουν:
 FILE - μια δομή δεδομένων η οποία περιέχει πληροφορίες για το αρχείο ή την ροή δεδομένων (κειμένου) που χρειάζεται για να γίνουν οι λειτουργίες εισόδου εξόδου:
 μια περιγραφή του αρχείου
 θέση μέσα της ροής δεδομένων
 επισήμανση τέλους αρχείου (end-of-file)
 επισήμανσης λάθους
 δείκτης στην ροή δεδομένων του buffera
 fpos_t - μια δομή η οποία δεν έχει την μορφή πίνακα η οποία έχει την δυνατότητα να αναγνωρίζονται οι θέσεις του κάθε byte μέσα στο αρχείο.
 size_t - ένας ακέραιος χωρίς πρόσημο (unsigned integer) ο οποίος περιέχει το αποτέλεσμα της συνάρτησης sizeof.

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

#include <stdio.h>
#include <stdlib.h> // για ορισμούς των EXIT_FAILURE και EXIT_SUCCESS

int main(void) {
    char buffer[5] = {0};  /* αρχικοποίηση του πίνακα με μηδενικά */
    int i, rc;
    FILE *fp = fopen("myfile", "rb");

    if (fp == NULL) {
        // το λάθος αυτό παρουσιάζεται όταν δεν υπάρχει το αρχείο myfile
        perror("Λάθος στο άνοιγμα του αρχείου \"myfile\"");
        // το μήνυμα που εμφανίζεται συμπληρωμένο από την perror είναι:
        // "Λάθος στο άνοιγμα του αρχείου "myfile": No such file or directory"
        return EXIT_FAILURE;
    }

    for (i = 0; (rc = getc(fp)) != EOF && i < 5; buffer[i++] = rc) { }

    fclose(fp);

    if (i == 5) {
        puts("Τα παρακάτω bytes διαβάστηκαν...");
        printf("%x %x %x %x %x\n", buffer[0], buffer[1], buffer[2], buffer[3], buffer[4]);
    } 
    else
        // το σφάλμα αυτό παρουσιάζεται όταν το αρχείο είναι μικρότερο από 5 bytes
        fputs("Ένα σφάλμα προέκυψε στο διάβασμα του αρχείου.\n", stderr);

    return EXIT_SUCCESS;
}

Παραπομπές

 Άλλες πηγές 
 stdio.h on Coding Programmer Page / C Library Reference and Examples (en)

Κατηγορία:C