2009-01-31 12 views
16

¿Cuál es la forma más óptima de convertir un puntero de cadena o char * en una istream?¿Manera óptima de obtener una cadena o char * en un istream?

quiero hacer la siguiente

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

Lo siento; no está del todo claro lo que estás preguntando aquí. ¿Desea poder acceder a una cadena como si fuera una secuencia? ¿Qué está tratando de lograr? – Rob

+0

corrigió la pregunta ahora. – kal

+0

debería tener en cuenta que su código no es válido. no puedes construir un istream desde un istringstream. ¿Qué crees que debería hacer? (obsérvese que las transmisiones no se pueden copiar). –

Respuesta

12

esto funcionará:

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

Y puesto que es un istringstream istream, usted será capaz de utilizar su objeto es como un istream.

+0

. Esta parece ser la respuesta obvia, ¿o realmente está OP pidiendo algo más? –

+0

También estaba buscando esto y no sabía que sería tan fácil. las transmisiones son difíciles si no las conoces :) –

15

Si desea construir un istringstream de ella, un char * hasta el carácter nulo, o todas las cosas desde un std :: string:

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

Si se habla de querer un puntero en bruto en el buffer de un istream, no puedes hacerlo. Las transmisiones obtienen sus datos bajo demanda si los necesitan, ya sea desde archivos, terminales o bien, opcionalmente almacenando sus cosas en búfer (bueno, no exactamente. Puede usar un strstream, que acepta un puntero sin procesar y lee/escribe directamente desde allí. es una clase obsoleta - no la use. Tengo suerte de que nunca lo haya hecho). Si todo lo que desea es algo que pueda usar como un puntero, puede usar los iteradores streambuf. Ellos no son realmente punteros sin embargo, por lo que no pueden restar end de begin y otras materias:

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

Si se habla de conseguir una cadena de lo que estaba escrito en un stringstream, puede utilizar ostringstream::str:

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

de lo contrario, sólo se puede leer en general cosas de una istream. Es necesario un ostream, entonces usted puede hacer

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

para escribir exactamente n caracteres de los bytes que los puntos a STR. También puede escribirlo en la transmisión usando <<. Escribirá todo hasta el carácter nulo, o todo desde una cadena std ::, pero respetará las marcas de formato, como el ancho del campo:

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