Section courante

A propos

Section administrative du site

Entrée/sortie standard

Les fonctions d'entrées/sorties standard sont utilisées par les programmes pour accéder aux fichiers et aux périphériques. Ils sont compatibles avec leurs homologues UNIX, à quelques exceptions près. Les exceptions concernent l'ajout de données aux fichiers et le positionnement des fichiers par rapport à leur fin. Ces fonctions fournissent aux programmes un accès pratique et efficace aux fichiers et aux périphériques. Lors de l'accès aux fichiers, les fonctions tamponnent les données du fichier : c'est-à-dire gèrent le blocage et le déblocage des données du fichier. Ainsi, le programme de l'utilisateur peut se concentrer sur ses propres préoccupations. Pour les programmes exécutant leur propre tampon de fichiers, un autre ensemble de fonctions est fourni.

Ouverture de fichiers et de périphériques

Avant qu'un programme puisse accéder à un fichier ou à un périphérique, il doit être ouvert et, une fois le traitement terminé, il doit être fermé. Un périphérique ou fichier ouvert est appelé flux de données et est associé à un pointeur, appelé pointeur de fichier, vers une structure de type FILE. Cette situation identifie le fichier ou le périphérique lorsque des fonctions d'entrée/sortie standard sont appelées pour y accéder. Il existe deux façons d'ouvrir un fichier ou un périphérique pour les entrées/sorties standard : d'abord, le programme peut l'ouvrir explicitement, en appelant l'une des fonctions fopen, freopen ou fdopen. Dans ce cas, la fonction open renvoie le pointeur de fichier associé au fichier ou au périphérique. La fonction fopen ouvre simplement le fichier ou le périphérique. La fonction freopen rouvre un flux de données ouvert vers un autre fichier ou périphérique : il est principalement utilisé pour modifier le fichier ou le périphérique associé à l'un des périphériques logiques en sortie standard, en entrée standard ou en erreur standard. La fonction fdopen ouvre pour les entrées/sorties standard un fichier ou un périphérique déjà ouvert pour les entrées/sorties sans tampon. Alternativement, le fichier ou le périphérique peut être automatiquement ouvert comme l'un des périphériques logiques d'entrée standard, de sortie standard ou d'erreur standard. Dans ce cas, le pointeur de fichier est respectivement stdin, stdout ou stderr. Ces symboles sont définis dans le fichier d'entête stdio.h.

Fermer les flux de données

Un fichier ou un périphérique ouvert pour les entrées/sorties standard peut être fermé de deux manières : premièrement, le programme peut le fermer explicitement en appelant la fonction fclose. Alternativement, lorsque le programme se termine, soit en tombant la fin de la fonction main, soit en appelant la fonction exit, le système fermera automatiquement tous les flux de données ouverts. Laisser le système fermer automatiquement les flux de données ouverts est sujet aux erreurs : les données écrites dans des fichiers à l'aide des fonctions d'entrées/sorties standard sont mises en mémoire tampon et un tampon n'est pas écrit dans le fichier tant qu'il n'est pas plein ou que le fichier n'est pas fermé. Très probablement, lorsqu'un programme termine l'écriture dans un fichier, la mémoire tampon du fichier sera partiellement pleine, ces informations n'ayant pas été écrites dans le fichier. Si un programme appelle fclose, cette fonction écrira le tampon partiellement rempli dans le fichier et retournera un code d'erreur si cela n'a pas pu être fait. Si le programme permet au système de fermer automatiquement le fichier, le programme ne saura pas si une erreur s'est produite lors de cette dernière opération d'écriture.

Entrées/sorties séquentielles

Les fichiers sont accessibles de manière séquentielle et aléatoire. Pour un accès séquentiel, émettez simplement des appels répétés de lecture ou d'écriture; chaque appel transfère les données à partir de la position actuelle du fichier, et met à jour la position actuelle sur l'octet suivant le dernier octet transféré. Lorsqu'un fichier est ouvert, sa position actuelle est mise à zéro, s'il est ouvert pour un accès en lecture ou en écriture, et à sa fin s'il est ouvert pour l'ajout. Sur les systèmes ne gardant pas trace du dernier caractère écrit dans un fichier, comme CP/M et Apple DOS, tous les fichiers ne peuvent pas être correctement positionnés pour ajouter des données.

