2011-01-15 14 views
5

Per un'applicazione C++, come posso forzare a livello di codice una fine del file (EOF) su stdin?Come faccio a forzare eof su stdin?

+0

Come intendete 'forza EOF su stdin'? Potresti chiudere stdin (o cin). Potresti far terminare unilateralmente il tuo ciclo. Si potrebbe cercare fino alla fine del file (ma ciò non aiuterà con un terminale o pipe come input). Potresti essere in grado di forzare il problema con 'freopen()'; riassegna lo standard input per leggere da/dev/null o NUL :. –

risposta

6

In realtà, non è possibile. Finché puoi leggere i dati da stdin, EOF non è stato raggiunto, e in effetti non puoi mai raggiungerlo. È possibile chiudere lo stesso stdin, tuttavia. Per chiuderlo, fare questo:

fclose(stdin); 

Dopo questo, non è possibile leggere i dati dal stdin.

8

Se sei a un terminale in un sistema simile a Unix, premi Ctrl-D. In Windows, Ctrl-Z.

Modifica: Avendo visto il desiderio di eseguire questa operazione "programmaticamente", suggerisco di provare fclose(stdin). Se in qualche modo questo non è abbastanza buono, un'idea più pazza potrebbe essere quella di usare std::cin.rdbuf() per impostare lo streaming in modo che si riferisca a qualcosa di diverso dal vero stdin, e poi fare ciò che si vuole per quel flusso. Ma questo comincia ad avere un cattivo odore, come se stessi combattendo contro il computer, quindi mi piacerebbe sapere di più su quale sia il vero obiettivo.

+0

Ma questo proviene da un'applicazione C++, quindi l'invio di Ctrl-D funziona? – WilliamKF

+0

Oh, ora vedo "programmaticamente". Forse puoi descrivere più in dettaglio cosa stai cercando di fare? –

+1

Basta scrivere 0x1A (il codice ASCII per Ctrl + Z) per stdin. – Tergiver

1

C'è una bella piccola funzione disponibile per ogni flusso creato appositamente per questo.

E 'la sintassi è qualcosa di simile:

 stream.setstate(stream.flags) 


Quindi nel tuo codice è possibile avere un semplice condizione che fa scattare qualcosa come:

 std::cin.setstate(std::cin.eofbit); 


La documentazione di questo è piuttosto scarsa, ma c'è un po' su cppreference.com e cplusplus.com.

Problemi correlati