Une question à ce sujet a été posée ici Fin du fichier en C mais cela ne résout toujours pas complètement mon problème.
EOF
me semble logique dans tout flux de données autre que stdin
name__, par exemple, si j'ai un fichier data.txt
, fgetc()
lira tous les caractères et parviendra à la fin du fichier et retournera -1
.
Ce que je ne comprends pas, c'est le concept de EOF
dans stdin
name__. Si j'utilise getchar()
, j'attendrai quelque chose. Par conséquent, s'il n'y a RIEN écrit, End of File, (EOF
name__) n'est pas renvoyé automatiquement?
Ainsi, seul l'utilisateur peut appeler EOF
dans stdin
en appuyant sur Ctrl+Z? Si tel est le cas, quelles sont certaines des utilisations de EOF
dans stdin
name__? Je suppose que cela indique au programme de continuer à lire jusqu'à ce que l'utilisateur appelle la fin du fichier? est-ce ceci?
Je vous remercie
donc s'il n'y a rien écrit, la fin du fichier, (EOF) n'est pas retournée automatiquement?
Non, ce n'est pas cela devrait être envoyé par l'utilisateur.
Ainsi, seul l'utilisateur peut appeler
EOF
dansstdin
en appuyant sur Ctrl+Z?
Oui, vous pouvez définir le code EOF
pour stdin
avec une combinaison de touches spéciale que vous pouvez entrer dans la console, pour la console Linux qui est: Ctrl+D et pour Windows c'est Ctrl+Z.
Si tel est le cas, quelles sont certaines des utilisations de
EOF
dansstdin
name__? Je suppose que cela indique au programme de continuer à lire jusqu'à ce que l'utilisateur invoque la fin du fichier? est-ce ceci?
Son utilisation dépend de si vous demandez à l'utilisateur de saisir EOF
explicitement ou non, par exemple, je pense que la console python
vous indiquera quelque chose comme Press Ctrl+D or type quit() to exit
.
Et EOF
n'est pas nécessairement -1
c'est une macro et vous devriez toujours l'utiliser pour tester l'indicateur EOF
name__. Et plus important encore, EOF
n’est pas un caractère, c’est une valeur spéciale qui indique que E nd O f F ile l'indicateur est défini.
De plus, getchar()
est équivalent à fgetc(stdin)
.
Sous Linux, si vous appuyez sur CTRL+D, il générera EOF
name__.
Sous Windows, l’équivalent est CTRL+Z
Donc, non, si rien d'écrit dans le terminal, cela ne génère pas EOF
automatiquement. La fonction de balayage est alors en attente. Donc, sans avoir d'autres entrées, en état d'attente, si CTRL+D est enfoncée, la touche est traduite [par le pilote du terminal] en EOF
name__.Remarque
Habituellement, une fois que vous entrez une valeur et que vous appuyez sur le bouton ENTER touche, la fonction scannning lance le balayage. Pour alimenter une entrée permettant de générer EOF
name__, vous devez appuyer sur CTRL+D.
Connexes: veuillez répondre au entrée du wiki pour EOF
name__
Note: Merci à M. Drew pour cette clarification.
stdin
est un flux, les données ne sont pas disponibles tant que l'utilisateur n'a pas appuyé sur certaines touches. Un fichier sur le disque a déjà un contenu (fixe).
Lors de la lecture de stdin
, si getchar()
n'attend pas que l'utilisateur saisisse quelque chose, le programme recevra toujours EOF
. Cela rendra impossible l'utilisation de stdin
en tant que fichier d'entrée.
Étant donné que getchar()
attend que l'utilisateur saisisse quelque chose, il n'y a aucun moyen de signaler que l'entrée est terminée; C'est pourquoi les systèmes d'exploitation fournissent une combinaison de touches qui ont cette signification particulière lorsqu'elles sont appuyées sur la console.
Windows utilise CtrlZ et les systèmes d'exploitation de type Unix (y compris OSX) CtrlD dans ce but.
Le fichier stdin
n'est pas toujours l'utilisateur qui tape au clavier. Si vous redirigez les entrées vers votre programme, il peut s’agir d’un fichier normal.
program.exe <input-from-file.txt
Ce qui peut vous dérouter, c'est qu'aucune entrée dans une fenêtre de console ne marque la fin de l'entrée. Mais pensons que ce soit l'inverse: comment un utilisateur peut-il réagir si rapidement que le programme ne se terminera pas avant si la console ne met pas en mémoire tampon les informations pour l'utilisateur? Après avoir appuyé sur Enter l'utilisateur dit qu'il s'agit d'une ligne de saisie. En d'autres termes: un programme qui s'exécute dans une fenêtre de console attend toujours la prochaine entrée.
La plupart des programmes définissent une phrase spéciale pour mettre fin à une session de console. Vous savez probablement exit
.