Leería primero la línea y convertiría la primera y la última palabra en enteros. Sin apretar:
std::string line;
std::getline(infile, line);
size_t ofs_front = line.find(' ');
size_t ofs_back = line.rfind(' ');
int front = std::strtol(line.substr(0, ofs_front).c_str(), NULL, 0);
int back = std::strtol(line.substr(ofs_back).c_str(), NULL, 0);
std::string text = line.substr(ofs_front, ofs_back - ofs_front);
Vas a tener que hacer algunas modificaciones para deshacerse de los espacios (por ejemplo, incrementar los desplazamientos de engullir todos los espacios), y se debe añadir un montón de comprobación de errores.
Si desea normalizar todos los interiores espacios dentro del texto, entonces no hay otra solución utilizando flujos de cadena:
std::vector<std::string> tokens;
{
std::istringstream iss(line);
std::string token;
while (iss >> token) tokens.push_back(token);
}
// process tokens.front() and tokens.back() for the integers, as above
std::string text = tokens[1];
for (std::size_t i = 2; i + 1 < tokens.size(); ++i) text += " " + tokens[i];
Al leer una línea a la vez, puede compilar un analizador de subcadenas que le permite enumerar los segmentos utilizando varios terminadores arbitrarios. La respuesta de Kerrek es genial, pero si necesita hacer este tipo de cosas con bastante frecuencia, y necesita una herramienta general de alta eficiencia, ese es el enfoque que encontré que funcionó mejor para nosotros – Mordachai