2010-02-25 12 views
6

podría alguien decirme sobre algunos ejemplos prácticos sobre el uso de secuencias de cadenas en C++, es decir, la entrada y la salida a una secuencia de cadenas mediante la inserción de flujo y operadores de extracción de flujo?C++: ¿qué beneficios ofrecen los flujos de cadenas?

+0

¿Quieres decir cin y cout? ¿A diferencia de C-style getc y printf? –

+2

@Vanessa: OP probablemente significa 'std :: stringstream', (' #include ') – Bill

+0

@Bill: sí, me refiero a esto! –

Respuesta

11

Puede utilizar las corrientes de cuerda para convertir cualquier cosa que implementa operator << en una cadena:

#include <sstream> 

template<typename T> 
std::string toString(const T& t) 
{ 
    std::ostringstream stream; 
    stream << t; 

    return stream.str(); 
} 

o incluso

template <typename U, typename T> 
U convert(const T& t) 
{ 
    std::stringstream stream; 
    stream << t; 

    U u; 
    stream >> u; 

    return u; 
} 
+0

Solo recuerde que esta solución solo funcionará para tipos primitivos y versiones sobrecargadas de 'operator <<' con clases específicas. – fogo

+1

@fogo: Y dado que es relativamente común definir operadores de transmisión para las clases, eso no es tan importante. –

+0

@Martin York De hecho, acabo de considerar un comentario adecuado teniendo en cuenta la frase * convertir cualquier cosa * en la respuesta. – fogo

2

Además de las ventajas es que hay one point to carefully consider si utiliza gcc 4.3.1. No revisé las versiones anteriores de gcc.

+0

Esto era una limitación de una implementación específica (gcc). Si sigue el enlace hasta el error bugzilla asociado con el problema, también notará que el error ha sido marcado resuelto el mutex ya no se usa –

+0

¡Entonces es genial! Editaré mi publicación para agregar información sobre qué información es relevante solo para algunas versiones de gcc. –

2

Se pueden usar en cualquier lugar donde se pueda utilizar una transmisión normal.

Por lo tanto, en situaciones en las que estaba leyendo un archivo, podría leer de una secuencia de cadenas.

void compile(std::istream& str) 
{ 
    CPlusPlusLexer lexer(str); 
    CPlusPlusParser parser(lexer); 
    BackEnd   backend(parser); 

    backend.compile(); 
} 

int main() 
{ 
    std::fstream file("Plop.cpp"); 
    compile(file); 

    std::stringstream test("#include <iostream>\n int main() { std::cout << \"H World\n\";}"); 
    compile(test); 
} 
3

I ellos utilizan principalmente como buffers de memoria, en la creación de mensajes:

if(someVector.size() > MAX_SIZE) 
{ 
    ostringstream buffer; 
    buffer << "Vector should not have " << someVector.size() << " eleements"; 
    throw std::runtime_error(buffer.str()); 
} 

o para construir cadenas complejas:

std::string MyObject::GenerateDumpPath() 
{ 
    using namespace std; 

    std::ostringstream  dumpPath; 

    // add the file name 
    dumpPath << "\\myobject." 
     << setw(3) << setfill('0') << uniqueFileId 
     << "." << boost::lexical_cast<std::string>(state) 
     << "_" << ymd.year 
     << "." << setw(2) << setfill('0') << ymd.month.as_number() 
     << "." << ymd.day.as_number() 
     << "_" << time.hours() 
     << "." << time.minutes() 
     << "." << time.seconds() 
     << ".xml"; 

    return dumpPath.str(); 
} 

Es útil porque trae toda la extensibilidad de std::stream s para usar los búferes de caracteres (la compatibilidad con la extensibilidad y las configuraciones locales de ostreams, la administración de la memoria de búfer está oculta, etc.).

Otro ejemplo que he visto fue el informe de errores en la biblioteca gsoap, mediante la inyección de dependencias:. soap_stream_fault toma un parámetro ostream & reportar mensajes de error en

Si lo desea, puede pasar que std :: cerr std :: cout o una implementación std :: ostringstream (la uso con una implementación std :: ostringstream).

Cuestiones relacionadas