getting cout output to a std::string

后端 未结 4 1181
死守一世寂寞
死守一世寂寞 2021-02-05 01:38

I have the following cout statement. I use char arrays because I have to pass to vsnprintf to convert variable argument list and store in Msg

相关标签:
4条回答
  • 2021-02-05 01:45

    If you can change the code then use ostringstream (or stringstream) instead of cout.

    If you cannot change the code and want to "capture" what is being output you can redirect your output or pipe it.

    It may then be possible for your process to read the file or get the piped information through shared memory.

    0 讨论(0)
  • 2021-02-05 01:46

    You can replace cout by a stringstream.

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

    You can access the string using buffer.str().

    To use stringstream you need to use the following libraries:

    #include <string>  
    #include <iostream> 
    #include <sstream>   
    
    0 讨论(0)
  • 2021-02-05 01:50

    You can use std::stringstream

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

    0 讨论(0)
  • 2021-02-05 01:58
    #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() */
    

    OUTPUT:

    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 讨论(0)
提交回复
热议问题