Du bist nicht angemeldet.

Stilllegung des Forums
Das Forum wurde am 05.06.2023 nach über 20 Jahren stillgelegt (weitere Informationen und ein kleiner Rückblick).
Registrierungen, Anmeldungen und Postings sind nicht mehr möglich. Öffentliche Inhalte sind weiterhin zugänglich.
Das Team von spieleprogrammierer.de bedankt sich bei der Community für die vielen schönen Jahre.
Wenn du eine deutschsprachige Spieleentwickler-Community suchst, schau doch mal im Discord und auf ZFX vorbei!

Werbeanzeige

Das Gurke

Community-Fossil

  • »Das Gurke« ist der Autor dieses Themas

Beiträge: 1 996

Wohnort: Pinneberg

Beruf: Schüler

  • Private Nachricht senden

11

05.01.2008, 18:33

War ja nur der brachialversuch ;) Da ich durch die Definition auch nicht so recht durchsteige wollte ich das zumindest mal ausprobieren. Und es zeigt immerhin, dass ich mir auch selber Gedanken mache xD

Das Gurke

Community-Fossil

  • »Das Gurke« ist der Autor dieses Themas

Beiträge: 1 996

Wohnort: Pinneberg

Beruf: Schüler

  • Private Nachricht senden

12

05.01.2008, 18:50

Mittlerweile bin ich doch bei Drakons Templatevorschlag gelandet, schaut bei mir so aus:

C-/C++-Quelltext

1
2
3
4
5
6
7
8
template<class T>
        Output& operator <<  (const T& t)
        {
            std::cout << t;
            mLog << t;

            return (*this);
        }

Funktioniert für Sachen a la const char*, int, double etc wunderbar. Nur bei std::endl wieder nicht, weils eben mehrdeutig aufgelöst werden kann. Hat noch wer ideen?

13

05.01.2008, 19:10

? Mach dir halt dein eigenes std::endl. Es ist eine einfache Funktion ... übergeben wird eine ostream-Referenz und diese wird auch wieder zurück gegeben. Dann muss du nur in deinen Output nen '\n' reinschreiben und dann ne Funktion flush aufrufen ...
Devil Entertainment :: Your education is our inspiration
Der Spieleprogrammierer :: Community Magazin
Merlin - A Legend awakes :: You are a dedicated C++ (DirectX) programmer and you have ability to work in a team? Contact us!
Siedler II.5 RttR :: The old settlers-style is comming back!

Also known as (D)Evil

Das Gurke

Community-Fossil

  • »Das Gurke« ist der Autor dieses Themas

Beiträge: 1 996

Wohnort: Pinneberg

Beruf: Schüler

  • Private Nachricht senden

14

05.01.2008, 19:55

Ganz blöde Frage: Wie schreib ich denn ne Funktion die ohne () aufgerufen wird? Oder wie macht man das bei endl?

grek40

Alter Hase

Beiträge: 1 491

Wohnort: Dresden

  • Private Nachricht senden

15

05.01.2008, 21:48

Endl geht über Funktionspointer -> deswegen auch der Aufruf ohne ()

C-/C++-Quelltext

1
2
3
4
5
6
7
    Output& Output::operator << (basic_ostream<char,char_traits<char>>& (*fPtr) (basic_ostream<char,char_traits<char>>&) )
    {
        fPtr(std::cout);
        fPtr(mLog); // geht natürlich nur, wenn mLog irgendeine Ableitung von std::basic_ostream<char> als Typ hat.


        return (*this);
    }

Das Gurke

Community-Fossil

  • »Das Gurke« ist der Autor dieses Themas

Beiträge: 1 996

Wohnort: Pinneberg

Beruf: Schüler

  • Private Nachricht senden

16

07.01.2008, 19:04

