2010-09-21 10 views
6

Quería experimentar con stringstream para una tarea, pero estoy un poco confundido sobre cómo funciona. Hice una búsqueda rápida pero no pude encontrar nada que respondiera mi pregunta.cómo leer cadenas de caracteres con tamaño dinámico?

Decir que tengo una corriente con un tamaño dinámico, ¿cómo voy a saber cuándo hay que dejar de escribir a la variable?

string var = "2 ++ asdf 3 * c"; 
stringstream ss; 

ss << var; 

while(ss){ 
    ss >> var; 
    cout << var << endl; 
} 

y mi salida sería:

2 
++ 
asdf 
3 
* 
c 
c 

no estoy seguro de por qué me sale que 'c' extra al final, sobre todo porque _M_in_cur = 0x1001000d7 ""

+0

El hecho de que se trata de un stringstream no cambia mucho, lea de él como lo haría con cualquier otra transmisión. –

Respuesta

17

Se obtiene el c extra al final porque no prueba si la transmisión sigue siendo válida después de realizar la extracción:

while (ss)  // test if stream is good 
{ 
    ss >> var; // attempt extraction   <-- the stream state is set here 
    cout << var; // use result of extraction 
} 

Necesita probar el estado de la corriente entre cuando realiza la extracción y cuando usa el resultado. Normalmente esto se hace mediante la realización de la extracción en la condición de bucle:

while (ss >> var) // attempt extraction then test if stream is good 
{ 
    cout << var; // use result of extraction 
} 
+0

Gracias, supongo que mi pregunta debería haberse formulado como la forma de verificar el estado de la transmisión. –

+0

@ thomast.sang acepta su respuesta. – gsamaras

-1

También hay una función miembro bueno() que pone a prueba si el flujo se puede utilizar para las operaciones de E/S. Así, utilizando este código anterior se puede cambiar en

while(ss.good()) // check if the stream can be used for io 
{ 
    ss >> var; // attempt extraction   <-- the stream state is set here 
    cout << var; // use result of extraction 
} 
+1

Esto sigue siendo incorrecto en el caso general: si está tratando de extraer un 'int' y los siguientes caracteres disponibles en el búfer no se pueden leer como' int', la extracción fallará. –

0

El cheque while(ss) condición en su código comprueba si la última lectura de la corriente fue exitosa o no. Sin embargo, esta comprobación será verdadera incluso cuando haya leído la última palabra de su cadena. Solo la próxima extracción de ss >> var en su código hará que esta condición sea falsa ya que el final de la secuencia se ha alcanzado & no hay nada que extraer en la variable var. Esta es la razón por la que obtienes una 'c' extra al final. Puede eliminar esto cambiando su código según lo sugerido por James McNellis.

Cuestiones relacionadas