Entrée/sortie de fichier C - C file input/output

Le langage de programmation C fournit de nombreuses fonctions de bibliothèque standard pour l' entrée et la sortie de fichiers . Ces fonctions constituent l'essentiel de l'en - tête de bibliothèque standard C <stdio.h> . La fonctionnalité descend d'un "package d'E/S portable" écrit par Mike Lesk chez Bell Labs au début des années 1970, et est officiellement devenu une partie du système d' exploitation Unix dans la version 7 .

La fonctionnalité d'E/S de C est de niveau assez bas par rapport aux normes modernes ; C résume toutes les opérations de fichier en opérations sur des flux d' octets , qui peuvent être des "flux d'entrée" ou des "flux de sortie". Contrairement à certains langages de programmation antérieurs, C ne prend pas directement en charge les fichiers de données à accès aléatoire ; pour lire à partir d'un enregistrement au milieu d'un fichier, le programmeur doit créer un flux, chercher au milieu du fichier, puis lire les octets en séquence à partir du flux.

Le modèle de flux d'E/S de fichiers a été popularisé par Unix, qui a été développé en même temps que le langage de programmation C lui-même. La grande majorité des systèmes d'exploitation modernes ont hérité des flux d'Unix, et de nombreux langages de la famille des langages de programmation C ont hérité de l'interface d'E/S de fichiers C avec peu ou pas de changements (par exemple, PHP ).

Aperçu

Cette bibliothèque utilise ce qu'on appelle des flux pour fonctionner avec des périphériques physiques tels que des claviers, des imprimantes, des terminaux ou avec tout autre type de fichiers pris en charge par le système. Les flux sont une abstraction pour interagir avec ceux-ci de manière uniforme. Tous les flux ont des propriétés similaires indépendamment des caractéristiques individuelles du support physique auquel ils sont associés.

Les fonctions

La plupart des fonctions d'entrée/sortie du fichier C sont définies dans <stdio.h> (ou dans l'en-tête C++ cstdio , qui contient la fonctionnalité C standard mais dans l' espace de noms std ).


Caractère d' octet

Caractère large
La description
Accès aux fichiers ouvrir Ouvre un fichier (avec un nom de fichier non Unicode sous Windows et éventuellement un nom de fichier UTF-8 sous Linux)
libre Ouvre un fichier différent avec un flux existant
chasser Synchronise un flux de sortie avec le fichier réel
fermer Ferme un fichier
setbuf Définit le tampon pour un flux de fichiers
setvbuf Définit le tampon et sa taille pour un flux de fichiers
large Bascule un flux de fichiers entre les E/S à caractères larges et les E/S à caractères étroits

Entrée/sortie directe
peur Lit à partir d'un fichier
fécrire Écrit dans un fichier

Entrée/sortie non formatée
fgetc
getc
fgetwc
getwc
Lit un octet/ wchar_t à partir d'un flux de fichiers
fgets fgetws Lit une ligne byte/ wchar_t à partir d'un flux de fichiers
fputc
putc
putwc
putwc
Écrit un octet/ wchar_t dans un flux de fichiers
fputs fputws Écrit une chaîne d' octets/ wchar_t dans un flux de fichiers
obtenirchar getwchar Lit un octet/ wchar_t à partir de stdin
obtient N / A Lit une chaîne d'octets à partir de stdin jusqu'à ce qu'une nouvelle ligne ou une fin de fichier soit rencontrée (obsolète en C99, supprimée de C11)
putchar putwchar Écrit un octet/ wchar_t sur stdout
met N / A Écrit une chaîne d'octets sur stdout
ungetc ungetwc Remet un octet/ wchar_t dans un flux de fichiers

Entrée/sortie formatée
scanf
fscanf
sscanf
wscanf
fwscanf
swscanf
Lit l' entrée byte/ wchar_t formatée à partir de stdin, d'
un flux de fichier ou d'un tampon
vscanf
vfscanf
vsscanf
vwscanf
vfwscanf
vswscanf
Lit l'octet d'entrée formaté/ wchar_t à partir de stdin, d'
un flux de fichier ou d'un tampon à l'aide d'une liste d'arguments variables
printf
fprintf
sprintf
snprintf
wprintf
fwprintf
swprintf
Imprime la sortie formatée byte/ wchar_t vers stdout,
un flux de fichier ou un tampon
vprintf
vfprintf
vsprintf
vsnprintf
vwprintf
vfwprintf
vswprintf
Imprime la sortie byte/ wchar_t formatée vers stdout,
un flux de fichiers ou un tampon à l'aide d'une liste d'arguments variables
erreur N / A Écrit une description de l' erreur actuelle dans stderr
Positionnement du fichier ftell
ftello
Renvoie l'indicateur de position actuelle du fichier
fseek
fseeko
Déplace l'indicateur de position de fichier vers un emplacement spécifique dans un fichier
fgetpos Obtient l'indicateur de position du fichier
fsetpos Déplace l'indicateur de position de fichier vers un emplacement spécifique dans un fichier
rembobiner Déplace l'indicateur de position de fichier au début d'un fichier

Gestion des erreurs
plus clair Efface les erreurs
feof Vérifie la fin du fichier
la peur Recherche une erreur de fichier
Opérations
sur les fichiers
supprimer Efface un fichier
Renommer Renomme un fichier
fichier tmp Renvoie un pointeur vers un fichier temporaire
tmpnam Renvoie un nom de fichier unique

Constantes

Les constantes définies dans l'en- tête <stdio.h> incluent :