Der Tipp hats gebracht, ich habs nun zu 99% drinnen. Dank eurer Hilfe habe ich nun, zusammengefasst, folgende Klasse. Vorab, der Compiler meckert noch :(

C-/C++-Quelltext

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
//! Routes output to a file and to std::cout

    class Output
    {
    public:
        Output(void);
        ~Output(void);

        void pause(void) const;

        //! Works like a normal output stream

        template<class T>
        const Output& operator <<  (const T& t) const
        {
            std::cout << t;
            mLog << t; // Hier aber ein Fehler :(


            return (*this);
        }

        static std::basic_ostream<char,std::char_traits<char> >& endl(std::basic_ostream<char,std::char_traits<char> >& s)
        {
            s.put('\n');
            s.flush();

            return (s);
        }

    private:
        std::ofstream mLog;
    };
Grek hatte ja schon angemerkt, dass es für mLog recht strenge Vorgaben gibt, die std::ofstream anscheinend nicht erfüllt :( Zumindest schluckt dessen << Operator weniger, als der von std::cout. Folgende Fehlermeldung:

C-/C++-Quelltext

1
Fehler  1   error C2678: Binärer Operator '<<': Es konnte kein Operator gefunden werden, der einen linksseitigen Operanden vom Typ 'const std::ofstream' akzeptiert (oder keine geeignete Konvertierung möglich)  f:\projekte\word\word - server\src\Output.h 28
Könnte mir nochmal jemand dabei helfen? Ich ging eigentlich davon aus, dass sich std::cout wie ein filestream verhalten würde, was ja anscheinend nicht der Fall ist.

17

07.01.2008, 20:01

Irgendwie gibt dein Programm noch nicht soviel sind ... was für ein Stream ist mLog? Also wo soll die Ausgabe landen?
Willst du einfach einen Stream haben, dessen Ausgabe in 2 Ausgabestreams landet? Das geht anders ...

Dein endl ist einfach ... falsch!

Und warum löst du manchmal std::ostream auf (std::basic_ostream<char ... >)?
Devil Entertainment :: Your education is our inspiration
Der Spieleprogrammierer :: Community Magazin
Merlin - A Legend awakes :: You are a dedicated C++ (DirectX) programmer and you have ability to work in a team? Contact us!
Siedler II.5 RttR :: The old settlers-style is comming back!

Also known as (D)Evil

Das Gurke

Community-Fossil

  • »Das Gurke« ist der Autor dieses Themas

Beiträge: 1 996

Wohnort: Pinneberg

Beruf: Schüler

  • Private Nachricht senden

18

07.01.2008, 20:06

Zitat von »"Deviloper"«

Irgendwie gibt dein Programm noch nicht soviel sind ... was für ein Stream ist mLog? Also wo soll die Ausgabe landen?
Willst du einfach einen Stream haben, dessen Ausgabe in 2 Ausgabestreams landet? Das geht anders ...
mLog ist n std::ofstream und wird momentan einfach mit std::ofstream("log.txt") initialisiert. Das geht anders? Wäre sehr schön, nur wie ^^

Zitat

Dein endl ist einfach ... falsch!
Und warum löst du manchmal std::ostream auf (std::basic_ostream<char ... >)?
Falsch inwiefern? Ich hab im wesentlichen hier abgeschrieben xD Aber das mit dem augelösten ofstream ist echt bizarr, das kann sogar ich korrigieren xD

19

07.01.2008, 20:29

Ehm man geht hin und Arbeitet direkt auf Buffer-Ebene ...

C-/C++-Quelltext

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
#include <streambuf>

namespace log
{
    class two_streambuf : public std::streambuf
    {
        std::streambuf*        m_first;
        std::streambuf*        m_second;

        std::char_traits<char>::int_type overflow(std::char_traits<char>::int_type c)
        {
            if (std::char_traits<char>::eq_int_type(c, std::char_traits<char>::eof()) == true)
                return std::char_traits<char>::not_eof(c);

            c = m_first->sputc(c);
            if (std::char_traits<char>::eq_int_type(c, std::char_traits<char>::eof()) == false)
                c = m_second->overflow();
           
            return c;
        }

        int sync()
        { return (m_first->sync() != -1 ? m_second->sync() : -1); }

    public:
        explicit two_streambuf (std::streambuf* ptr_first, std::streambuf* ptr_second)
            : m_first(ptr_first), m_second(ptr_second)
        {}
    };
};



Jetzt musst du nur für den Stream, den du zum Ausgeben für die beiden Streams haben willst, den neuen Buffer setzen:

C-/C++-Quelltext

1
2
3
4
5
6
7
8
int main() 
{
    std::ofstream file_stream("log.txt");
    
    log::two_streambuf buffer(std::cout.rdbuf(), file_stream.rdbuf());
    std::clog.rdbuf(&buffer);
    std::clog << "Das ist mein erster String!" << std::endl;
}
so sollte die Ausgabe von std::clog in std::cout und file_stream umgeleitet werden.

Bearbeitung
Tippfehler rausgenommen!
Devil Entertainment :: Your education is our inspiration
Der Spieleprogrammierer :: Community Magazin
Merlin - A Legend awakes :: You are a dedicated C++ (DirectX) programmer and you have ability to work in a team? Contact us!
Siedler II.5 RttR :: The old settlers-style is comming back!

Also known as (D)Evil

Das Gurke

Community-Fossil

  • »Das Gurke« ist der Autor dieses Themas

Beiträge: 1 996

Wohnort: Pinneberg

Beruf: Schüler

  • Private Nachricht senden

20

07.01.2008, 20:32

Au Mann, du bist grad zu meiner Gottheit geworden *g* Hatte std::clog und cerr völlig verdrängt :oops: Ich kanns grad nicht testen, aber es ist so herrlich logisch ... Danke!

Werbeanzeige