« Programmation C/Entrées/sorties » : différence entre les versions

Contenu supprimé Contenu ajouté
→‎Entrées non formatées : utilisation de fgetc dans saisie_chaine
→‎Entrées non formatées : traitement d'erreur avec errno
Ligne 468 :
</source>
 
La fonction <code>fgets()</code> permet de saisir une ligne complète dans la zone mémoire spécifiée, en évitant tout débordement. Si la ligne peut être contenue dans le bloc, elle contiendra le caractère de saut de ligne (<code>'\n'</code>), en plus du caractère nul. Dans le cas contraire, la ligne sera tronquée, et la suite de la ligne sera obtenue à l'appel suivant. Si la fonction a pu lire au moins un caractère, elle retournera la chaine transmise en premier argument, ou <code>NULL</code> s'il n'y a plus rien à lire. VoiciUn une manièreexemple de lirelecture unede ligne arbitrairement longue :est vu plus bas.
 
La fonction <code>fgetc()</code> permet de ne saisir qu'un caractère depuis le flux spécifié. À noter que la fonction renvoie bien un entier de type <code>int</code> et non de type <code>char</code>, car en cas d'erreur (y compris la fin de fichier), cette fonction renvoie <code>EOF</code> (défini à -1 en général).
 
<source lang="c">
Ligne 474 ⟶ 476 :
#include <stdlib.h>
#include <string.h>
#include <errno.h>
 
/**
char *saisie_chaine(FILE *flux)
* lire_ligne tente de lire une ligne entiere depuis le flux.
* Le '\n' final est enlevé.
*
* Si une erreur intervient au début de la lecture,
* la fonction renvoie NULL et place errno à 1.
*
* Si une erreur intervient après qu'au moins un caractère a été lu,
* la fonction renvoie ce qui a été lu, et place errno à 1.
*
* En cas de succès, errno est placé à 0.
*/
char *saisie_chainelire_ligne(FILE *flux)
{
int taille = 256;
char *chaine = malloc(taille);
errno = (chaine == NULL);
if (chaine != NULL)
{
Ligne 492 ⟶ 508 :
if (nouvelle == NULL)
{
/*errno realloc()= a échoué : on libère la mémoire et on quitte */1;
free(chaine)break;
}
chaine = nouvelle;
Ligne 515 ⟶ 531 :
 
À noter que cette fonction est incapable de traiter des fichiers mixtes (binaire et texte) depuis un descripteur en mode caractère (accès séquentiel). D'une part la fonction ne renvoyant pas le nombre d'octet lus (ce qui aurait facilement réglé le problème) et d'autre part, ftell() ne fonctionnant pas sur de tels descripteurs, il faudra reprogrammer <code>fgets</code> pour gérer ce cas de figure.
 
La fonction <code>fgetc()</code> permet de ne saisir qu'un caractère depuis le flux spécifié. À noter que la fonction renvoie bien un entier de type <code>int</code> et non de type <code>char</code>, car en cas d'erreur (y compris la fin de fichier), cette fonction renvoie <code>EOF</code> (défini à -1 en général).
 
== Entrées/sorties brutes ==