Vérifier si le pointeur de fichier a atteint EOF sans déplacer le pointeur de fichier?
ma question est simple, mais je ne peux pas le trouver sur google, alors je suis ici.
Fondamentalement, comme un exemple, je lisais dans un tas de nombres entiers jusqu'à ce que EOF à partir d'un fichier d'entrée. J'ai utilisé fgetc pour vérifier, mais ensuite il se déplace le pointeur de fichier à l'adresse de la 2ème entier. Comment puis-je vérifier pour les expressions du FOLKLORE dans cette boucle sans déplacer le pointeur de fichier lors de la vérification?
Garder à l'esprit que je vais faire quelque chose de beaucoup plus complexe avec cette boucle que l'analyse des nombres entiers. Aussi, ne le mentionnez pas mon utilisation de fscanf plutôt que fgets, je sais. C'est juste un exemple simple pour vous montrer ce que je veux dire.
while(fgetc(ifp) != EOF)
{
fscanf(ifp, "%d", &test);
printf("%d\n", test);
}
Si le fichier d'entrée contient des entiers de 1 à 10 par exemple, le code ci-dessus affichera:
2
3
4
5
6
7
8
9
10
Manque le 1!
fgetc(ifp)
va consommer un personnageOriginalL'auteur Karim Elsheikh | 2013-08-05
Vous devez vous connecter pour publier un commentaire.
fgetc
Renvoie le caractère actuellement pointée par le fichier interne de l'indicateur de position du flux de données spécifié. Le fichier interne de l'indicateur de position est alors avancée vers le caractère suivant.À l'aide dedo{ }while();
permettra de résoudre votre problème.parce que c'est
do{}while();
qui exécute la première et de tests plus tard.gardez à l'esprit que l'appel à
fgetc()
avaler l'un des espaces séparant les nombres entiers; alors que cela fonctionne. cela sent vraiment difficile pour moi...OriginalL'auteur Dayal rai
Vous devriez envisager EOF conditions pour être un détail d'implémentation. Ce qui est vraiment important ici est de savoir si fscanf a réussi à renvoyer une valeur.
D'autre part, cela se sent comme un de ces moments où il est logique de mettre de la logique dans le milieu de la boucle.
En particulier à des fins de débogage, il peut être agréable de diviser les choses en états distincts avec des variables qui peuvent être inspectés.
OriginalL'auteur luser droog
Pour diverses raisons, il est impossible de déterminer si les expressions du FOLKLORE a été atteint sans réellement effectuer un avant de lire le fichier.
Cependant, l'utilisation d'un autre appel de fonction pour faire cela est une mauvaise idée, même si vous étiez à utiliser
ungetc()
de remettre le caractère que vous avez essayé de lire.Au lieu de cela, vérifier la valeur de retour de l'appel à
fscanf()
lui-même:OriginalL'auteur Christoph
Comment simplement:
fscanf()
peut retournerEOF
, qui est une valeur truthymerci pour la correction, j'ai édité ma réponse
OriginalL'auteur verbose
fgetc(ifp)
l'avance le pointeur de fichier, donc sauter votre premier entierAu Lieu D'Utiliser: -
vérifiez le contexte de l', OP cas n'est pas trop spécifique
while(!feof(ifp))
c'est mal parce que (en l'absence d'une erreur de lecture), il entre dans la boucle une fois de plus que l'auteur attend. Si il y a une erreur de lecture, la boucle se termine jamais.Pourriez-vous me donner un exemple d'une erreur de lecture qui puisse provoquer une boucle infinie? Je suis juste curieux.
href="http://stackoverflow.com/a/5432517/1606345">stackoverflow.com/a/5432517/1606345
OriginalL'auteur P0W
La vraie réponse est à utiliser
feof
https://www.ibm.com/support/knowledgecenter/en/SSLTBW_2.3.0/com.ibm.zos.v2r3.bpxbd00/feof.htm
OriginalL'auteur Samy Bencherif