Korrektes Überladen eines Stringbufs zum Ersetzen von cout in einer MATLAB-mex-Datei

8

MathWorks erlaubt derzeit nicht, cout aus einer mex-Datei zu verwenden, wenn der MATLAB-Desktop geöffnet ist, da sie stdout umgeleitet haben. Ihre aktuelle Problemumgehung bietet eine Funktion mexPrintf, die Sie stattdessen anfordern . Nachdem ich etwas gegoogelt habe, denke ich, dass es möglich ist, die Klasse std :: stringbuf zu erweitern, um das zu tun, was ich brauche. Hier ist, was ich bisher habe. Ist das robust genug oder gibt es andere Methoden, die ich überlasten muss oder einen besseren Weg, dies zu tun? (Suche nach Portabilität in einer allgemeinen UNIX-Umgebung und der Fähigkeit, std :: cout als normal zu verwenden, wenn dieser Code nicht mit einer ausführbaren mex-Datei verknüpft ist)

%Vor%     
user27315 28.10.2008, 15:17
quelle

4 Antworten

9

Sie wollen std :: stringbuf nicht wirklich überladen, wenn Sie std :: streambuf oder std :: basic_streambuf überladen möchten (wenn Sie mehrere Zeichentypen unterstützen wollen), müssen Sie auch die Überlaufmethode außer Kraft setzen .

Aber ich denke auch, dass Sie Ihre Lösung für Ihr Problem überdenken müssen.

cout ist nur ein Ostream. Wenn also alle Klassen / Funktionen einen Ostream erhalten, können Sie alles einfügen, was Ihnen gefällt. z.B. cout, ofstream, usw.

Wenn das zu schwer ist, würde ich meine eigene Version von cout erstellen, vielleicht mycout genannt, die entweder zur Compilerzeit oder zur Laufzeit definiert werden kann (je nachdem, was Sie tun wollen).

Eine einfache Lösung könnte sein:

%Vor%

Und die Cout-Version könnte einfach sein:

%Vor%

Eine Laufzeitversion ist ein bisschen mehr Arbeit, aber leicht machbar.

    
Shane Powell 28.10.2008, 19:46
quelle
9

Shane, vielen Dank für deine Hilfe. Hier ist meine letzte Arbeitsimplementierung.

%Vor%

...

%Vor%

...

%Vor%

...

%Vor%     
user27315 30.10.2008 01:28
quelle
1

Ich habe die endgültige Implementierung des OP ein wenig geändert und einen Konstruktor und einen Destruktor hinzugefügt. Das Erstellen eines Objekts dieser Klasse ersetzt automatisch den Stream-Puffer in std::cout . Wenn das Objekt den Gültigkeitsbereich verlässt, wird der ursprüngliche Stream-Puffer wiederhergestellt. RAII!

%Vor%

Um den Stream-Puffer in einer MEX-Datei zu verwenden, einfach:

%Vor%

... und mach dir keine Sorgen darüber, etwas zu vergessen.

    
Cris Luengo 22.12.2016 05:42
quelle
0

cout ist ein bestimmter Zeichenausgabestrom. Wenn Sie ein cout verwenden möchten, das in eine Datei schreibt, verwenden Sie ein fstream , insbesondere ein ofstream . Sie haben dieselbe Schnittstelle wie cout . Zusätzlich können Sie, wenn Sie ihren Puffer (mit rdbuf ) greifen möchten.

    
Max Lybbert 28.10.2008 18:19
quelle

Tags und Links