Fin de Fichier (EOF) en C
Je suis en train de lire le livre Programmation en C par Ritchie & Kernighan. Et je suis assez confus au sujet de l'utilisation des expressions du FOLKLORE dans le getchar()
fonction.
Tout d'abord, je veux savoir pourquoi la valeur de EOF est -1 et pourquoi la valeur de l' getchar()!=EOF
est de 0. Excusez moi pour ma question, mais je ne comprends vraiment pas. J'ai vraiment essayé, mais je ne peux pas.
Puis j'ai essayé d'exécuter l'exemple sur le livre qui peut compter le nombre de caractères à l'aide du code ci-dessous, mais il semble que je n'ai jamais sortir de la boucle, même si j'appuyez sur entrée alors je me demande quand aurais-je atteindre les expressions du FOLKLORE?
main(){
long nc;
nc = 0;
while (getchar() != EOF)
++nc;
printf("%ld\n", nc);
}
Puis, j'ai lu le même problème à Problème avec les expressions du FOLKLORE en C. La plupart des gens avisés qu'au lieu d'utiliser des expressions du FOLKLORE, d'utiliser le terminateur \n ou le terminateur null '\0' qui fait beaucoup de sens.
Signifie que l'exemple sur le livre sert un autre but?
- Vous faire comprendre que le livre que vous mentionnez est par les auteurs originaux du langage C, à droite?
Vous devez vous connecter pour publier un commentaire.
EOF indique "fin de fichier". Un retour à la ligne (qui est ce qui se passe lorsque vous appuyez sur entrée) n'est pas la fin d'un fichier, c'est la fin d'un ligne, donc un retour à la ligne n'est pas arrêter cette boucle.
Le code n'est pas faux[*], il n'a tout simplement pas faire ce que vous semblez attendre. Il lit à la fin de l'entrée, mais vous semblez vouloir lire seulement à la fin d'une ligne.
La valeur de EOF est -1, car il doit être différent de la valeur de retour de
getchar
qui est un caractère réel. Doncgetchar
retourne aucune valeur de caractère comme un unsigned char, converti en int, qui sera donc non-négatif.Si vous êtes en tapant dans le terminal et que vous voulez provoquer une fin de fichier, utilisez CTRL-D (les systèmes de type unix) ou CTRL-Z (Windows). Puis après tous les commentaires ont été lus,
getchar()
sera de retourEOF
, et doncgetchar() != EOF
sera fausse, et la boucle s'arrêtera.[*] eh bien, il a un comportement indéfini si l'entrée est plus que LONG_MAX personnages en raison de dépassement d'entier, mais nous pouvons sans doute pardonner que, dans un exemple simple.
EOF est -1 parce que c'est la façon dont il est défini. Le nom est fourni par la bibliothèque standard les en-têtes que vous
#include
. Ils la rendre égale à -1, car il doit être quelque chose qui ne peut pas être confondu avec une réelle octet lu pargetchar()
.getchar()
rapports les valeurs d'octets à l'aide de nombre positif (0 à 255 inclus), donc -1 fonctionne très bien pour cela.La
!=
opérateur signifie "pas égal". 0 signifie faux, et rien d'autre se tient pour vrai. Donc ce qui arrive est, nous l'appelons legetchar()
fonction, et de comparer le résultat à -1 (EOF). Si le résultat n'était pas égal à l'EOF, alors le résultat est vrai, parce que les choses qui ne sont pas égales ne sont pas égaux. Si le résultat est égal à l'EOF, puis le résultat est faux, parce que les choses qui sont égales ne sont pas (pas égal à).L'appel à
getchar()
retourne EOF lorsque vous arrivez à la "fin de fichier". Dans la mesure du C, l 'entrée standard' (les données que vous donnez à votre programme en tapant dans la fenêtre de commande) est juste comme un fichier. Bien sûr, vous pouvez toujours taper plus, si vous avez besoin d'une manière explicite pour dire "j'ai fait". Sur les systèmes Windows, c'est ctrl-Z. Sur les systèmes Unix, c'est le contrôle-D.L'exemple dans le livre n'est pas "mauvais". Il dépend ce que vous voulez vraiment faire. La lecture jusqu'à ce que EOF signifie que vous lisez tout, jusqu'à ce que l'utilisateur dit "je suis fait", et puis vous ne pouvez pas lire. La lecture jusqu'à ce que '\n' signifie que vous avez lu une ligne de l'entrée. La lecture jusqu'à ce que '\0' est une mauvaise idée si vous vous attendez à l'utilisateur de taper l'entrée, car il est difficile, voire impossible, de produire cet octet avec un clavier à l'invite de commandes 🙂
C'est beaucoup de questions.
Pourquoi
EOF
est -1: généralement -1 dans POSIX appels système est retourné en cas d'erreur, donc je suppose que l'idée est "EOF est une sorte d'erreur"toute opération booléenne (y compris !=) retourne 1 si c'est VRAI, et 0 dans le cas où c'est FAUX, donc
getchar() != EOF
est0
quand c'est FAUX, sensgetchar()
retournéEOF
.afin d'émuler la
EOF
lors de la lecture destdin
appuyez sur Ctrl+Dif()
ouwhile()
condition).