2016-09-11 1 views
1

In meinem Projekt (Unreal Engine 4) habe ich keinen Ausgangsstrom - stattdessen kann ich über UE_LOG Funktion kommunizieren, die so ähnlich wie printf() funktioniert . Das Problem ist, dass ich gerade eine DLL-Bibliothek (ohne Unreal Includes) gemacht habe, die ich über die iostream kommunizieren möchte. Meine Idee ist - innerhalb. DLL-Bibliothek Ich verwende Standard cout, um Nachrichten in Ostream zu schreiben, ich benutze alles davon in Unreal Engine-Funktionen, wo ich ostream in Form von Zeichenfolge und geben Sie es in UE_LOG-Funktion.std :: cout, ostream und andere Arten der Ausgabe Ausgangsstrom

Problem ist, dass ich immer std::cout als Teil der Magie behandelt werde, ohne zu denken, was wirklich innen ist (ich bin ziemlich sicher, dass die meisten von uns taten). Wie kann ich damit umgehen? Einfache Wege werden nicht funktionieren (wie stringstream greifen und es in UE_LOG ausgeben).

+0

Wickeln Sie dieses Zeug, um die 'std :: ostream'-Syntax anzupassen. BIG GRIN: D –

+0

Warum lassen Sie Streams passieren, wenn Sie nur Strings übergeben können? Lassen Sie die Funktionen in der DLL 'std :: string' Argumente, und wenn sie eine Zeichenfolge zurückgeben müssen, dann geben Sie eine' std :: string' zurück. –

+0

@ joachim-pileborg Ja, aber dll-Funktion kann komplizierten Prozess machen, und es würde vor und nach der Ausführung aufrufen müssen - also nur die Schnur greifen wird nicht helfen. –

Antwort

2

Meine Idee ist - innerhalb von .DLL-Bibliothek I Standard cout verwenden, um Nachrichten in Ostream

Sie können tatsächlich den Ausgabepuffer mit std::cout mit Ihrer eigenen Implementierung verwendet ersetzen zu schreiben. Verwenden Sie die std::ostream::rdbuf() Funktion zu tun, (zB aus der Referenz docs):

#include <iostream> 
#include <sstream> 

int main() 
{ 
    std::ostringstream local; 
    auto cout_buff = std::cout.rdbuf(); // save pointer to std::cout buffer 

    std::cout.rdbuf(local.rdbuf()); // substitute internal std::cout buffer with 
     // buffer of 'local' object 

    // now std::cout work with 'local' buffer 
    // you don't see this message 
    std::cout << "some message"; 

    // go back to old buffer 
    std::cout.rdbuf(cout_buff); 

    // you will see this message 
    std::cout << "back to default buffer\n"; 

    // print 'local' content 
    std::cout << "local content: " << local.str() << "\n"; 
} 
+0

Ich weiß nicht, wie man local.rdbuf macht. Denken Sie daran, ich habe Funktion mit Form von printf. Nur Dinge, die ich weitergeben kann, sind c_strings, Integer und so weiter. –

+0

Idee ist sehr gut, aber nur eine Sache, die ich gehen muss, ist std :: ostringstream :: flush Funktion zu überladen (oder etwas anderes zu verantworten, Dinge am Terminal zu löschen) automatisch Dinge in meine Ausgabekonsole zu schreiben (Sie wissen, UE_LOG welche funktioniert wie printf). –

+0

@CheshireCat _ "eine Sache, die ich gehen muss, ist zu überladen' std :: ostringstream :: flush "-Funktion" _ Wenn Sie von Ihrer eigenen Implementierung überladen denke ich ['std :: basic_streambuf :: sync()'] (http://en.cppreference.com/w/cpp/io/basic_streambuf/pubsync) wird dafür verantwortlich sein. –

1

(falls mein bearbeiten nicht positiv bewertet wird)

Von OP: Dank Ihre Hinweise schließlich finde ich, wie man löse mein Problem. Angenommen, ich möchte von cout streamen und es an printf senden (weil ich denke, dass die stdio-Bibliothek iostream überlegen ist). Hier ist, wie ich das tun kann:

#include <iostream> 
#include <sstream> 
#include <cstdio> 

using namespace std; 

class ssbuf : public stringbuf{ 
protected: 
    int sync(){ 
     printf("My buffer: %s",this->str().c_str()); 
     str(""); 
     return this->stringbuf::sync(); 
    } 
}; 


int main(){ 
    ssbuf *buf = new ssbuf(); 
    cout.rdbuf(buf); 
    cout<<"This is out stream "<<"and you cant do anything about it"<<endl; 
    cout<<"(don't) "<<"Vote Trump"<<endl; 
} 

Code ist sehr roh, aber es ist seine Aufgabe. Ich habe Kind-Klasse von Puffer, die Methode Sync() Downcasting ursprünglichen virtuellen Methode Sync(). Abgesehen davon funktioniert es wie gewöhnlicher Puffer, greift einfach alle Konsolen-Out-Streams - genau das, was wir wollten. Das str ("") innen ist, um den Puffer zu reinigen - wahrscheinlich nicht ausgegebenen Stream nicht selbst reinigen.

Vielen Dank für Ihre Hilfe! Großer GRIN für dich! : D