| Autor |
Nachricht |
polignome
Mitglied
Benutzerprofil
Anmeldungsdatum: 24.07.2006
Beiträge: 5
|
polignome Mitglied
15:03:39 24.07.2006 Titel: |
std::cout umleiten |
Zitieren |
Moin
Ich schlage mich jetzt schon seid längerem mit einem Problem rum und hoffe einer von Euch kann mit helfen.
Ich würde gerne den stream von std::cout für mich nutzen um ihn in meine „ingame-console“ umzuleiten. Eine abgeleitete streambuf Klasse habe ich mir bereits geschrieben und durch dir Überlagerung von „xsputn“ bekomme ich auch einige Ergebnisse. Leider nimmt mein stream
aber nur Daten vom Typ char. Variablen vom Typ integer, float, std::string u.s.w. nimmt er nicht. Hat jemand eine Idee wie das lösen kann?
| C/C++ Code: | 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 | 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 | {
C_MyStream my_stream;
std::cout.rdbuf(&my_stream);
/// geht z.B. :
std::cout<< "BlaBlaBla\n";
std::cout<< "BlaBlaBla "<<"blub"<< "2";
/// geht z.B. nicht :
float f=0.1f;
double d=0.2f;
std::cout<<"test" << 2 << std::endl; // wird nur bis "test" ausgegeben.
std::cout<< f << d <<std::endl;
}
| |
| C/C++ Code: | 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 | {
C_MyStream my_stream;
std::cout.rdbuf(&my_stream);
/// geht z.B. :
std::cout<< "BlaBlaBla\n";
std::cout<< "BlaBlaBla "<<"blub"<< "2";
/// geht z.B. nicht :
float f=0.1f;
double d=0.2f;
std::cout<<"test" << 2 << std::endl; // wird nur bis "test" ausgegeben.
std::cout<< f << d <<std::endl;
}
| |
| C/C++ Code: | 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 | {
C_MyStream my_stream;
std::cout.rdbuf(&my_stream);
/// geht z.B. :
std::cout<< "BlaBlaBla\n";
std::cout<< "BlaBlaBla "<<"blub"<< "2";
/// geht z.B. nicht :
float f=0.1f;
double d=0.2f;
std::cout<<"test" << 2 << std::endl; // wird nur bis "test" ausgegeben.
std::cout<< f << d <<std::endl;
}
| |
|
|
|
|
 |
.filmor
Mitglied
Benutzerprofil
Anmeldungsdatum: 27.05.2005
Beiträge: 2352
|
.filmor Mitglied
15:14:07 24.07.2006 Titel: |
|
Zitieren |
xsputn?!
Ich kenne nur overflow und sync.
Hast du vielleicht irgendwelche Fehlermeldungen? Auch praktisch könnte es sein, deine Streambufferklasse zu sehen... |
|
|
|
 |
Spankmaster79
Mitglied
Benutzerprofil
Anmeldungsdatum: 24.07.2006
Beiträge: 11
|
Spankmaster79 Mitglied
15:57:29 24.07.2006 Titel: |
|
Zitieren |
Servuz,
ich hänge mich hier mal mit rein, da die Überschrift passt und man ja keinen neuen Thread aufmachen muss.
Ich würde auch gern std::cout umleiten, da ich eine CGI Anwendung in C++ geschrieben hab die die Standardausgabe an den Webserver weitergibt. Dieser leitet dann die Daten an den Browser weiter.
Nun arbeite ich mit einem Framework das auch zwischendurch Daten über std::cout ausgibt. Darüber hab ich keine Kontrolle , was mir natürlich die Daten für den Webserver zerstört.
Ich würde nun gerne std::cout auf ein anderes Ausgabemedium als die Konsole bzw. stdout (<- ist es das) umleiten und mir evtl. einen eigenen Stream bauen den ich dann auf die Konsole geben kann, damit der Webserver seine Daten bekommt...
Ich denke mal das passt auch zum Thema std::cout umleiten. Falls nicht mach ich auch gern nen eigenen Thread auf...
Gruß und hallo Community
Spanky |
|
|
|
 |
.filmor
Mitglied
Benutzerprofil
Anmeldungsdatum: 27.05.2005
Beiträge: 2352
|
.filmor Mitglied
16:02:28 24.07.2006 Titel: |
|
Zitieren |
|
 |
.awe=)
Unregistrierter
|
.awe=) Unregistrierter
16:08:07 24.07.2006 Titel: |
|
Zitieren |
|
 |
