2009-03-24 8 views

risposta

5

Questo stamperà l'intero flusso, 1 carattere alla volta:

char c; 
c = my_istream.get(); 
while (my_istream) 
{ 
    std::cout << c; 
    c = my_istream.get(); 
} 

Questo stamperà la tutta la faccenda, ma scartare spazi bianchi:

std::string output; 
while(my_istream >> output) 
    std::cout << output; 
12

Edit: sto assumendo che si desidera copiare l'intero contenuto del flusso, e non solo un singolo valore. Se vuoi solo leggere una singola parola, controlla invece la risposta di 1800.


La soluzione più ovvia è un ciclo while la copia di una parola alla volta, ma si può fare più semplice, come un bel oneliner:

#include <iostream> 
#include <iterator> 

... 

std::istream i; 
std::copy(std::istream_iterator<char>(i), std::istream_iterator<char>(), std::ostream_iterator<char>(std::cout)); 

I stream_iterators utilizzano operatore < < e >> internamente, nel senso che ignoreranno lo spazio bianco. Se vuoi una copia esatta, puoi usare invece std :: istreambuf_iterator e std :: ostreambuf_iterator. Funzionano sui buffer di flusso (non formattati) sottostanti in modo da non saltare spazi bianchi o convertire righe nuove o altro.

Si può anche utilizzare:

i >> std::noskipws; 

per evitare spazi bianchi da scomparire. Si noti tuttavia che se il flusso è un file binario, alcuni altri caratteri potrebbero essere danneggiati dagli operatori >> e <<.

+0

Perché il secondo parametro è ostream_iterator? – rlbond

+0

ehm, non lo è! :) (l'ho appena corretto. Era un errore di battitura) – jalf

0

è necessario leggere da esso, e poi l'uscita ciò che si legge:

istream stm; 
string str; 
stm >> str; 
cout << str; 
+0

che legge solo una parola (spazio delimitato). Penso che voglia copiare tutto dal flusso. – jalf

+0

Penso che se lo volesse, lo avrebbe detto –

+2

Chi sa cosa vuole, la domanda è scarsa. –

18

È ouput streambuf del istream.

Ad esempio, per emettere un ifstream a cout:

std::ifstream f("whatever"); 
std::cout << f.rdbuf(); 
0

std :: ifsream sovraccarico e std :: ostringstream

C++ 11 o superiore


Attenziione a && in std :: ifstream che consente di dirigere utilizzando

#include <iostream> 
#include <sstream> 
#include <fstream> 

std::ostream& operator<<(std::ostream& os, std::basic_ostringstream&& iss){ 
    return os<<iss.str(); 
} 

std::ostream& operator<<(std::ostream& os, std::ifstream&& ifs){ 
    return std::cout<<ifs.rdbuf(); 
} 


int main() 
{ 
    std::cout<<std::ostringstream("Test ostringstream overloading")<<std::endl; 
    std::ofstream("fstream.txt")<<"Test fstream overloading"<<std::endl; 
    std::cout<<std::ifstream("fstream.txt")<<std::endl; // overloading okay 
} 

uscita:

Test ostringstream overloading 
Test fstream overloading 


Process returned 0 (0x0) execution time : 0.012 s 
Press ENTER to continue. 
Problemi correlati