Pregunta

Cómo forzar std :: operador stringstream >> leer una cadena entera en lugar de detenerse en el primer espacio en blanco?

Tengo una clase de plantilla que almacena un valor leído de un archivo de texto:

template <typename T>
class ValueContainer
{
protected:
  T m_value;

public:
  /* ... */
  virtual void fromString(std::string & str)
  {
    std::stringstream ss;
    ss << str;
    ss >> m_value;
  }
  /* ... */
};

He intentado banderas flujo de armado / desarmado, pero no sirvió de nada.

Aclaración

La clase es una plantilla recipiente con conversión automática a / de T. Strings tipo son sólo una instancia de la plantilla, se debe también el apoyo de otros tipos también. Por eso, quiero forzar operador >> para imitar el comportamiento de std :: getline.

¿Fue útil?

Solución

Como operador >> no satisface nuestro requisito cuando T = cadena, podemos escribir una función específica para [= cadena L] caso. Esto puede no ser la solución correcta. Pero, como han mencionado trabajo alrededor.

Por favor, corríjanme si no va a satisfacer sus necesidades.

He escrito un código de ejemplo de la siguiente manera:

#include <iostream>
#include <sstream>
#include <string>

using namespace std;

template <class T>
class Data
{
    T m_value;
    public:
    void set(const T& val);
    T& get();
};

template <class T>
void Data<T>::set(const T& val)
{
    stringstream ss;
    ss << val;
    ss >> m_value;
}

void Data<string>::set(const string& val)
{
    m_value = val;
}

template <class T>
T& Data<T>::get()
{
    return m_value;
}

int main()
{
    Data<int> d;
    d.set(10);
    cout << d.get() << endl;

    Data<float> f;
    f.set(10.33);
    cout << f.get() << endl;

    Data<string> s;
    s.set(string("This is problem"));
    cout << s.get() << endl;
}

Otros consejos

Aquí es una solución:

std::istream & ReadIntoString (std::istream & istr, std::string & str) 
{ 
    std::istreambuf_iterator<char> it(istr), end; 
    std::copy(it, end, std::inserter(str, str.begin())); 
    return istr; 
} 

(Gracias al cartel original en grupo de noticias C ++)

¿Dónde quieres que pare? Si desea leer una línea entera es probable que tenga función getline, si necesita una toda una cadena almacenada en el streamstring objeto su elección es ostringstream :: str método.

Estoy asumiendo que estés crear instancias de esa plantilla con T = std::string. En ese caso se podría utilizar getline:

getline(ss, m_value, '\0');

Sin embargo, esto supone que usted no aceptará nul-personajes como partes válidas de la cadena.

De lo contrario, puede escribir su propio extractor de `T'.

No hay un camino con el operador >> que yo sepa exceptuado escribir su propia faceta (operador >> para en primer carácter para el que isspace (c, getloc ()) es verdadera). Pero hay una función getline en que tiene el comportamiento que desea.

Si puede utilizar Boost a continuación, utilizar impulso :: lexical_cast .

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top