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

Από τη Βικιπαίδεια, την ελεύθερη εγκυκλοπαίδεια
Μετάβαση σε: πλοήγηση, αναζήτηση

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

Η λειτουργικότητα εισόδου-εξόδου της 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 γράψιμο στο αρχείο
Μη φορμαρισμένη
είσοδος/έξοδος
fgetc
getc
fgetwc
getwc
διαβάζει ένα byte/wchar_t από μια ροή αρχείου
fgets fgetws διαβάζει ένα byte/wchar_t συμβολοσειρά (string) από μια ροή αρχείου
fputc
putc
fputwc
putwc
γράφει ένα 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 πίσω στη ροή δεδομένων του αρχείου
Φορμαρισμένη
είσοδος/έξοδος
scanf
fscanf
sscanf
wscanf
fwscanf
swscanf
διαβάζει την φορμαρισμένη είσοδο byte/wchar_t από την προκαθορισμένη είσοδο,
ροή δεδομένων αρχείου ή ενταμιευτή - buffer
vscanf
vfscanf
vsscanf
vwscanf
vfwscanf
vswscanf
διαβάζει την φορμαρισμένη είσοδο byte/wchar_t από την προκαθορισμένη είσοδο stdin,
ροή δεδομένων αρχείου ή ένα ενταμιευτή - buffer χρησιμοποιώντας μια μεταβλητή λίστα παραμέτρων
printf
fprintf
sprintf
snprintf
wprintf
fwprintf
swprintf
τυπώνει φορμαρισμένη byte/wchar_t έξοδο στην προκαθορισμένη έξοδο stdout,
ροή δεδομένων ή ένα ενταμιευτή - buffer
vprintf
http://code-reference.com/c/stdio.h/vfprintf vfprintf]
vsprintf
vsnprintf
vwprintf
vfwprintf
vswprintf
τυπώνει την φορμαρισμένη έξοδο 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;
}

Παραπομπές[Επεξεργασία | επεξεργασία κώδικα]

  1. ISO/IEC 9899:1999 specification. p. 274, § 7.19. http://www.open-std.org/jtc1/sc22/wg14/www/docs/n1124.pdf. 
  2. Kernighan, Brian; Rob Pike (1984). The UNIX Programming Environment. Englewood Cliffs: Prentice Hall. σελ. 200. 
Στο λήμμα αυτό έχει ενσωματωθεί κείμενο από το λήμμα C file input/output της Αγγλόγλωσσης Βικιπαίδειας, η οποία διανέμεται υπό την GNU FDL και την CC-BY-SA 3.0. (ιστορικό/συντάκτες).

Άλλες πηγές[Επεξεργασία | επεξεργασία κώδικα]