C++ crear cadena de texto y variables


Estoy tratando de hacer algo muy simple y, sin embargo, después de una hora de buscar una no puedo encontrar una respuesta adecuada, por lo que debo estar perdiendo algo bastante obvio.

Estoy tratando de crear dinámicamente nombres de archivo para su uso con ifstream. Aunque entiendo que hay varios métodos disponibles para hacer esto, me he decidido a crear una cadena std::y usar stringname.c_str para convertir a const.

El problema es, sin embargo, que necesito crear la cadena con una mezcla de variables y valores de texto predefinidos. Estoy recibiendo errores de compilador, así que esto debe ser un problema de sintaxis.

Pseudo

std::string var = "sometext" + somevar + "sometext" + somevar;

Gracias!

Author: Jack Farrow, 2012-04-19

5 answers

¿Has considerado usar stringstreams?

#include <string>
#include <sstream>

std::ostringstream oss;
oss << "sometext" << somevar << "sometext" << somevar;
std::string var = oss.str();
 48
Author: mgiuffrida,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2012-04-18 23:07:57
std::string var = "sometext" + somevar + "sometext" + somevar;

Esto no funciona porque las adiciones se realizan de izquierda a derecha y "sometext" (la primera) es solo un const char *. No tiene operator+ para llamar. La solución más simple es esta:

std::string var = std::string("sometext") + somevar + "sometext" + somevar;

Ahora, el primer parámetro en la lista de izquierda a derecha de las operaciones + es un std::string, que tiene un operator+(const char *). Ese operador produce una cadena, que hace que el resto de la cadena funcione.

También puede hacer que todas las operaciones estén en var, que es un std::string y por lo tanto tiene todo lo necesario operadores:

var = "sometext";
var += somevar;
var += "sometext";
var += somevar;
 19
Author: David Schwartz,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2012-04-18 23:02:34

En C++11 puedes usar std:: to_string :

std::string var = "sometext" + std::to_string(somevar) + "sometext" + std::to_string(somevar);  
 16
Author: drinck,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2014-09-17 16:26:49

Ver también boost::format:

#include <boost/format.hpp>

std::string var = (boost::format("somtext %s sometext %s") % somevar % somevar).str();
 3
Author: Yury,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2013-12-17 09:45:59

También puedes usar sprintf:

char str[1024];
sprintf(str, "somtext %s sometext %s", somevar, somevar);
 2
Author: Shocker,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2012-04-18 22:57:21