Herzlich Willkommen, lieber Gast!
  Sie befinden sich hier:

  Forum » C / C++ (ANSI-Standard) » Stream-Ausgabe: Streams verknüpfen

Forum | Hilfe | Team | Links | Impressum | > Suche < | Mitglieder | Registrieren | Einloggen
  Quicklinks: MSDN-Online || STL || clib Reference Grundlagen || Literatur || E-Books || Zubehör || > F.A.Q. < || Downloads   

Autor Thread - Seiten: > 1 < [ 2 ]
000
18.08.2006, 15:03 Uhr
Steve06



Hallo,

mein Anliegen ist schnell erklärt:

Ich möchte folgendes realisieren:

Die am Bildschirm ausgegebenen Daten sollen auch gleichzeitig in einem Logfile gespeichert werden, da ich die Bildschirmansicht nicht beliebig hochscrollen kann, nachdem ein Programm gelaufen ist, und ich somit nicht alle angezeigten Informationen überprüfen kann.

Also wenn fs ein filestream sei möchte ich mir ersparen schreiben zu müssen
cout << "datenausgabe xyz...";
fs << "datenausgabe xyz...";

und stattdessen einfach schreiben können
log << "datenausgabe xyz..."

D.h. anstatt an zwei Streams Daten auszugeben möchte ich nur an einen ausgeben können (log), so dass dieser letzterer die Datenausgabe sowohl an cout als auch an fs weiterleitet.

Wie lässt sich das realisieren?
Indem ich eine log-Klasse erstelle und den Operator<< überlade? Mir ist das nicht zufriedenstellend gelungen.

Oder log einfach als ostream deklarieren, genauso wie cout - und dann?

Danke für Eure Hilfe.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
001
18.08.2006, 16:22 Uhr
Th



Müßte mittels einer Log-Klasse einfach funktionieren:
z.B. (ungetestet)

C++:
class Log
{
public:
    Log(ostream& os1, ostream &os2)
         : m_os1(os1), m_os2(os2)
    {}

    Log& operator<<(const std::string& s);
  
private:
    ostream &m_os1;
    ostream &m_os2;
};

Log& Log::operator <<(const std::string& s)
{
    m_os1 << s;
    m_os2 << s;

    return log;
}



Für andere Datentypen (z.B. int) müßtest du dann entsprechende Überladungen schreiben.

Anzuwenden dann folgendermaßen:

C++:
   Log log(cout, fs);

   log << "log it";


Dieser Post wurde am 18.08.2006 um 16:24 Uhr von Th editiert.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
002
18.08.2006, 16:50 Uhr
Steve06



super, vielen lieben dank.

aber was ist mit dem "return log" am ende? es ist nicht klar, was du mit log meinst, das ist nicht deklariert und wird auch nicht kompiliert.

Ich habe es wie folgt gelöst und es scheint zu funktionieren:

C++:
Log operator<<(const std::string& s)
{
        m_os1 << s;
        m_os2 << s;
        return Log(m_os1,m_os2);
}



Siehst Du das als korrekt an oder siehst Du Optimierungspotential?

Oder wäre es besser bei einer Rückgabereferenz zu bleiben, wobei das zurückgegebene Objekt dann statisch sein muss?


C++:
Log& operator<<(const std::string& s)
{
        m_os1 << s;
        m_os2 << s;
        static Log temp(m_os1,m_os2);
        return temp;
}



Ich habe z.B. eine Klasse Datum, die den operator<< als friend überladen hat. Muss ich Datum in der Log-Klasse nochmals explizit überladen?

beste grüße

Dieser Post wurde am 18.08.2006 um 17:48 Uhr von Steve06 editiert.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
003
18.08.2006, 18:02 Uhr
0xdeadbeef
Gott
(Operator)



C++:
return *this;


meint er. Und ne Referenz musste schon zurückgeben. Die Idee ist, nachher

C++:
Log log(std::cout, std::cerr);

log << foo << bar << baz;


schreiben zu können.
--
Einfachheit ist Voraussetzung für Zuverlässigkeit.
-- Edsger Wybe Dijkstra

Dieser Post wurde am 18.08.2006 um 18:03 Uhr von 0xdeadbeef editiert.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
004
18.08.2006, 19:44 Uhr
Spacelord
Hoffnungsloser Fall



Zitat von Th:
Müßte mittels einer Log-Klasse einfach funktionieren:
z.B. (ungetestet)

C++:
Log& Log::operator <<(const std::string& s)
{
    m_os1 << s;
    m_os2 << s;

    return log;
}



Für andere Datentypen (z.B. int) müßtest du dann entsprechende Überladungen schreiben.




Oder mit nem template die zahlreichen Überladungen von ostream nutzen.

C++:
    template<typename data_type>
    Log& operator<<(const data_type& data)
    {
        m_os1<<data;
        m_os2<<data;

        return *this;
    }



Gruss Spacelord
--
.....Ich mach jetzt nämlich mein Jodeldiplom.Dann hab ich endlich was Eigenes.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
005
18.08.2006, 20:00 Uhr
Steve06



Wow, das mit dem Template ist spitze! Ich brauche somit nicht mehr alle meine selbstdefinierten Klassen einzeln zu überladen.

Vielen Dank an alle!
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
006
18.08.2006, 20:31 Uhr
Spacelord
Hoffnungsloser Fall



Zitat von Steve06:
Wow, das mit dem Template ist spitze! Ich brauche somit nicht mehr alle meine selbstdefinierten Klassen einzeln zu überladen.

Vielen Dank an alle!


...sofern deine selbstdefinierten Klassen nen operator<< bieten
--
.....Ich mach jetzt nämlich mein Jodeldiplom.Dann hab ich endlich was Eigenes.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
007
18.08.2006, 21:17 Uhr
Steve06



jo, den Operator<< haben sie natürlich, und deswegen lässt sich das alles so leicht verzahnen nun.

Aber jetzt habe ich doch noch eine Bonusfrage:
Bei log << endl; kommen Fehlermeldungen.
Was ist das Problem mit endl?
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
008
18.08.2006, 23:12 Uhr
Spacelord
Hoffnungsloser Fall



C++:
    Log& operator<<(ostream&(*pf)(ostream&))
    {
        m_os1<<pf;
        m_os2<<pf;

        return *this;
    }



Gruss Spacelord
--
.....Ich mach jetzt nämlich mein Jodeldiplom.Dann hab ich endlich was Eigenes.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
009
19.08.2006, 01:41 Uhr
Steve06



ah, also muss noch ein Funktionszeiger überladen werden - vielen Dank spacelord!
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
Seiten: > 1 < [ 2 ]     [ C / C++ (ANSI-Standard) ]  


ThWBoard 2.73 FloSoft-Edition
© by Paul Baecher & Felix Gonschorek (www.thwboard.de)

Anpassungen des Forums
© by Flo-Soft (www.flo-soft.de)

Sie sind Besucher: