2009-03-24 5 views

Répondre

5

Ce imprimera tout le flux, 1 caractère à la fois:

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

Ce imprimera la tout, mais jeter les espaces:

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

Edit: Je suppose que vous voulez copier tout le contenu du flux, et non pas seulement une seule valeur. Si vous voulez seulement lire un seul mot, vérifiez la réponse de 1800 à la place.


La solution évidente est une boucle while copie d'un mot à la fois, mais vous pouvez le faire plus simple, comme une belle 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)); 

Les stream_iterators utilisent l'opérateur < < et >> en interne, ce qui signifie qu'ils vont ignorer les espaces. Si vous voulez une copie exacte, vous pouvez utiliser std :: istreambuf_iterator et std :: ostreambuf_iterator à la place. Ils travaillent sur les tampons de flux sous-jacents (non formatés) afin qu'ils n'oublient pas les espaces ou ne convertissent pas les lignes de nouvelle ligne ou quoi que ce soit.

Vous pouvez également utiliser:

i >> std::noskipws; 

pour éviter les espaces de disparaître. Notez cependant que si votre flux est un fichier binaire, d'autres caractères peuvent être modifiés par les opérateurs >> et <<.

+0

Pourquoi le second paramètre est-il un ostream_iterator? – rlbond

+0

euh, ce n'est pas! :) (juste corrigé, c'était une faute de frappe) – jalf

0

Vous devez lire, puis sortie ce que vous lisez:

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

qui lit seulement un mot (espace délimité). Je pense qu'il veut tout copier du flux. – jalf

+0

Je pense que s'il le voulait, il l'aurait dit –

+2

Qui sait ce qu'il veut, la question est mauvaise. –

18

Vous Ouput le streambuf du istream.

Par exemple, pour une sortie à ifstream Cout:

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

std :: surcharge ifsream et std :: ostringstream

C++ 11 ou supérieur


Faites attention à && en std :: ifstream qui vous permet de diriger en utilisant

#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 
} 

sortie:

Test ostringstream overloading 
Test fstream overloading 


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