2010-08-30 7 views
7

Sto correndo attraverso un libro di testo C++ che ho come aggiornamento alla programmazione C++. Uno dei problemi di pratica (senza entrare troppo nel dettaglio) mi richiede di definire una funzione che può essere passata ifstream o cin (ad esempio istream) come argomento. Da lì, devo leggere il flusso. Il problema è, non riesco a capire un modo per avere questa funzione una utilizzare cin e ifstream per trovare efficacemente la fine del flusso. Vale a dire,Trova la fine del flusso per cin & ifstream?

while(input_stream.peek() != EOF) 

non funzionerà per cin. Potrei rielaborare la funzione per cercare una determinata frase (come "#End of Stream #" o qualcosa del genere), ma penso che sia una cattiva idea se il flusso di file che ho passato abbia questa frase esatta.

Ho pensato di utilizzare l'overloading delle funzioni, ma finora il libro ha menzionato quando vuole che lo faccia. Probabilmente sto mettendo troppo impegno in questo unico problema di pratica, ma mi piace il processo creativo e sono curioso di sapere se c'è un modo per farlo senza sovraccaricare.

+0

Controllare questa domanda: http://stackoverflow.com/questions/3197025/end-of-fileeof-of-standard-input -stream-stdin – Archie

risposta

4

eof()fa lavoro per cin. Stai facendo qualcosa di sbagliato; per favore pubblica il tuo codice. Un ostacolo comune è che il flag eof viene impostato dopo il si tenta di leggere dietro la fine del flusso.

Ecco una dimostrazione:

#include <iostream> 
#include <string> 

int main(int, char*[]) 
{ 
    std::string s; 
    for (unsigned n = 0; n < 5; ++n) 
    { 
     bool before = std::cin.eof(); 
     std::cin >> s; 
     bool after = std::cin.eof(); 
     std::cout << int(before) << " " << int(after) << " " << s << std::endl; 
    } 

    return 0; 
} 

e la sua uscita:

D:>t 
aaaaa 
0 0 aaaaa 
bbbbb 
0 0 bbbbb 
^Z 
0 1 bbbbb 
1 1 bbbbb 
1 1 bbbbb 

(EOF possono essere generati con Ctrl-Z su Windows e Ctrl-D su molti altri sistemi operativi)

+0

Scusate per la confusione, inizialmente ho avuto (! Input_stream.eof()) ma poi ho realizzato che avevo scritto mentre (input_stream.peek! = EOF) invece. Indipendentemente da ciò, entrambi i metodi funzionano con control + z (ironicamente, stavo solo leggendo il carattere di eof in wikipedia). Grazie per l'aiuto atzz e tutti! – user435219

+0

Preferisce convertire il flusso in un booleano su '.eof' o' .bad'. –

2

Perché non funziona lo std::cin.eof()? cin segnalerà EOF quando stdin si chiude, che avverrà quando l'utente lo segnala con Ctrl + d (* nix) o Ctrl + z (Windows), o (nel caso di un flusso di input convogliato) quando il conduttore file finisce

+1

In Windows è 'Ctrl + Z',' Ctrl + D' è per sistemi basati su UNIX. – Archie

+0

@Archie Oh, buon punto; aggiunto che in –

+0

Ah, funziona davvero (beh Ctrl + Z per Windows comunque). Scusate, se c'è un po 'di confusione che avevo originariamente mentre (! Input_stream.eof()) nel post prima e modificato a while (input_stream.peek()! = EOF). In ogni caso, 1 problema che ho sull'uso mentre (! Input_stream.eof()) è che quando la funzione legge il carattere EOF il bit di fail è impostato per input_stream. Questo dovrebbe succedere? – user435219

3

Se si utilizza uno stream in un contesto booleano, esso verrà convertito in un valore che è equivalente a true se non ha raggiunto EOF e false se è stato effettuato un tentativo di leggere oltre l'EOF (non lo è è anche falso se c'è stato un precedente errore di lettura dallo stream).

Poiché la maggior parte delle operazioni di I/O su flussi restituiscono il flusso (in modo che possano essere concatenati). Puoi eseguire la tua operazione di lettura e utilizzare il risultato nel test (come sopra).

Quindi un programma per leggere un flusso di numeri da un flusso:

int main() 
{ 
    int x; 

    // Here we try and read a number from the stream. 
    // If this fails (because of EOF or other error) an internal flag is set. 
    // The stream is returned as the result of operator>> 
    // So the stream is then being used in the boolean context of the while() 
    // So it will be converted to true if operator>> worked correctly. 
    //       or false if operator>> failed because of EOF 
    while(std::cin >> x) 
    { 
     // The loop is only entered if operator>> worked correctly. 
     std::cout << "Value: " << x << "\n"; 
    } 

    // Exit when EOF (or other error). 
}