Pregunta

He leído un montón de puestos con respecto a la reorientación de std :: cout a stringstreams, pero estoy teniendo problemas para leer la cadena redirigida.

std::stringstream redirectStream;
std::cout.rdbuf( redirectStream.rdbuf() );

std::cout << "Hello1\n";
std::cout << "Hello2\n";

while(std::getline(redirectStream, str))
{
  // This does not work - as the contents of redirectStream 
  // do not include the '\n' - I only see "Hello1Hello2"
}

Tengo que escoger las nuevas líneas dentro de la salida inicial -? Puede alguien me ilumine en cuanto a cómo hacer eso

Gracias.

¿Fue útil?

Solución

funciona bien para mí:
Nota: el std :: getline () lee la línea (pero no el carácter '\ n', el terminador de línea se tira después de leer cada línea). Sin embargo, el bucle se entró una vez para cada línea.

#include <iostream>
#include <sstream>

int main()
{
    std::stringstream   redirectStream;
    std::streambuf*     oldbuf  = std::cout.rdbuf( redirectStream.rdbuf() );

    std::cout << "Hello1\n";
    std::cout << "Hello2\n";

    std::string str;
    while(std::getline(redirectStream, str))
    {
        fprintf(stdout,"Line: %s\n",str.c_str());
        // loop enter once for each line.
        // Note: str does not include the '\n' character.
    }

    // In real life use RAII to do this. Simplified here for code clarity.
    std::cout.rdbuf(oldbuf);
}

Nota: necesidad para poner la antigua corriente de tampón de vuelta en std :: cout. Una vez que el stringstream 'redirectStream' sale del ámbito su memoria intermedia será destruido dejando std :: cout que apunta a un flujo de tampón válido. Desde std :: cout vive más tiempo que 'redirectStream' que necesita para asegurarse de que std :: cout no tiene acceso a un objeto no válido. Así, la solución más sencilla es volver a poner el búfer de edad.

Otros consejos

Gracias por la respuesta. Puedo especie de ver lo que he hecho mal. Porque me desnudé a cabo una gran cantidad de código para simplificar mi problema, sí que de hecho me publicar una versión de trabajo! Parece que mi lógica real era el problema:

// Basically... 
std::string str; 
std::stringstream redirectstream; 
// perform the redirection... 
// ... 

while (!done)
{ 
  while(std::getline(redirectStream, str)) 
  { 
    // stuff... 
  } 
  std::cout << "Hello1\n"; 
  std::cout << "Hello2\n"; 
} 

Parece que la función getline () ya no parece ser válido en esta situación. Puede usted explicar esto?

Me doy cuenta de que esto es un problema completamente diferente ahora y pido perdón por engañar con un mal mensaje inicial.

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