Spankmaster79
Mitglied
Benutzerprofil
Anmeldungsdatum: 24.07.2006
Beiträge: 11
|
Spankmaster79 Mitglied
16:14:45 24.07.2006 Titel: |
|
Zitieren |
| Zitat: | cout ^= Console-Out. Mach lieber einen neuen Stream. Dafür gibt es zwei Wege:
1. "zu Fuß"
2. Mit Boost.Iostreams |
Danke für die Tips, werde mich der "zu Fuß" Lektüre widmen und rückmelden. Eine Bibliothek einzubinden steht wohl nicht zur Debatte, da der Code klein gehalten werden soll.
Bleibt aber immernoch das Problem wie ich die vom Framework kommenden Ausgaben abfange, oder?
Gruß
EDIT: Also ich bin jetzt mit dem "zu Fuß" Artikel durch...versteh aber noch nicht ganz wie ich mir das zu nutzen machen soll. Ich habe dann zwar einen eigenen Stream, der landet auch auf einer Konsole. Aber die erzeuge ich mir ja....hm.... |
Zuletzt bearbeitet von Spankmaster79 am 16:42:22 24.07.2006, insgesamt 1-mal bearbeitet |
|
 |
polignome
Mitglied
Benutzerprofil
Anmeldungsdatum: 24.07.2006
Beiträge: 5
|
polignome Mitglied
16:23:54 24.07.2006 Titel: |
|
Zitieren |
Auch ich bedanke mich.
Werde mahl etwas experimentieren.
Gruß und Dank Polignome |
|
|
|
 |
.filmor
Mitglied
Benutzerprofil
Anmeldungsdatum: 27.05.2005
Beiträge: 2352
|
.filmor Mitglied
16:25:46 24.07.2006 Titel: |
|
Zitieren |
Sorry, hatte ich überlesen. Du kannst den Streambuffer von cout mit rdbuf ändern:
| C/C++ Code: | streambuf* consolebuffer = std::cout.rdbuf ();
std::cout.rdbuf (&mybuffer);
| |
| C/C++ Code: | streambuf* consolebuffer = std::cout.rdbuf ();
std::cout.rdbuf (&mybuffer);
| |
| C/C++ Code: | streambuf* consolebuffer = std::cout.rdbuf ();
std::cout.rdbuf (&mybuffer);
| |
rdbuf gibt ohne Argumente den alten Streambuffer zurück, mit einem streambuf*-Zeiger setzt es zusätzlich diesen Streambuffer ein. |
|
|
|
 |
haase
Unregistrierter
|
haase Unregistrierter
16:25:59 24.07.2006 Titel: |
|
Zitieren |
| C/C++ Code: | 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 | 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 | // redirecting cout's output
#include <iostream>
#include <fstream>
using namespace std;
int main () {
streambuf *psbuf;
ofstream filestr;
filestr.open ("test.txt");
psbuf = filestr.rdbuf();
cout.rdbuf(psbuf);
cout << "This is written to the file";
filestr.close();
return 0;
}
| |
| C/C++ Code: | 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 | // redirecting cout's output
#include <iostream>
#include <fstream>
using namespace std;
int main () {
streambuf *psbuf;
ofstream filestr;
filestr.open ("test.txt");
psbuf = filestr.rdbuf();
cout.rdbuf(psbuf);
cout << "This is written to the file";
filestr.close();
return 0;
}
| |
| C/C++ Code: | 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 | // redirecting cout's output
#include <iostream>
#include <fstream>
using namespace std;
int main () {
streambuf *psbuf;
ofstream filestr;
filestr.open ("test.txt");
psbuf = filestr.rdbuf();
cout.rdbuf(psbuf);
cout << "This is written to the file";
filestr.close();
return 0;
}
| |
|
|
|
|
 |
Spankmaster79
Mitglied
Benutzerprofil
Anmeldungsdatum: 24.07.2006
Beiträge: 11
|
Spankmaster79 Mitglied
17:04:43 24.07.2006 Titel: |
|
Zitieren |
| Zitat: |
streambuf* consolebuffer = std::cout.rdbuf ();
std::cout.rdbuf (&mybuffer);
rdbuf gibt ohne Argumente den alten Streambuffer zurück, mit einem streambuf*-Zeiger setzt es zusätzlich diesen Streambuffer ein. |
Also wenn ich das jetzt richtig verstehe, erste Zeile leitet cout um in consolebuffer. Und dann setze ich danach cout auf meinen Stream?
EDIT:
Von was für einem Typ muss denn mybuffer sein??? streambuff??? Da bekomm ich die Fehlermeldung: "error: within this context"....
EDIT2:
| .filmor schrieb: | | Lies dir die beiden verlinkten Seiten durch, bevor du nochmal postest. |
Ist ja gut... bin ich doch schon dabei... mir fehlt halt noch bisschen das Verständnis dafür |
Zuletzt bearbeitet von Spankmaster79 am 08:57:33 25.07.2006, insgesamt 2-mal bearbeitet |
|
 |