web-dev-qa-db-fra.com

obtenir une sortie cout dans un std :: string

J'ai la déclaration cout suivante. J'utilise des tableaux de caractères parce que je dois passer à vsnprintf pour convertir une liste d'arguments variables et stocker dans Msg.

Existe-t-il un moyen d'obtenir une sortie cout en C++ std::string?

char Msg[100];
char appname1[100];
char appname2[100];
char appname3[100]; 

// I have some logic in function which some string is assigned to Msg.
std::cout << Msg << " "<< appname1 <<":"<< appname2 << ":" << appname3 << " " << "!" << getpid() <<" " << "~" << pthread_self() << endl;
29
venkysmarty

Vous pouvez remplacer cout par un stringstream .

std::stringstream buffer;
buffer << "Text" << std::endl;

Vous pouvez accéder à la chaîne en utilisant buffer.str().

53
Björn Pollex

Vous pouvez utiliser std :: stringstream

http://www.cplusplus.com/reference/iostream/stringstream/

5
graphite

Si vous pouvez modifier le code, utilisez ostringstream (ou stringstream) au lieu de cout.

Si vous ne pouvez pas modifier le code et que vous souhaitez "capturer" ce qui est en cours de sortie, vous pouvez rediriger votre sortie ou la diriger.

Il est alors possible que votre processus lise le fichier ou récupère les informations transmises via la mémoire partagée.

3
CashCow
#include <stdio.h>

#include <iostream>
#include <string>
#include <sstream>

// This way we won't have to say std::ostringstream or std::cout or std::string...
using namespace std;

/** Simulates system specific method getpid()... */
int faux_getpid(){
    return 1234;
}

/** Simulates system specific method pthread_self()... */
int faux_pthread_self(){
    return 1111;
}

int main(int argc, char** argv){

    // Create a char[] array of 100 characters...
    // this is the old-fashioned "C" way of storing a "string"
    // of characters..
    char Msg[100];


    // Try using C++-style std::string rather than char[],
    // which can be overrun, leading to 
    // a segmentation fault.
    string s_appname1; 

    // Create old-fashioned char[] array of 100 characters...
    char appname2[100];

    // Create old-fashioned char[] array of 100 characters...
    char appname3[100]; 

    // Old-fashioned "C" way of copying "Hello" into Msg[] char buffer...
    strcpy(Msg, "Hello");

    // C++ way of setting std::string s_appname equal to "Moe"...
    s_appname1 = "Moe";

    // Old-fashioned "C" way of copying "Larry" into appname2[] char buffer...
    strcpy(appname2, "Larry");

    // Old-fashioned "C" way of copying "Shemp" into appname3[] char buffer...
    strcpy(appname3, "Shemp");

    // Declare le_msg to be a std::ostringstream...
    // this allows you to use the C++ "put-to" operator <<
    // but it will "put-to" the string-stream rather than
    // to the terminal or to a file...
    ostringstream le_msg;

    // Use put-to operator << to "write" Msg, s_appname1, s_appname2, etc...
    // to the ostringstream...not to the terminal...
    le_msg << Msg << " "<< s_appname1 <<":"<< appname2 << ":" << appname3 << " " << "!" << faux_getpid() <<" " << "~" << faux_pthread_self();

    // Print the contents of le_msg to the terminal -- std::cout --
    // using the put-to operator << and using le_msg.str(),
    // which returns a std::string.
    cout << "ONE: le_msg = \"" << le_msg.str() << "\"..." << endl;

    // Change contents of appname3 char[] buffer to "Curly"...
    strcpy(appname3, "Curly");

    // Clear the contents of std::ostringstream le_msg
    // -- by setting it equal to "" -- so you can re-use it.
    le_msg.str(""); 

    // Use put-to operator << to "write" Msg, s_appname1, s_appname2, etc...
    // to the newly cleared ostringstream...not to the terminal...
    // but this time appname3 has been set equal to "Curly"...
    le_msg << Msg << " "<< s_appname1 <<":"<< appname2 << ":" << appname3 << " " << "!" << faux_getpid() <<" " << "~" << faux_pthread_self();

    // Print the new contents of le_msg to the terminal using the  
    // put-to operator << and using le_msg.str(),
    // which returns a std::string.
    cout << "TWO: le_msg = \"" << le_msg.str() << "\"..." << endl;

    // This time, rather than using put-to operator << to "write"
    // to std::ostringstream le_msg, we'll explicitly set it equal
    // to "That's all Folks!"
    le_msg.str("That's all Folks!");

    // Print the new contents of le_msg "That's all Folks!" to  
    // the terminal via le_msg.str()
    cout << "THREE: le_msg = \"" << le_msg.str() << "\"..." << endl;

    // Exit main() with system exit value of zero (0), indicating
    // success...
    return 0;

}/* main() */

SORTIE:

ONE: le_msg = "Hello Moe:Larry:Shemp !1234 ~1111"...
TWO: le_msg = "Hello Moe:Larry:Curly !1234 ~1111"...
THREE: le_msg = "That's all, folks!"...
0
John D Aynedjian