Speicherfehler beim ausführen



  • Hallo,

    ich habe mir eine Funktion geschrieben mit der ich ein Logfile erstelle. Doch wenn ich diese kompiliere und ausführe bekomme ich einen Speicherfehler.

    #include <stdio.h>
    #include <string.h>
    #include <time.h>
    #define BUF 255
    
    void schreibelogfile(char*, char*);
    
    int main(void)
    {
    char *text1="test123";
    char *text2="test321";
    char *logfile="./log.txt";
    
    schreibelogfile(text1,logfile);
    schreibelogfile(text2,logfile);
    
    return(0);
    }
    
    void schreibelogfile(char *text, char *log)
    {   
        time_t zeit;
        struct tm *st_zeit;
        FILE *f;
        char string1[BUF];
        char string2[BUF];
        int stunde=0;
        int minute=0;
        int sekunde=0;
        int monat=0;
        int jahr=0;
        int tag=0;
    
        zeit = time(0);
        st_zeit = localtime(&zeit);
    
        monat = st_zeit->tm_mon+1;
        jahr = st_zeit->tm_year+1900;
        tag = st_zeit->tm_mday;
        stunde = st_zeit->tm_hour;
        minute = st_zeit->tm_min;
        sekunde = st_zeit->tm_sec;
    
        sprintf(string1,"%i/%i/%i %i:%i:%i | %s \n",tag,monat,jahr,stunde,minute,sekunde,text);
        sprintf(string2,"./log/%s",log); 
    
        f = fopen(string2,"a");
        fputs(string1,f);
    
        fclose(f);
    }
    

    Vielleicht hat ja jemand einen guten Tip woran es liegen könnte.

    PS: Sry, falls der Quelltext schlecht geschrieben ist. Bin eigentlich Systemintegrator der sich versucht Programmieren beizubringen. 😃

    Danke im Voraus!



  • An welcher Stelle tritt denn der Fehler auf?

    btw, konntest du dich nicht entscheiden, ob du den Zielpfad übergibst oder vor Ort zusammenbaust? Imho könnte es Probleme geben, die Datei './log/./log.txt' öffnen zu wollen.



  • Ich würde die Funktion eh so bauen, dass der Aufrufer ein FILE* übergibt. Ich würde auch den Umweg über sprintf() nicht gehen sondern direkt fprintf() benutzen.

    Konkret in dem Code würde ich wenigstens checken, ob die Datei überhaupt geöffnet werden konnte.
    Ansonsten schrittweise durchgehen und schauen wo es hängt.



  • Hi,

    also diese Funktion soll in einem Programm verwendet werden das die Zustände an den Anschlüssen einer I/O Karte ausliesst. Dieses Programm läuft schon. Insgesamt sind es 10 Anschlüsse. Daher übergebe ich je nach ausgewählten Anschluss nur den Name des Logfiles und den Text den ich an der Stelle an der ich die Funktion aufrufe haben möchte. Dachte so könnte ich das eigentliche schreiben des Logfiles gut in einer Funktion kapseln. Die eigentliche Auswahl des Logfile-Namens erfolgt in der Main() Funktion als Switch Anweisung.

    Würde ich das File an die schreibelogfile() Funktion übergeben müsste ich doch schon auserhalb der Funktion Dinge definieren die, das Logfile anbelangen. Das heißt ich hätte an zwei Stellen im Quellcode Code der zur erstellung des Logfiles dient. Wie gesagt bin noch Anfänger und daher ist mir bestimmt auch noch nicht so schlüssig was dies für Nachteile hat.

    Würde mich freuen wenn ihr mir da ein paar Tipps geben würdet bzw. erläutern könnt was diese Funktion für Nachteile hat.

    Ist den der Quelltext überhaupt richtig, also sind alle Zeiger richtig oder gibt es noch grobe Fehler die ich bestimmt auf den ersten Blick noch nicht so gut erkenne.

    Vielen Danke für Hinweise.



  • Erstmal: Wenn du den Dateinamen wirklich in der Funktion zusammenbauen willst, solltest du den Namen ohne Pfad-Angaben übergeben (also nur als 'log.txt'). Alternativ übergibst du den kompletten Namen als Parameter, dann brauchst du ihn in der Funktion nicht mehr zusammenbauen.

    Zweitens: BEvor du etwas mit der geöffneten Datei machst, solltest du nachsehen, ob das Öffnen funktioniert hat:

    f=fopen(...);
    if(f==NULL)
      fprintf(stderr,"Datei %s konnte nicht geöffnet werden",log);
    else
      ...
    

    Drittens: Wie Tim schon sagte, schick die Ausgaben doch direkt an dein Log-File, anstatt sie erstmal in ein char-Array zu parken. (btw, die Variablen stunde, minute etc sind auch überflüssig)



  • Danke für eure Tipps.

    Habe es jetzt geändert. Das mit den Variablen ist mir gar nicht so aufgefallen 🙄. Aber stimmt natürlich da kann man noch einiges optimieren. Die Funktion fprintf war mir noch nicht bekannt, deswegen hatte ich das über sprintf gelöst.

    Hab es jetzt mal geändert:

    #include <stdio.h>
    #include <string.h>
    #include <time.h>
    #define BUF 255
    
    void schreibelogfile(char*, char*);
    
    int main(void)
    {
    char *text1="test123";
    char *text2="test321";
    char *logfile="./log/log.txt";
    
    schreibelogfile(text1,logfile);
    
    return(0);
    }
    
    void schreibelogfile(char *text, char *log)
    {   
        time_t zeit;
        struct tm *st_zeit;
        FILE *f;
    
        zeit = time(0);
        st_zeit = localtime(&zeit);
    
        if (f = fopen(log,"a"))
        {
              fprintf(f,"%i/%i/%i %i:%i:%i | %s \n",st_zeit->tm_mday,st_zeit->tm_mon+1,st_zeit->tm_year+1900,st_zeit->tm_hour,st_zeit->tm_min,st_zeit->tm_sec,text);
              fclose(f);
        }
        else 
        {
             printf("Datei konnte nicht geoeffnet werden\n");
        }
    }
    

    Ich denke so dürfte es ganz OK sein für ein Anfänger. 😉

    Ist echt super die Hilfe hier im Forum.


Anmelden zum Antworten