2011-06-08 16 views

Respuesta

30

Se puede utilizar std::getline para obtener el resto de la cadena de la secuencia:

#include <iostream> 
#include <sstream> 

using namespace std; 

int main() { 
     stringstream ss("abc gg rrr ff"); 
     string s1, s2; 
     ss >> s1; 
     getline(ss, s2); //get rest of the string! 
     cout << s1 << endl; 
     cout << s2 << endl; 
     return 0; 
} 

Salida:

abc 
gg rrr ff 

Demostración: http://www.ideone.com/R4kfV

Hay una sobrecarga std::getline función en la que un tercer parámetro toma un delimitador hasta que se puede leer la cadena. Consulte la documentación de std::getline:

+1

guau, gracias. ¡Eso es magia! Pero, ¿por qué funciona? – draw

+0

@draw: solo puedo adivinar, pero tal vez se lee en todo a través de 'operator >>' y solo se incluye en los delimitadores de espacios en blanco entre las lecturas? : | – Xeo

+2

@draw (y @Xeo): 'std :: getline' respeta el comportamiento de la secuencia. Y en el comportamiento de transmisión no puede leer * misma * entrada más de una vez.Esto es lo que significa corriente. Vea mi respuesta aquí para saber qué significa stream, en detalle: http://stackoverflow.com/questions/6010864/why-copying-stringstream-is-not-allowed/6010930#6010930 – Nawaz

1

Siga usando operator>>, extraerá el resto en piezas delimitadas por espacios en blanco.

+0

mi preocupación es que quiero salir de los espacios en blanco en la cadena restante, estoy tratando de usar subcadena – draw

+0

@DRAW: Ver mi solución! – Nawaz

8
std::istringstream input; 
int extracted; 
input >> extracted; 

OMI, lo más sencillo que posiblemente podría hacer es lo siguiente:

std::stringstream tmp; 
tmp << input.rdbuf(); 
std::string remainder = tmp.str(); 

Esto no es óptima en términos de rendimiento. De lo contrario, acceda directamente al stringbuffer (probablemente usando rbuf().pubseekpos y tellg en la transmisión ... no lo he probado).

+0

Entonces, ¿'rdbuf()' almacena la cadena restante? – draw

+0

rdbuf() _implements_ el búfer para la secuencia; Creo que almacena todos los datos, incluidos los datos ya extraídos. Ahora, 'operator <<' para un 'streambuf' se define de tal manera, que hará _ lo correcto_ sin tener que preocuparse por la posición del flujo. – sehe

5

std::getline

 
Se añade este texto para ajustarse a la siguiente SILLYRULE: "El cuerpo debe ser de al menos 30 caracteres; que ha introducido 14"
 

2

Alternativamente, si usted necesita el resto de la cadena textual puede utilizar std::getline(my_stringstream, result, EOF) donde result es una std::string que contiene el resultado.

+0

El delimitador solo puede ser un char, y un EOF real no está expuesto a 'getline', por lo que se interpretará como el char' \ xff' (la macro EOF se define como '(-1)'). Solo parece funcionar si ese personaje no está presente en la cadena. – alexisdm

15
#include <iostream> 
#include <sstream> 
#include <string> 
using namespace std; 

int main() 
{ 
    string str("123 abc"); 
    int a; 
    istringstream is(str); 
    is >> a; 

    // here we extract a copy of the "remainder" 
    string rem(is.str().substr(is.tellg())); 

    cout << "Remaining: [" << rem << "]\n"; 
} 
Cuestiones relacionadas