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é.