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++).

## Σταθερές
Οι σταθερές οι οποίες είναι ορισμένες στο αρχείο επικεφαλίδας `stdio.h` περιέχουν:

## Μεταβλητές
Οι μεταβλητές οι οποίες ορίζονται στο αρχείο επικεφαλίδας `stdio.h` περιέχουν:

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

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


```c
#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