Nom Remarques
FEO Un entier négatif de type int utilisé pour indiquer les conditions de fin de fichier
BUFSIZ Un entier qui correspond à la taille de la mémoire tampon utilisée par la setbuf () fonction
FILENAME_MAX La taille d'un omble tableau qui est assez grand pour stocker le nom d'un fichier qui peut être ouvert
FOPEN_MAX Le nombre de fichiers pouvant être ouverts simultanément ; aura au moins huit
_IOFBF Une abréviation pour « entrée/sortie entièrement tamponnée » ; il s'agit d'un entier qui peut être passé à la fonction setvbuf() pour demander une entrée et une sortie tamponnées par bloc pour un flux ouvert
_IOLBF Une abréviation pour "ligne d'entrée/sortie tamponnée" ; c'est un entier qui peut être passé à la fonction setvbuf() pour demander une entrée et une sortie en tampon de ligne pour un flux ouvert
_IONBF Une abréviation pour « input/output not buffered » ; il est un nombre entier qui peut être transmise à la setvbuf () fonction de la demande sans tampon d' entrée et de sortie pour un flux ouvert
L_tmpnam La taille d'une carbonisation réseau qui est assez grande pour stocker un nom de fichier temporaire généré par le tmpnam () fonction
NUL Une macro qui s'étend jusqu'à la constante de pointeur nul ; c'est-à-dire une constante représentant une valeur de pointeur qui est garantie de ne pas être une adresse valide d'un objet en mémoire
SEEK_CUR Un entier qui peut être passé à la fonction fseek() pour demander un positionnement par rapport à la position actuelle du fichier
SEEK_END Un entier qui peut être passé à la fonction fseek() pour demander un positionnement par rapport à la fin du fichier
SEEK_SET Un entier qui peut être passé à la fonction fseek() pour demander un positionnement par rapport au début du fichier
TMP_MAX Le nombre maximum de noms de fichiers uniques pouvant être générés par la fonction tmpnam() ; aura au moins 25 ans

Variables

Stdstreams-notitle.svg

Les variables définies dans l'en- tête <stdio.h> incluent :

Nom Remarques
standard Un pointeur vers un FICHIER qui fait référence au flux d'entrée standard, généralement un clavier.
sortie standard Un pointeur vers un FICHIER qui fait référence au flux de sortie standard, généralement un terminal d'affichage.
stderr Un pointeur vers un FICHIER qui fait référence au flux d'erreur standard, souvent un terminal d'affichage.

Types de membres

Les types de données définis dans l'en- tête <stdio.h> incluent :

  • FICHIER – également connu sous le nom dedescripteur de fichier , il s'agit d'un type opaque contenant les informations sur un fichier ou un flux de texte nécessaires pour effectuer des opérations d'entrée ou de sortie sur celui-ci, notamment :
    • identifiant spécifique à la plate-forme du périphérique d'E/S associé, tel qu'un descripteur de fichier
    • le tampon
    • indicateur d'orientation du flux (non défini, étroit ou large)
    • indicateur d'état de mise en mémoire tampon de flux (sans tampon, ligne en mémoire tampon, entièrement en mémoire tampon)
    • Indicateur de mode d'E/S (flux d'entrée, flux de sortie ou flux de mise à jour)
    • indicateur de mode binaire/texte
    • indicateur de fin de fichier
    • indicateur d'erreur
    • la position actuelle du flux et l'état de conversion multi-octets (un objet de type mbstate_t)
    • serrure réentrante (obligatoire à partir de C11 )
  • fpos_t - un type non tableau capable d'identifier de manière unique la position de chaque octet dans un fichier et chaque état de conversion qui peut se produire dans tous les codages de caractères multi-octets pris en charge
  • size_t – un type entier non signé qui est le type du résultat de l' opérateur sizeof .

Rallonges

Le standard POSIX définit plusieurs extensions à stdio dans ses définitions de base, parmi lesquelles une fonction readline qui alloue de la mémoire, les fonctions fileno et fdopen qui établissent le lien entre les objets FILE et les descripteurs de fichiers , et un groupe de fonctions pour créer des objets FILE qui font référence aux tampons en mémoire.

Exemple

Le programme C suivant ouvre un fichier binaire appelé myfile , en lit cinq octets, puis ferme le fichier.

#include <stdio.h>
#include <stdlib.h>

int main(void) {
    char buffer[5];
    FILE* fp = fopen("myfile", "rb");

    if (fp == NULL) {
        perror("Failed to open file \"myfile\"");
        return EXIT_FAILURE;
    }

    for (int i = 0; i < 5; i++) {
        int rc = getc(fp);
        if (rc == EOF) {
            fputs("An error occurred while reading the file.\n", stderr);
            return EXIT_FAILURE;
        }
        
        buffer[i] = rc;
    }

    fclose(fp);

    printf("The bytes read were... %x %x %x %x %x\n", buffer[0], buffer[1],
        buffer[2], buffer[3], buffer[4]);

    return EXIT_SUCCESS;
}

Alternatives à stdio

Plusieurs alternatives à stdio ont été développées. Parmi celles-ci se trouve la bibliothèque C++ iostream , qui fait partie de la norme ISO C++ . ISO C++ nécessite toujours la fonctionnalité stdio .

D'autres alternatives incluent la bibliothèque SFIO (A Safe/Fast I/O Library) d' AT&T Bell Laboratories . Cette bibliothèque, introduite en 1991, visait à éviter les incohérences, les pratiques dangereuses et les inefficacités dans la conception de stdio . Parmi ses fonctionnalités, il y a la possibilité d'insérer des fonctions de rappel dans un flux pour personnaliser la gestion des données lues ou écrites dans le flux. Il est sorti dans le monde extérieur en 1997, et la dernière sortie date du 1er février 2005.

Voir également

Les références

Liens externes