Domanda

Ho letto un sacco di messaggi in materia di reindirizzare std :: cout a stringstreams, ma sto avendo problemi leggendo la stringa reindirizzato.

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"
}

Ho bisogno di individuare le nuove linee all'interno della uscita iniziale -? Qualcuno mi può illuminare su come farlo

Grazie.

È stato utile?

Soluzione

funziona bene per me:
Nota: lo std :: getline () legge la linea (ma non il '\ n' carattere, il terminatore di linea viene gettato via dopo ogni riga viene letta). Ma il ciclo verrà entrò una volta per ogni riga.

#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: necessità per mettere il vecchio flusso-back buffer in std :: cout. Una volta che lo stringstream 'redirectStream' passa nell'ambito suo buffer verrà distrutta lasciando std :: cout punta a un flusso-tampone valido. Dal momento che std :: cout vive più a lungo 'redirectStream' è necessario fare in modo che std :: cout non accede un oggetto non valido. Così la soluzione più semplice è quella di mettere di nuovo il vecchio buffer.

Altri suggerimenti

Grazie per la risposta. Posso sorta di vedere che cosa ho fatto di sbagliato. Perché ho messo a nudo fuori un sacco di codice per semplificare il mio problema, sì l'ho fatto in realtà posto una versione funzionante! Sembra che la mia logica reale era il 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"; 
} 

Sembra che la funzione getline () non sembra essere valido in questa situazione. Si può spiegare questo?

Mi rendo conto che questo è un problema completamente diverso ora e mi scuso per ingannare con un post iniziale cattivo.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top