Entrée/sortie aléatoires

La fonction fseek permet d'accéder à un fichier de manière aléatoire, en modifiant sa position actuelle. Le positionnement peut être relatif au début, à la position actuelle ou à la fin du fichier. Pour les systèmes ne gardant pas trace du dernier caractère écrit dans un fichier, comme CP/M et Apple DOS, le positionnement par rapport à la fin d'un fichier ne peut pas toujours être effectué correctement.

Tampon

Lorsque les fonctions d'entrée/sortie standard sont utilisées pour accéder à un fichier, les entrées/sorties sont mises en mémoire tampon. Un tampon spécifié par l'utilisateur ou alloué dynamiquement peut être utilisé. Le programme de l'utilisateur spécifie un tampon de 1024 octets à utiliser pour un fichier en appelant la fonction setbuf après l'ouverture du fichier mais avant que la première demande d'entrées/sorties ne lui ait été faite. Si, lorsque la première demande d'entrée/sortie est faite à un fichier, l'utilisateur n'a pas spécifié le tampon à utiliser pour le fichier, le système allouera automatiquement, en appelant malloc, un tampon de 1024 octets pour celui-ci. Lorsque le fichier est fermé, sa mémoire tampon sera libérée, en appelant la fonction free. Les tampons alloués dynamiquement sont obtenus à partir d'une région dans la mémoire de tas, qu'ils soient demandés par les fonctions d'entrées/sorties standard ou par le programme de l'utilisateur. Un programme accédant à la fois aux fichiers en utilisant des fonctions d'entrée/sortie standard et possédant des recouvrements doit prendre des mesures spéciales pour s'assurer qu'un recouvrement ne sera pas chargée sur un tampon alloué dynamiquement pour les entrées/sorties de fichiers. Par défaut, la sortie vers la console à l'aide des fonctions d'entrée/sortie standard n'est pas mise en tampon. Toutes les autres entrées/sorties de périphérique utilisant les fonctions d'entrées/sorties standard sont mises en tampon. La mise en mémoire tampon des entrées de la console peut être désactivée à l'aide de la fonction ioctl. La mise en mémoire tampon des entrées/sorties standard sur d'autres périphériques peut être désactivée à l'aide de la fonction setbuf.

Erreurs

Il existe trois champs pouvant être définis lorsqu'une condition exceptionnelle se produit pendant les entrées/sorties de flux de données. Deux des champs sont uniques à chaque flux de données (c'est-à-dire que chaque flux de données a sa propre paire). L'autre est un entier global. L'un des champs associés à un flux est défini si la fin du fichier est détectée à l'entrée du flux de données de l'autre est défini si une erreur se produit lors des entrées/sorties du flux de données. Une fois définis pour un flux de données, ces indicateurs restent définis jusqu'à ce que le flux de données soit fermé ou que le programme appelle la fonction clearerr pour le flux de données. La seule exception à la dernière instruction est que lorsqu'elle est appelée, fseek réinitialisera l'indicateur de fin de fichier pour un flux de données. Un programme peut vérifier l'état des indicateurs eof et d'erreur pour un flux de données en appelant respectivement les fonctions feof et ferror. L'autre champ pouvant être défini est l'entier global errno. Par convention, une fonction système renvoyant un état d'erreur comme sa valeur peut également définir un code dans errno définissant plus complètement l'erreur. Si une erreur se produit lors de l'accès à un flux de données, une fonction d'entrée/sortie standard renvoie EOF(-1) comme valeur, après avoir défini un code dans errno et défini l'indicateur d'erreur du flux de données.

