Pregunta

podría alguien decirme acerca de algunos ejemplos prácticos sobre el uso de flujos de cadena en C ++, es decir inputing y outputing a una corriente cadena utilizando los operadores de extracción de inserción de flujo y corriente?

¿Fue útil?

Solución

Puede utilizar las corrientes String 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;
}

Otros consejos

Los uso 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::streams al uso de tampones de caracteres (extensibilidad ostreams y apoyo locales, tampón de gestión de memoria está oculta y así sucesivamente).

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 ostream parámetro & a mensajes de error informe en.

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

Se puede utilizar en cualquier lugar un flujo normal puede ser utilizado.

Así que en situaciones en las que estaba leyendo de un archivo que potencialmente podría leer de un flujo de cadena.

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);
}

Además de las ventajas hay un punto a considerar cuidadosamente si utiliza gcc 4.3.1. No comprobado que precede versiones de gcc.

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