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

21

07.01.2008, 20:43

Habe nun doch einen Compiler zwischen die Finger bekommen *g*

Ich habe die "Forenfehler" aus deinem Code soweit ich konnte entfernt (Klammern, Semikoli, includes etc) habe aber noch drei Fehler, die ich nicht wegbekomme und die mir auch relativ kritisch erscheinen. Aber erstmal "mein" Code mit dem ich teste:

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
31
32
33
34
35
36
37
38
39
40
41
42
#include <streambuf>
#include <iostream>
#include <fstream>

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:
        two_streambuf (std::streambuf* ptr_first, std::streambuf* ptr_second)
            : m_first(ptr_first), m_second(ptr_second)
        {}
    };
}

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;
}
Er spuckt leider noch folgende Fehler:

C-/C++-Quelltext

1
2
3
4
Warnung 1   warning C4805: '==': unsichere Kombination von Typ 'std::char_traits<char>::int_type' mit Typ 'bool' in einer Operation f:\projekte\consoletestapp\main.cpp 14
Fehler  3   error C2248: "std::basic_streambuf<_Elem,_Traits>::sync": Kein Zugriff auf protected Member, dessen Deklaration in der std::basic_streambuf<_Elem,_Traits>-Klasse erfolgte. f:\projekte\consoletestapp\main.cpp 25
Fehler  4   error C2248: "std::basic_streambuf<_Elem,_Traits>::sync": Kein Zugriff auf protected Member, dessen Deklaration in der std::basic_streambuf<_Elem,_Traits>-Klasse erfolgte. f:\projekte\consoletestapp\main.cpp 25
Fehler  2   error C2248: "std::basic_streambuf<_Elem,_Traits>::overflow": Kein Zugriff auf protected Member, dessen Deklaration in der std::basic_streambuf<_Elem,_Traits>-Klasse erfolgte. f:\projekte\consoletestapp\main.cpp 19
Ich komme mir grad übelst vor wie ein totaler Anfänger xD (oder bin einer ^^)

22

07.01.2008, 21:00

Ehm ne haste eher verschlimmbessert ;) Okay hab noch keine Lösung ... muss ich mal morgen nach gucken oder versuch es mal schonmal selbst.
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

rklaffehn

Treue Seele

Beiträge: 267

Wohnort: Braunschweig

  • Private Nachricht senden

23

07.01.2008, 22:21

Zitat von »"Das Gurke"«

C-/C++-Quelltext

1
2
3
4
5
if (std::char_traits<char>::eq_int_type(c, std::char_traits<char>::eof() == true))

/* man beachte den Unterschied in der Klammerung am Ende :) */

if (std::char_traits<char>::eq_int_type(c, std::char_traits<char>::eof()) == true)


Ist zwar falsch, behebt aber nur die erste Warnung.
God is real... unless declared integer.
http://www.boincstats.com/signature/user_967277_banner.gif

Das Gurke

Community-Fossil

  • »Das Gurke« ist der Autor dieses Themas

Beiträge: 1 996

Wohnort: Pinneberg

Beruf: Schüler

  • Private Nachricht senden

24

09.01.2008, 12:41

Kommt noch was? Ich bin wirklich jedem sehr dankbar der mir hier eine Lösung präsentieren kann, selber bekomme ich das irgendwie ums verrecken nicht hin.

Ich verstehe zwar, was Deviloper vorhat, aber wie man an meiner "Überarbeitung" erkennen kann, versteh ich den Code nicht xD

25

10.01.2008, 19:32

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
#include <streambuf>

namespace log
{
    template<typename _elem, typename _traits = std::char_traits<_elem> >
    class basic_dualstreambuf : public std::basic_streambuf<_elem, _traits >
    {
        std::basic_streambuf<_elem, _traits>*        m_first;
        std::basic_streambuf<_elem, _traits>*        m_second;

    protected:
        virtual int_type overflow(int_type c = traits_type::eof())
    {
            return ((m_first && m_second && traits_type::eq_int_type(m_first->sputc(c), traits_type::eof()) == false && traits_type::eq_int_type(m_second->sputc(c), traits_type::eof() == false)) ? 
            traits_type::not_eof(c) : traits_type::eof());
        }

    public:
        explicit basic_dualstreambuf (std::basic_streambuf<_elem, _traits>* ptr_first, std::basic_streambuf<_elem, _traits>* ptr_second)
            : m_first(ptr_first), m_second(ptr_second)
        {}
    };

