2011-03-07 29 views
9

Estoy tratando de almacenar los datos que están en un stringstream en un vector. Puedo hacerlo con éxito, pero ignora los espacios en la cadena. ¿Cómo lo hago para que los espacios también se inserten en el vector?C++: stringstream a vector

Gracias!

Código talón:

#include <iostream> 
#include <sstream> 
#include <vector> 

using namespace std; 

int main() 
{ 
    stringstream s; 
    string line = "HELLO HELLO\0"; 

    stringstream stream(line); 

    unsigned char temp; 
    vector<unsigned char> vec; 
    while(stream >> temp) 
     vec.push_back(temp); 


    for (int i = 0; i < vec.size(); i++) 
     cout << vec[i]; 
    cout << endl; 
    return 0; 
} 
+1

Si trata los espacios como parte de los elementos que desea poner en su vector, entonces, ¿qué va a separar un elemento de otro? – James

+2

Aclare si desea que su vector contenga (1) una entrada por carácter, (2) una entrada por "palabra" separada por espacios, o (3) una sola entrada que contenga todo; y, si (2), ¿dónde quieres que vaya el espacio en blanco? [EDITADO para agregar: oh, espera, este es un vector de _unsigned char_? Vaya, lo siento.] –

+0

@Gareth o (4) una palabra por línea – user470379

Respuesta

14

¿Por qué utiliza un stringstream para copiarlo de un string en un vector<unsigned char>? Puede hacer:

vector<unsigned char> vec(line.begin(), line.end()); 

y eso hará la copia directamente. Si necesita utilizar un stringstream, primero debe usar stream >> noskipws.

+0

+1 - solución muy elegante – RageD

+0

¿Por qué esto no funciona para 'vector '? –

2

estoy inclinado a sugerir simplemente utilizando el contenedor que en realidad se quiere, pero también se puede utilizar el manipulador noskipws

Ver this para obtener más información sobre stringstream y otros métodos se puede utilizar además del operador de extracción

Editar:

Considera también std::copy o std::basic_string<unsigned char> por simplicidad.

3

Por defecto, el estándar transmite todos los espacios en blanco salteados. Si desea desactivar la omisión de espacio en blanco que se puede hacer de manera explícita en la siguiente extracción de flujo (>>) el funcionamiento utilizando el manipulador noskipws así:

stream >> std::noskipws >> var; 
+2

Tenga en cuenta que noskipws es persistente; se aplica no solo a "la siguiente extracción de flujo" sino a todas las operaciones posteriores en esa secuencia hasta que haga algo para cancelarla. Para aclarar la intención a los lectores del código, probablemente sea mejor hacer "stream >> std :: noskipws;" como una declaración separada en lugar de incluirla con una extracción particular. (A menos que lo esté encendiendo y apagando en el curso de una sola cadena de >> s. Lo que le recomendaría que no hiciera, por claridad.) –

+0

ahhh, gracias, se olvidó de esa parte. Tengo problemas para mantenerme al día, cuáles afectan solo a la siguiente operación y cuáles no, ya que no utilizo mucho la transmisión de E/S ... principalmente debido a la falta de comprobación y generación de informes de errores de bajo nivel. – diverscuba23

1

Usted quiere que el manipulador noskipws. Diga stream >> std::noskipws; antes de sacar cosas de él.

[EDITADO para agregar el prefijo std::, que estúpidamente omití. Su código no lo necesita porque tiene using namespace std; en la parte superior, pero otros pueden optar por no hacer eso.]