Hypercell ein ] Hypercell aus ] Zeige Navigation ] Verstecke Navigation ]
c++.de  
   
Forentreff 2012     
Bücher-Shop mit Amazon (Buchkategorien)C++ : Referenzen zu C++ : C++ Builder : Visual C++ : C# : Java : Spieleprogrammierung : Systemprogrammierung Linux : Software-Entwicklung : .NET : Compilertechnik : Algorithmen & Datenstrukturen : Objektorientierung : Entwurfsmuster : UML : eXtreme Programming : Scrum : Projektmanagement : Software-Testing : Datenbanken : Tom DeMarco : Dilbert : User Friendly
C/C++ Forum :: C++ (auch C++0x und C++11) ::  std::cout umleiten  
Gehen Sie zu Seite 1, 2  Weiter
  Zeige alle Beiträge auf einer Seite
Auf Beitrag antworten
Autor Nachricht
polignome
Mitglied

Benutzerprofil
Anmeldungsdatum: 24.07.2006
Beiträge: 5
Beitrag 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
Beitrag .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
Beitrag 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 :mad:, 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... :live:

Gruß und hallo Community
Spanky
.filmor
Mitglied

Benutzerprofil
Anmeldungsdatum: 27.05.2005
Beiträge: 2352
Beitrag .filmor Mitglied 16:02:28 24.07.2006   Titel:              Zitieren

cout ^= Console-Out. Mach lieber einen neuen Stream. Dafür gibt es zwei Wege:
1. "zu Fuß"
2. Mit Boost.Iostreams
.awe=)
Unregistrierter




Beitrag .awe=) Unregistrierter 16:08:07 24.07.2006   Titel:              Zitieren

cout ^= Character-Out
Spankmaster79
Mitglied

Benutzerprofil
Anmeldungsdatum: 24.07.2006
Beiträge: 11
Beitrag 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? :confused:

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
Beitrag 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
Beitrag .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




Beitrag 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;
}

:confused:
Spankmaster79
Mitglied

Benutzerprofil
Anmeldungsdatum: 24.07.2006
Beiträge: 11
Beitrag 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? :confused:

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... :mad: bin ich doch schon dabei... mir fehlt halt noch bisschen das Verständnis dafür :die:


Zuletzt bearbeitet von Spankmaster79 am 08:57:33 25.07.2006, insgesamt 2-mal bearbeitet
C/C++ Forum :: C++ (auch C++0x und C++11) ::  std::cout umleiten  
Gehen Sie zu Seite 1, 2  Weiter
Auf Beitrag antworten

Zeige alle Beiträge auf einer Seite




Nächstes Thema anzeigen
Vorheriges Thema anzeigen
Sie können Beiträge in dieses Forum schreiben.
Sie können auf Beiträge in diesem Forum antworten.
Sie können Ihre Beiträge in diesem Forum nicht bearbeiten.
Sie können Ihre Beiträge in diesem Forum nicht löschen.
Sie können an Umfragen in diesem Forum nicht mitmachen.

Powered by phpBB © 2001, 2002 phpBB Group :: FI Theme

c++.de ist Teilnehmer des Partnerprogramms von Amazon Europe S.à.r.l. und Partner des Werbeprogramms, das zur Bereitstellung eines Mediums für Websites konzipiert wurde, mittels dessen durch die Platzierung von Werbeanzeigen und Links zu amazon.de Werbekostenerstattung verdient werden kann.

Die Vervielfältigung der auf den Seiten www.c-plusplus.de, www.c-plusplus.info, www.c-sar.de, www.c-plusplus.net und www.baeckmann.de enthaltenen Informationen ohne eine schriftliche Genehmigung des Seitenbetreibers ist untersagt (vgl. §4 Urheberrechtsgesetz). Die Nutzung und Änderung der vorgestellten Strukturen und Verfahren in privaten und kommerziellen Softwareanwendungen ist ausdrücklich erlaubt, soweit keine Rechte Dritter verletzt werden. Der Seitenbetreiber übernimmt keine Gewähr für die Funktion einzelner Beiträge oder Programmfragmente, insbesondere übernimmt er keine Haftung für eventuelle aus dem Gebrauch entstehenden Folgeschäden.