2 votes

comment faire la différence entre fgets atteignant EOF et atteignant une erreur

J'ai une question sur le fgets()

char *fgets(char *str, int strsize, FILE *stream);

fgets() dit le document :

En cas de succès, la fonction renvoie le même paramètre str. Si la fin du fichier est rencontrée et qu'aucun caractère n'a été lu, le contenu du fichier str restent inchangés et un pointeur nul est retourné. .

Si une erreur se produit, un pointeur nul est renvoyé .

  1. Comment différencier les deux situations ci-dessus - fgets atteignant EOF(END OF FILE) & erreur lors de la lecture du fichier ?

  2. De plus, lorsqu'une erreur se produit pendant que fgets lit le fichier, est-ce que fgets garde la trace de ce qui a été lu jusqu'à ce point dans la chaîne de caractères ?

  3. Comment vérifier si fgets atteint immédiatement EOF ?

1voto

alk Points 26509

En référence à votre première question :

Comment différencier les deux situations ci-dessus - fgets atteignant EOF(END OF FILE) & erreur lors de la lecture du fichier ?

Si fgets() retourne NULL, appelez ferror() pour le pointeur de fichier qui, juste avant, avait été utilisé avec la commande fgets() qui a retourné NULL . Si ferror() renvoie une valeur non nulle, alors fgets() a échoué, sinon il avait atteint la fin du fichier.

Exemple :

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

#define LINE_LEN_MAX (42)

int main(int argc, char ** argv)
{
   if (1 >= argc)
   {
     errno = EINVAL;
     perror("main() failed");
     exit(EXIT_FAILURE);
   }

   {
     FILE * fp = fopen(argv[1], "r");
     if (NULL == fp)
     {
       perror("fopen() failed");
       exit(EXIT_FAILURE);
     }

     for (char line[LINE_LEN_MAX];
       NULL != fgets(line, LINE_LEN_MAX, fp);)
     {
       printf("%s", line);
     }

     if (0 != ferror(fp))
     {
       perror("fgets() failed");
       exit(EXIT_FAILURE);
     }

     fclose(fp);
   }

   return EXIT_SUCCESS;
 }

La réponse à l'autre question peut être donnée directement à partir des éléments suivants les docs :

Question 3 :

Comment vérifier si fgets atteint immédiatement EOF ?

Réponse :

Si la fin du fichier est rencontrée et qu'aucun caractère n'a été lu dans le tableau, le contenu du tableau reste inchangé et un pointeur nul est retourné.

Question 2 :

quand une erreur se produit pendant que fgets lit le fichier, est-ce que fgets garde la trace de ce qui a été lu jusqu'à ce point dans la chaîne ?

Réponse :

Si une erreur de lecture se produit pendant l'opération, le contenu du tableau est indéterminé et un pointeur nul est renvoyé.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X