char wird automatisch in int umgewandelt :(



  • hi ich hab ne kleine Header-Datei geschrieben, die als Logdatei fungieren soll, funktioniert auch alles, bis auf die beiden Variablen el (endline) und tab (tabulator).

    der Header:

    #ifndef __LOGFILE__
    #define __LOGFILE__
    #include <fstream>
    
    using namespace std;
    
    namespace logfile
    {
    
    const char tab = '\t';
    const char el = '\n';
    
    class Logfile
    {
          public:
                 Logfile(char* fname) : name(fname) {f.open(name, ios::out);}
                 ~Logfile() {f.close();}
    
                 void write(char* str){f<<str<<' ';}
                 void write(int i){f<<i<<' ';}
                 Logfile& operator<<(char* str){write(str); return *this;}
                 Logfile& operator<<(int i){write(i); return *this;}
    
          private:
                  Logfile(const Logfile&);
                  const char* name;
                  fstream f;
    };
    }
    #endif
    

    die main:

    #include <logfile.h>
    using namespace logfile;
    
    int main()
    {
        Logfile log("log.txt");
        log<<"test";
        log<<1<<"zahl"<<el;
        log<<"tab"<<tab<<"test";
        return 0;
    }
    

    und die log.txt:

    test 1 zahl 10 tab 9 test
    

    mich nervt das grad übelst, weil ich nicht weiß, wie ich verhindern kann, dass diese beiden chars in ints umgewandelt werden. ich hab schon rumprobiert:

    test ohne andere Wirkung:

    Logfile& operator<<(char str){write(str); return *this;}
    

    die Zeile hab ich noch hinzugefügt, allerdings bleibt alles beim alten.

    Danke im voraus für die Rückmeldung!


  • Mod

    Wenn sie nicht in int umgewandelt werden, wie willst du sie dann ausgeben, wenn du nur int und char* (der übrigens wohl const char* sein sollte) anbietest?

    test ohne andere Wirkung:

    Logfile& operator<<(char str){write(str); return *this;}
    

    Code:

    die Zeile hab ich noch hinzugefügt, allerdings bleibt alles beim alten.

    Das verschiebt die gleiche Problematik hin zu deiner write-Funktion.



  • ja hab ich auch grad gesehen, ich hätte 2 Zeilen dazumachen müssen:

    Logfile& operator<<(const char str){write(str); return *this;}
    

    und

    void write(const char str){f<<str<<' ';}
    

    danke für das mit dem const, hab ich vergessen 🙂



  • funktioniert jetzt. danke! 😃
    hab auch noch den Code verändert, um minimale Nebenwirkungen zu entfernen:

    vorher:

    void write(const char str){f<<str<<' ';}
    

    da kam dann raus:

    test 1 zahl 
     tab 	 test
    

    jetzt:

    void write(const char str){f<<str;}
    

    da kommt jetzt raus:

    test 1 zahl 
    tab 	test
    

    Danke für die Hilfe! 😃


  • Mod

    Clundsch schrieb:

    ja hab ich auch grad gesehen, ich hätte 2 Zeilen dazumachen müssen:

    Logfile& operator<<(const char str){write(str); return *this;}
    

    und

    void write(const char str){f<<str<<' ';}
    

    danke für das mit dem const, hab ich vergessen 🙂

    Das const so wie hier hingegen ist verwirrend und unüblich. Wen interessieren deine Implementierungsdetails (ob du das str selber veränderst oder nicht) im öffentlichen Interface? Interessant ist doch bei Pointer- und Referenztypen, ob du das dahinter stehende Objekt veränderst.



  • naja, eig. nicht... was wäre denn deiner Meinung nach richtig? (das hier ist bereits die fertige Headerdatei)


  • Mod

    Logfile& operator<<(const char* str){write(str); return *this;}
                 Logfile& operator<<(int i){write(i); return *this;}
                 Logfile& operator<<(char i){write(i); return *this;}
    

    Bitte nachvollziehen, auf was sich die const-ness hier bezieht!



  • scheint so, als würde das const sich hier lediglich auf den Zeiger beziehen, damit der eigentliche Wert nicht verändert werden kann. Da die anderen beiden Parameter keine Zeiger sind isses da egal... wenns das ist hab ichs verstanden, danke!


Anmelden zum Antworten