
FAQ CConsultez toutes les FAQ
Nombre d'auteurs : 28, nombre de questions : 175, création le 11 janvier 2013
Sommaire→Les entrées/sorties→Entrées/sorties en général
Ces sont des flux ouverts automatiquement à chaque démarrage d'un programme.
- stdin est le flux associé à l'entrée standard du programme (qui est, sur de nombreux systèmes, par défaut le clavier).
- stdout est le flux associé à la sortie standard du programme (qui est, sur de nombreux systèmes, par défaut l'écran).
- stderr est le flux associé à l'erreur standard du programme (qui est, sur de nombreux systèmes, par défaut l'écran).
stdout et stderr sont tout deux des flux de sortie et peuvent s'utiliser avec toutes les fonctions d'écriture de fichiers (fprintf, fputc, etc.).
Les fonctions de sortie ne prenant pas de flux en paramètre (printf, putchar, etc.) travaillent sur stdout.
stdin est un flux d'entrée et peut donc s'utiliser avec toutes les fonctions de lecture de fichiers (fscanf, fgetc, etc.). Les fonctions d'entrée ne prenant
pas de fichier en paramètre (scanf, getchar, etc.) travaillent sur stdin.
Le C connait deux familles de fichiers :
- Les fichiers binaires.
- Les fichiers textes.
La différence entre ces deux types de fichiers réside dans l'interprétation que les fonctions de gestions de fichiers vont faire des données présentes dans le fichiers :
- En mode binaire, aucune interprétation des données n'est effectuée.
- En mode texte, certaines séquences de caractères sont interprétés comme étant une fn de ligne ou une fin de fichier
L'utilisation du spécificateur 'b' dans le mode d'ouverture permet d'indiquer qu'il s'agit d'un fichier binaire et de le traiter comme
tel. Si rien n'est précisé, le fichier est ouvert en mode texte.
N.B. : certains compilateurs ont introduit le spécificateur 't' dans le mode d'ouverture afin d'indiquer qu'il s'agit d'un fichier
texte. Ce spécificateur n'étant pas décrit par la norme, il n'est pas portable et ne doit donc pas être utilisé.
Contrairement à une pratique trop souvent rencontrée, la fonction feof() ne sert pas à détecter la fin d'un fichier mais, lorsqu'une
lecture a échoué, à savoir si cet échec est du à la rencontre de la fin de fichier.
La bonne pratique pour lire intégralement un fichier consiste donc à parcourir le fichier tant qu'aucune erreur de lecture n'est remontée et
d'utiliser ferror et feof pour déterminer, suite à une erreur, la cause de cette erreur.
Le programme suivant compte les octets contenus dans un fichier pour déterminer sa taille.
#include <stdio.h>
int main(void)
{
FILE * fp = fopen("machin.chose", "rb");
if (fp == NULL)
fprintf(stderr, "La fonction fopen a echoue.\n");
else
{
int c;
long taille = 0;
while ((c = fgetc(fp)) != EOF)
{
/* Utilisation du caractere lu. */
/* Dans notre cas, on n'en a rien a faire. */
/* On incremente tout simplement notre compteur. */
taille++;
}
if (feof(fp))
{
printf("Fin de fichier atteinte !\n");
printf("La taille du fichier est : %ld octets.\n", taille);
}
else
{
if (ferror(fp))
printf("Arret du programme en raison d'une erreur de lecture !\n");
}
}
return 0;
}
getc lit le caractère courant sur le flux d'entrée spécifié en paramètre et retourne sa valeur en tant qu'entier (int) car en cas d'échec (c'est-à-dire lorsqu'aucun caractère n'a pu être lu), elle doit retourner une valeur qui ne peut être celle d'un "caractère" valide et cette valeur est représentée par la macro EOF.
wint_t (en quelque sorte "wide integer") est le type qui permet de représenter n'importe quel caractère large ou la valeur WEOF, l'équivalent de EOF pour les fonctions travaillant avec les caractères larges.



