web-dev-qa-db-fra.com

Fin de fichier en stdin

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.

EOFme semble logique dans tout flux de données autre que stdinname__, 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 EOFdans stdinname__. Si j'utilise getchar(), j'attendrai quelque chose. Par conséquent, s'il n'y a RIEN écrit, End of File, (EOFname__) n'est pas renvoyé automatiquement?

Ainsi, seul l'utilisateur peut appeler EOFdans stdinen appuyant sur Ctrl+Z? Si tel est le cas, quelles sont certaines des utilisations de EOFdans stdinname__? 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

11
Mcs

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 EOFdans stdinen appuyant sur Ctrl+Z?

Oui, vous pouvez définir le code EOFpour stdinavec 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 EOFdans stdinname__? 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 EOFexplicitement ou non, par exemple, je pense que la console pythonvous indiquera quelque chose comme Press Ctrl+D or type quit() to exit.

Et EOFn'est pas nécessairement -1 c'est une macro et vous devriez toujours l'utiliser pour tester l'indicateur EOFname__. Et plus important encore, EOFn’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).

14
Iharob Al Asimi

Sous Linux, si vous appuyez sur CTRL+D, il générera EOFname__.

Sous Windows, l’équivalent est CTRL+Z

Donc, non, si rien d'écrit dans le terminal, cela ne génère pas EOFautomatiquement. 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 EOFname__.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 EOFname__, vous devez appuyer sur CTRL+D.

Connexes: veuillez répondre au entrée du wiki pour EOFname__

Note: Merci à M. Drew pour cette clarification.

5
Sourav Ghosh

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.

2
axiac

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.

0
Wolf