2012-07-12 8 views
5

Duplicar posibles:
How to reuse an ostringstream?¿Cómo se borra una instancia std :: ostringstream para que se pueda reutilizar?

He estado usando std::ostringstream para convertir float y int valores a cadenas pero no encuentro forma de reutilizar una instancia. Para ilustrar lo que quiero decir aquí es la siguiente, junto con los métodos que he tratado de usar para limpiar la corriente

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

int main() { 
    ostringstream stream; 
    stream << "Test"; 
    cout << stream.str() << endl; 
    stream.flush();     
    stream << "----"; 
    cout << stream.str() << endl; 
    stream.clear(); 
    stream << "****"; 
    cout << stream.str() << endl; 
    return 0; 
} 

genera una salida

Test 
Test---- 
Test----**** 

Esto me está dando un problema ya que estoy teniendo a crear muchas instancias de ostringstream que es un desperdicio. Claramente clear() y flush() no hago lo que necesito así que ¿hay alguna manera de hacer esto? Revisé la documentación al http://www.cplusplus.com/reference/iostream/ostringstream/ pero no hay nada que parezca hacer lo que necesito. ¿Hay alguna forma de restablecer o borrar la transmisión?

Respuesta

18

Utilice stream.str(""); para hacer que la cadena subyacente sea una cadena vacía. Mejor aún, no reutilices los objetos. En C++ la filosofía es hacer que un objeto cuando lo necesite y disponer de ella cuando haya terminado:

{ 
    std::ostringstream oss; 
    oss << 10; 
    std::cout << oss.str(); 
} 

{ 
    std::ostringstream oss; 
    oss << 20.5; 
    std::cout << oss.str(); 
} 

O mejor aún:

std::cout << static_cast<std::ostringstream&>(std::ostringstream() << 10).str(); 
+0

+1: estaba a punto de decir lo mismo exacta cosa. Aunque hacer 'stream.str (" ");' siempre me pareció un hack. –

+2

En general, de acuerdo con su publicación a excepción de la parte que comienza con * O mejor aún: * y el resto que sigue. No podrías pensar que es ** mejor **, ¿verdad? –

+0

@HappyGreenKidNaps: Es solo un ejemplo. Por supuesto, podría escribir 'std :: cout << 10' y terminar con eso. Si necesitaba una cadena, diría 'std :: to_string (10)', supongo. –

10

clear() solo borra los indicadores de error. Este es un error común. Al que desea llamar str(), y pasarlo una cadena vacía para borrar el búfer:

stream.str(""); 

va a hacer lo que quiere.

Cuestiones relacionadas