Domanda

Sono io che attraversa un libro di testo ++ C che ho come un aggiornamento alla programmazione C ++. Uno dei problemi pratici (senza entrare troppo nel dettaglio) vuole che io definire una funzione che può essere passato ifstream o cin (ad esempio istream) come argomento. Da lì, devo leggere attraverso il flusso. Il problema è che non riesco a trovare un modo per avere questa una uso funzione cin e ifstream efficacemente trovare la fine del flusso. Vale a dire,

while(input_stream.peek() != EOF)

Non è andare a lavorare per cin. Ho potuto rielaborare la funzione di cercare una certa frase (come "#End di flusso #" o qualcosa del genere), ma penso che questa è una cattiva idea se il flusso di file Passo ha questa frase esatta.

ho pensato di utilizzare la funzione di sovraccarico, ma finora il libro è citato quando si vuole che io faccia questo. Probabilmente sto mettendo troppo sforzo in questo problema una pratica, ma mi piace il processo creativo e sono curioso di sapere se c'è un modo per farlo senza sovraccaricare.

È stato utile?

Soluzione

eof() ha di lavoro per cin. Si sta facendo qualcosa di sbagliato; si prega di inviare il vostro codice. Un ostacolo comune è viene impostata quella bandiera eof dopo 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 può essere generato con Ctrl-Z su Windows e Ctrl-D su molti altri sistemi operativi)

Altri suggerimenti

Perché non il lavoro std::cin.eof()? cin segnalerà EOF quando stdin chiude, che avverrà quando l'utente segnali con Ctrl + d (* nix) o Ctrl + z (Windows), o (nel caso di un flusso in ingresso in filodiffusione) quando le estremità di file in filodiffusione

Se si utilizza un ruscello in un contesto booleano allora sarà stessa di convertire in un valore che equivale a vera se non ha raggiunto l'EOF e false se un tentativo è stato fatto di leggere oltre l'EOF (non è anche falso se ci fosse un precedente errore di lettura dal flusso).

Dal momento che la maggior parte delle operazioni di IO su flussi di ritorno del flusso (in modo che possano essere concatenati). Si può fare l'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).
}
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top