2009-01-31 6 views
16

Quelle est la manière la plus optimale d'obtenir un pointeur string ou char * dans un istream?Manière optimale d'obtenir une chaîne ou un char * dans un flux istream?

Je veux faire ce qui suit

std::string a = "abc.."; 

//I know this can be done, not sure if this is most efficient 
// and not sure about char* pointers 
std::istringstream istr (a); 
... 
foo (istr); 


void foo(std::istream& is) { 

} 
+0

Désolé; Ce n'est pas tout à fait clair ce que vous demandez ici. Voulez-vous être en mesure d'accéder à une chaîne comme s'il s'agissait d'un flux? Qu'est-ce que vous essayez d'accomplir? – Rob

+0

a édité la question maintenant. – kal

+0

Je dois noter que votre code n'est pas valide. vous ne pouvez pas construire un istream à partir d'un istringstream. que pensez-vous qu'il devrait faire (note, les flux ne peuvent pas être copiés). –

Répondre

12

Cela fonctionne:

std::istringstream is("abc..."); 

Et depuis istringstream est un istream, vous serez en mesure d'utiliser votre objet est comme istream.

+0

Cela semble être la réponse évidente - ou est le PO demande vraiment quelque chose d'autre? –

+0

Je cherchais aussi cela et je ne savais pas que ce serait si facile. les streams sont durs si vous ne les connaissez pas :) –

15

Si vous voulez construire un istringstream de lui, un char * jusqu'au caractère nul, ou toutes les choses d'un std :: string:

istringstream str(ptr); // char* 
istringstream str(other_str); // std::string 

Si vous parlez de vouloir un pointeur brut en le tampon d'un istream, vous ne pouvez pas le faire. Les flux obtiennent leurs données à la demande s'ils en ont besoin, soit à partir de fichiers, de terminaux, soit en tamponnant leurs données (bien, pas exactement) Vous pouvez utiliser un strstream, qui accepte un pointeur brut et lit/écrit directement à partir de cela. c'est une classe obsolète - ne l'utilisez pas, j'ai de la chance de ne l'avoir jamais fait). Si tout ce que vous voulez est quelque chose que vous pouvez utiliser comme un pointeur, vous pouvez utiliser des itérateurs streambuf. Ils ne sont pas vraiment des pointeurs, donc vous ne pouvez pas soustraire end de begin et d'autres étoffes:

std::istreambuf_iterator<char> begin(one_istream), end; 
while(begin != end) 
    std::cout << *begin++; 

Si vous parlez de faire une chaîne de ce qui a été écrit dans un stringstream, vous pouvez utiliser ostringstream::str:

ostringstream o; 
o << "This is a number: " << 42; 
std::string str = o.str(); // str == "This is a number: 42" 

Sinon, vous ne pouvez généralement lire choses à partir d'un istream. Vous avez besoin d'un ostream, alors vous pouvez faire

stream.write(ptr, N); 
stream.write(ptr.c_str(), ptr.c_str() + ptr.size()); 

d'écrire exactement N caractères des octets que les points str. Vous pouvez également l'écrire dans le flux en utilisant <<. Il va écrire tout le caractère nul, ou tout d'un std :: string, mais respectera les drapeaux de mise en forme, comme la largeur du champ:

stream << ptr; // char* 
stream << other_str; // everything from std::string