Problem mit fstream - Dateien werden nicht erzeugt...



  • Hallo,

    Ich habe ein mir unerklärliches problem mit fstream bzw der Ausgabe in eine Datei.

    Die Klasse um die es geht dient dazu Fehler zu Protokollieren. Ihr wird der Programmname ( für welches Fehler registriert werden sollen ) und der Pfad für die Protokolldateien übergeben.

    Das klappt auch, nur erzeugt meine Klasse keine Dateien...

    Die beiden Variablen für die Dateiausgabe sind als fstream* deklariert, da ich von verschiedenen Funktionen auf sie zugreigen muss. Der Dateiname setzt sich dabei aus dem Verzeichnis der Protokolldateien (z.B. ..\\LOG\) + dem Programmnamen + einem Timestamp(hh🇲🇲ss-jjjj_dd_mm) + der Dateiendung ( .err ) zusammen.

    // Initialisierung der Dateien
    this->aeDatei = new fstream( tmpDateinameAE, ios::out );
    

    Der Zugriff auf die Ausgabedateien erfolgt über write.

    // Kopfzeile schreiben
    aeDatei->write( "Fehlerzeit;ReturnCode;FehlerTyp;Fehlercode;FehlerOrt;Fehlerschlüssel;Fehlertext", 82);
    

    Im Destruktor der Klasse rufe ich dann close() für die Dateien auf.

    Was ich schon herausgefunden habe ist das mein zeiger auf die Datei definitiv befüllt ist. Der DateiStream aber leer bleibt.

    Hoffe die angaben hier reichen, um aufzuzeigen was ein Peoblem ich habe und würde mich freuen wenn jemand eine Antwort darauf weiß.

    Gruß Goshe



  • was meinst du mit befüllt bzw leer?
    evtl musst du vorher noch die verzeichnisse erstellen, in denen sich die dateien befinden sollen.



  • Also das Verzeichnios existiert und die Zugriffsberechtigungen sind auch da.

    Mit befüllt meine ich, das dem Dateistream eine Speicheraddresse zugeordnet ist. ( cout << aeDatei gibt eine Speicheraddresse aus )

    Und mit leer meine ich das nichts im dateistream steht ( cout << *aeDatei gibt 0x0 aus )



  • goshe schrieb:

    Und mit leer meine ich das nichts im dateistream steht ( cout << *aeDatei gibt 0x0 aus )

    Wär mir neu dass man so den inhalt des stream ausgeben könnte.
    Aber soweit ich weiß besitzten stream einen cast-operator nach void*. Dieser wird glaub ich da auch angespochen, wenn du cout << aeDatei machst.
    Der cast nach void
    hat den Wert 0 wenn Fehler-Flags gesetzt wurden. D.h. entweder konnte keine Datei zum Schreiben geöffnet werden oder die Ausgabe in den Stream hat einen Fehler verursacht.

    Im oberen Code sind mir einige Sachen aufgefallen, die ich anders machen würde. Heißt aber nicht dass es falsch ist, wie du das gemacht hast:

    1. stream::write() ist eigentlich für binäre einträge gedacht. Wenn du nur Text ausgibst benutze lieber << -Operator. Da du einen Pointer auf einen stream hast, schreibe *aeDatei << Irgendwas
    2. this->aeDatei = new fstream( tmpDateinameAE, ios::out );
      Glaub wenn du ne binary-Datei erstellen willst, musst du noch ios::binary als flag angeben. Ansonsten kannst auch new ofstream benutzen. nur ohne ios::out.
      Und Prüfe nach dem erstellen besser auf Fehler. Also entweder mit if (! *aeDatei) // Dann Fehler aufgetreten oder if (aeDatei.fail())


  • danke für die Antwort, jetzt weiß ich zumindest woher die 0x0 kommen...

    Die Fehlerüberprüfung hab ich schon drin... Ich hab ja schon einige Varianten ausprobiert ( mit << in die Datei zu schreiben; und ios::binary mit anzugeben; )

    Das ich bei der Fehlerprüfung auf *aeDatei prüfen muss wusste ich bisher noch nicht... Mal schauen ob mich das weiterbringt.



  • Ok nun weiß ich das mein Failbit nach dem öffnen gesetzt ist...

    Hast du ne Idee wie ich das weiter auswerten kann/herausfinden woran es liegt?



  • keine ahnung.
    Ist meistens eines davon: ungültiger dateiname, keine schreibrechte. datei durch
    anderen prozess offen, verzeichnis-baum existiert nicht, usw



  • Ok dann muss ich mal schauen ob es am Dateinamen liegt!

    Vielen Dank für die Hilfe !



  • Oh mann manchmal sieht mans echt nicht... ich wollte ne Uhrzeit in meinen Dateinamem schreiben (hh🇲🇲ss) und doppelpunkte sind nicht erlaubt xD

    Hab aber auf jeden fall was gelernt!

    gruß goshe


Anmelden zum Antworten