C ++: ¿qué beneficios ofrecen los flujos de cuerda?
-
22-09-2019 - |
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?
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::stream
s 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.