7
votes

Comment force EOF sur Stdin?

pour une application C ++, comment puis-je forcer programmatiquement une fin de fichier (EOF) sur stdin?


1 commentaires

Comment voulez-vous dire «force EOF sur Stdin '? Vous pouvez fermer Stdin (ou Cin). Vous auriez pu terminer votre boucle unilatéralement. Vous pouvez chercher à la fin du fichier (mais cela ne vous aidera pas avec un terminal ou un tuyau comme entrée). Vous pourriez être capable de forcer le problème avec freopen () ; Réaffecter la saisie standard à lire depuis / dev / null ou nul :.


3 Réponses :


13
votes

Si vous êtes sur un terminal dans un système de type UNIX, appuyez sur Ctrl-D . Dans Windows, Ctrl-Z .

Edit: Ayant vu le désir de le faire "de manière programmatique", je suggère d'essayer fclose (stdin) . Si vous n'êtes pas assez bon, une idée plus belle peut être d'utiliser std :: cin.rdbuf () pour définir le flux pour désigner une autre chose que la vraie stdin, puis faites ce que vous voulez ce flux. Mais cela commence à sentir mal, comme vous vous battez contre l'ordinateur, alors j'aimerais en savoir plus sur ce que l'objectif réel est.


5 commentaires

Mais cela provient d'une application C ++, l'envoi de Ctrl-D travaille-t-il?


Oh je vois "de manière programmatique" maintenant. Peut-être que vous pouvez décrire plus en détail ce que vous essayez de faire?


J'essaie de résoudre: Stackoverflow.com/Questtions/4701282/...


Aha! Ensuite, la solution réelle consiste à utiliser libssh ou libsssh2 , plutôt que d'appeler popen () de c seul pour invoquer ssh (1) qui est lui-même un autre programme C. Découpez les intermédiaires!


@Johnzwinck, mais Ctrl-Z ne fonctionne pas pour moi, cela me donne un ^ z , qu'est-ce qui ne va pas?



6
votes

En fait, vous ne pouvez pas. Tant que vous pouvez lire des données de Stdin, EOF n'a pas été atteinte et, en fait, vous ne pouvez jamais l'atteindre. Vous pouvez fermer le stdin lui-même. Pour le fermer, faites ceci: xxx

Après cela, vous ne pouvez pas lire les données de stdin .


0 commentaires

1
votes

Il y a une belle petite fonction disponible pour chaque flux créé spécialement pour cela.

Sa syntaxe est quelque chose comme: XXX


Donc, dans votre code, vous pouvez avoir une condition simple qui déclenche quelque chose comme: xxx < / Pré>


La documentation pour cela est assez clairsemée mais certaines sur CPPrefreence.com et Cplusplus.com < / a>.


0 commentaires