    typedef basic_dualstreambuf<char> dualstreambuf;
    typedef basic_dualstreambuf<wchar_t> wdualstreambuf;
}; // log
.

C-/C++-Quelltext

1
2
3
4
5
6
7
8
9
10
11
12
13
#include <fstream>
#include <iostream>
#include "log.hpp"

std::ostream& foo(std::ostream& out) { return out << "foo() - Function"; }

int main()
{
    std::ofstream file_stream("log.txt");
    log::dualstreambuf buffer(std::clog.rdbuf(), file_stream.rdbuf());
    std::clog.rdbuf(&buffer);
    std::clog << "Test 001\n" << foo(std::clog) << std::endl;
}
:) geht! :)
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

26

11.03.2008, 15:00

Sorry für die späte Rückmeldung, ich merk erst jetzt, dass ich mich "damals" garnicht bedankt habe. Sorry! (DANKE!)

Ich hab die Klasse mittlerweile ein wenig ausprobiert und nun erst seit neuestem einige Probleme damit. Ich benutze den Code folgendermaßen:

C-/C++-Quelltext

1
2
3
4
    // Setting up logging facilities

    std::ofstream logstream((const char*)"Server.log");
    WoRD::output output(std::cout.rdbuf(), logstream.rdbuf()); // typedef basic_dualstreambuf<char> output; 

    std::clog.rdbuf(&output); // std::clog now logs to screen and given file
Wenn ich aber nun per z.B.

C-/C++-Quelltext

1
2
3
4
    // How did we compile?

    std::clog << "Compiler Options" << std::endl;
    std::clog << "\tCompiler (Version)  : " << COMP_NAME << " (" << COMP_VER << ")" << std::endl;
    std::clog << "\tBuild configuration : " << CONF_NAME << std::endl;
Versuche etwas auszugeben, landet immer nur ein einsames 'C' von "Compiler" in der Ausgabe (sowohl Bildschirm als auch Datei). Dabei dachte ich, std::endl würde auch flushen? Ein seperater Aufruf von std::clog.flush() bringt allerdings leider auch nichts.

Nachdem der Code "in" meinem Programm nicht richtig funktionierte hab ich dann nochmal ein bisschen weiter rumprobiert: Egal was (oder wo) ich versuche etwas per << Operator auszugeben, nur das erste Zeichen schafft es, allerdings immer in beide Streams (immerhin :-) ).

Mach ich was falsch? Ich kann mir den Fehler nämlich überhaupt nicht erklären.

Edit: Und ich hab nochwas, das könnte allerdings zusammenhängen. Der GCC 3.4.5 spuckt folgende Fehler aus:

C-/C++-Quelltext

1
2
error: `int_type' does not name a type
error: (perhaps `typename std::basic_streambuf<_CharT, _Traits>::int_type' was intended)

Das Gurke

Community-Fossil

  • »Das Gurke« ist der Autor dieses Themas

Beiträge: 1 996

Wohnort: Pinneberg

Beruf: Schüler

  • Private Nachricht senden

27

24.03.2008, 11:56

Ich hab jetzt nochmal weitergeforscht und krieg das leider selber partout nicht hin :( Nichtmal den gcc Fehler bekomme ich ausgemerzt.

Der von mir beschriebene Fehler taucht übrigens auch in dem von Deviloper bereitgestellten Test auf. Könnte sich bitte jemand das Problem nochmal ansehen oder mich zumindest in die richtige Richtung schubsen? Vielleicht kennt sich ja jemand mit Streams aus und kann mir einen Hinweis geben, wo der Fehler liegen könnte?

David_pb

Community-Fossil

Beiträge: 3 886

Beruf: 3D Graphics Programmer

  • Private Nachricht senden

28

24.03.2008, 12:49

Ich seh kein int_type...
@D13_Dreinig

Das Gurke

Community-Fossil

  • »Das Gurke« ist der Autor dieses Themas

Beiträge: 1 996

Wohnort: Pinneberg

Beruf: Schüler

  • Private Nachricht senden

29

24.03.2008, 12:50

C-/C++-Quelltext

1
virtual int_type overflow(int_type c = traits_type::eof()) 
Das bezieht sich auf den Post von Deviloper bzw seinen Code.

David_pb

Community-Fossil

Beiträge: 3 886

Beruf: 3D Graphics Programmer

  • Private Nachricht senden

30

24.03.2008, 12:53

Achso, dann machs halt so:

C-/C++-Quelltext

1
virtual typename int_type overflow(int_type c = traits_type::eof())
@D13_Dreinig

Werbeanzeige