web-dev-qa-db-fra.com

Lecture de fichier texte jusqu'au EOF utiliser des objets en C

quelle est la bonne façon de lire un fichier texte jusqu'à EOF en utilisant fgets en C? Maintenant j'ai ceci (simplifié):

char line[100 + 1];
while (fgets(line, sizeof(line), tsin) != NULL) { // tsin is FILE* input
   ... //doing stuff with line
}

Plus précisément, je me demande s’il devrait y avoir quelque chose d’autre que la condition pendant laquelle? Est-ce que l'analyse du fichier texte vers "ligne" doit être effectuée dans la condition while? 

4
Johan

Selon la référence

En cas de succès, la fonction retourne str . Si la fin du fichier est rencontrée lors de la tentative de lecture d'un caractère, l'indicateur eof est défini sur (Feof). Si cela se produit avant que des caractères puissent être lus, le pointeur Renvoyé est un pointeur nul (et le contenu de str reste inchangé à [.____.)). Si une erreur de lecture se produit, l'indicateur d'erreur (ferror) est réglé sur Et un pointeur nul est également renvoyé (mais le contenu pointé par Str a peut-être changé).

Donc, vérifier si la valeur renvoyée est bien NULL suffit. De plus, l'analyse va dans le while-body.

7
bigahega

Ce que vous avez fait est acceptable à 100%, mais vous pouvez également simplement compter sur le retour de fgets comme test lui-même, par exemple.

char line[100 + 1] = "";  /* initialize all to 0 ('\0') */

while (fgets(line, sizeof(line), tsin)) { /* tsin is FILE* input */
    /* ... doing stuff with line */
}

Pourquoi? fgets renverra un pointeur sur line en cas de succès, ou NULL en cas d'échec (pour quelque raison que ce soit). Un pointeur valide testera true et, bien sûr, NULL testera false.

( remarque: vous devez vous assurer que line est un tableau caractères déclaré dans la portée pour utiliser sizeof line comme longueur. Si line est simplement un pointeur sur un tableau, vous ne lisez que sizeof (char *) personnages)

2
David C. Rankin


J'ai eu le même problème et je l'ai résolu de cette façon

while (fgets(line, sizeof(line), tsin) != 0) { //get an int value
   ... //doing stuff with line
}
1
user3499663