Si la fin du fichier est atteinte sur un flux d'entrée, une fonction d'entrée/sortie standard renvoie EOF après avoir défini l'indicateur eof du flux de données. Un programme peut utiliser deux techniques pour détecter les erreurs lors des entrées/sorties de flux de données. Tout d'abord, le programme peut vérifier le résultat de chaque appel d'entrée/sortie. Deuxièmement, le programme peut émettre des appels d'entrées/sorties et ne vérifier que périodiquement les erreurs (par exemple, ne vérifier qu'une fois toutes les entrées/sorties terminées). En entrée, un programme vérifie généralement le résultat de chaque opération. Lors de la sortie dans un fichier, un programme peut utiliser l'une ou l'autre des techniques de vérification des erreurs; cependant, une vérification périodique en appelant ferror est plus efficace. Lorsque des caractères sont écrits dans un fichier à l'aide des fonctions d'entrée/sortie standard, ils sont placés dans une mémoire tampon, n'étant pas écrite sur le disque tant qu'elle n'est pas pleine. Si le tampon n'est pas plein, la fonction retournera un bon état. Il ne retournera un état incorrect que si la mémoire tampon était pleine et qu'une erreur s'est produite lors de son écriture sur le disque. Comme la taille de la mémoire tampon est de 1024 octets, la plupart des appels d'écriture renverront un bon état, et par conséquent, la vérification périodique des erreurs est suffisante et la plus efficace. Une fois qu'un fichier ouvert pour les entrées/sorties standard est fermé, la fonction ferror ne peut pas être utilisé pour déterminer si une erreur s'est produite lors de l'écriture. Par conséquent, la fonction ferror doit être appelé une fois que toutes les écritures dans le fichier sont terminées, mais avant la fermeture du fichier. Le fichier doit être explicitement fermé par fclose, et sa valeur de retour vérifiée, plutôt que de laisser le système le fermer automatiquement, pour savoir de manière positive si une erreur s'est produite lors de l'écriture dans le fichier. La raison en est que lorsque l'écriture dans le fichier est terminée, son tampon d'entrée/sortie standard sera probablement partiellement plein. Ce tampon sera écrit dans le fichier lorsque le fichier est fermé et fclose retournera un état d'erreur si cette opération d'écriture finale échoue.

Les fonctions d'entrées/sorties standard

Les fonctions d'entrées/sorties standard peuvent être regroupées en deux ensembles : celles pouvant accéder uniquement à l'entrée standard, à la sortie standard et à l'erreur standard des périphériques logiques; et tout le reste. Voici les fonctions d'entrées/sorties standard ne pouvant accéder qu'à stdin, stdout et stderr. Ce sont toutes des fonctions ASCII; autrement dit, ils s'attendent à ne traiter que des caractères de texte :

Nom Description
getchar Obtenir un caractère ASCII de stdin.
gets Obtenir une ligne de caractères ASCII à partir de stdin.
printf Formater les données et les envoyer à stdout.
puterr Envoyer un caractère à stderr.
putchar Envoyer un caractère à stdout.
puts Envoyer une chaîne de caractères à stdout.
scanf Obtenir une ligne de stdin et la convertir.

Voici le reste des fonctions d'entrées/sorties standard :

Nom Description
agetc Obtenir un caractère ASCII.
aputc Envoyer un caractère ASCII.
fopen Ouvrir un fichier ou un périphérique.
fdopen Ouvrir en tant que flux de données d'un fichier ou d'un périphérique déjà ouvert pour des entrées/sorties sans tampon.
freopen Ouvrir un flux de données ouvert vers un autre fichier ou périphérique.
fclose Fermer un flux de données ouvert.
feof Vérifier la fin du fichier sur un flux de données.
ferror Rechercher une erreur sur un flux de données.
fileno Obtenir le descripteur de fichier associé au flux de données.
fflush Écrire le tampon du flux de données.
fgets Obtenir une ligne de caractères ASCII.
fprintf Formater les données et les écrire dans un flux de données.
fputs Envoyer une chaîne de caractères ASCII à un flux de données.
fread Lire des données binaires.
fscanf Obtenir des données et les convertir.
fseek Définir la position actuelle dans un fichier.
ftell Obtenir la position actuelle.
fwrite Écrire des données binaires.
getc Obtenir un caractère binaire.
getw Obtenir deux caractères binaires.
putc Envoyer un caractère binaire.
putw Envoyer deux caractères binaires.
setbuf Spécifier le tampon pour le flux de données.
ungetc Repousser le caractères dans le flux de données.


Dernière mise à jour : Dimanche, le 15 octobre 2017