C είσοδος/έξοδος αρχείων
Το λήμμα δεν περιέχει πηγές ή αυτές που περιέχει δεν επαρκούν. |
Αυτό το λήμμα χρειάζεται μορφοποίηση ώστε να ανταποκρίνεται στις προδιαγραφές μορφοποίησης της Βικιπαίδειας. |
Η γλώσσα προγραμματισμού C παρέχει μια πρότυπη βιβλιοθήκη με συναρτήσεις για προσπέλαση αρχείων. Αυτές οι συναρτήσεις βρίσκονται στο αρχείο επικεφαλίδας <stdio.h>
[1]. Αυτή η συλλογή συναρτήσεων προέρχεται από την βιβλιοθήκη "portable I/Ο 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;
}
ΠαραπομπέςΕπεξεργασία
- ↑ ISO/IEC 9899:1999 specification (PDF). p. 274, § 7.19.
- ↑ Kernighan, Brian (1984). The UNIX Programming Environment. Englewood Cliffs: Prentice Hall. σελ. 200. Unknown parameter
|coauthors=
ignored (|author=
suggested) (βοήθεια)