Discussion:Programmation C/Entrées/sorties

Un livre de Wikilivres.
Sauter à la navigation Sauter à la recherche

Problèmes dans exemple[modifier le wikicode]

Bonjour

Dans le chapitre entrées non formatées, je lis :

Un exemple de lecture de ligne arbitrairement longue est vu plus bas...

L'exemple incorrect[modifier le wikicode]

Mes remarques[modifier le wikicode]

  1. A quoi sert #include <string.h> ?
  2. A quoi sert l'argument FILE *flux ? La fonction ne lit que dans stdin fgetc(stdin).
  3. Utiliser errno à droite dans une affectation pour retourner des valeurs perso me parait risqué : errno = (chaine == NULL);. Le système initialise errno à ENOMEM pour un problème sur malloc ou realloc, pourquoi ne pas s'en servir ? Une initialisation de errno à 1, correspond à une erreur système EPERM : Operation not permitted. L'emploi de perror dans l'appelant affichera un mauvais diagnostique d'erreur.
  4. Pourquoi utiliser fgetc au lieu de fgets, quitte à appeler plusieurs fois fgets si la ligne est trop longue pour le buffer chaine ?
  5. L'utilisation de break dans une boucle est déconseillée.
  6. La mémoire est allouée. Pour éviter les fuites mémoires, l'appelant devra la libérer. Cela devrait être stipulé dans les commentaires d'entête.
  7. Comment sait-on si avec avec fgetc on a rencontré une fin de fichier ou ou erreur ?
  8. Si dans la boucle (i == taille-1) et (c != '\n'), on incrémente i qui vaut taille, si à l'itération suivante fgetc retourne EOF, on sort de la boucle. L'instruction chaine[i] = '\0'; adresse chaine[taille]. chaine a des indices valides de 0 à taille-1. Cette instruction ècrit en dehors du tableau. Il y a du SIGSEGV (violation d'espace d'adressage) dans l'air. Il faut toujours imaginer le pire.
  9. La constante littérale 256 devrait être remplacée par une constante symbolique.
  10. malloc et realloc attendent un argument de type size_t, on leur passe taille de type int.
  11. La déclaration char *nouvelle devrait être en premier dans son bloc.
  12. Les expressions idiomatiques C errno = (chaine == NULL); et taille += 256; peuvent être difficiles à comprendre par un autre programmeur chargé de la maintenance et non habitué à cette syntaxe spécifique du C.
  13. Pourquoi ne pas déclarer le paramètre de cette fonction : FILE * restrict flux ?
  14. Pourquoi ne pas fournir un programme main appelant pour tester cette fonction ?

Ma solution[modifier le wikicode]

Exercices en langage C/Fonctions#Lire une ligne longue avec fgets

--Thierry46 2 février 2008 à 07:33 (CET)