Probleme mit fgets



  • Hallo!

    Ich hab ein Problem mit der fgets funktion.
    Und zwar erstellt mein Programm eine Textdatei in der Zeile fuer Zeile bestimmt Ereignisse von Sensoren + Uhrzeit wann sie aufgetreten sind aufgeschrieben werden. Nun moechte ich aber auch die Uhrzeit festhalten an dem das Ereignis beendet ist!

    Heisst in der Datei steht z.b.:

    Warning \t Sensornummer \t Startzeit \t Startdatum
    Error \t Sensornummer \t Startzeit \t Startdatum
    ...

    Das klappt auch soweit! Nun will ich aber auch die Endzeit und Datum festhalten!

    Die Ueberlegung dazu war, mit fgets die Zeilen einzulesen, sobald ein Ereignis beendet ist. Soll z.b. heissen: Sensor 10 hat ein Error ausgeloest. Das Ereignis wird in die Datei geschrieben und das Programm laeuft weiter. Irgendwann ist der Error behoben und es soll die Endzeit in dem Logfile geschrieben werden.

    1. Problem:

    ich habe eine Funktion geschrieben (erstmal nur zum testen) :

    writeEventCancellation(char* Eventtyp,int SensorNumber){
       char* line = (char*) malloc (sizeof(char)) * 150);
       while (fgets(line,150,Logfile) != NULL){
           ....//test ob der Anfang der Zeile = Eventtyp ist
           fprintf(Logfile,"Event gefunden");
       }
      free(line);
    }
    

    Das soll erstmal nur das zeilenweise Einlesen mit fgets testen!

    Aber komischerweise schreibt die fgets funktion in mein Logfile 4 Zeilen voll mit Ausrufezeichen( allerdings nicht mit nem Punkt sondern mit nem Schraegstrick)....
    Egal was ich probiere...immer schreib fgets was in mein Logfile! Hab schon versucht die while schleife ueber eof laufen zu lassen und fgets in die Schleife rein, geht aber auch nicht!

    Hat einer ne Idee?

    2. Problem:

    (fuer spaeter) wie komme ich zum ende der Zeile?!
    Abfrage ueber if(char == \n)???

    Freu mich ueber jede brauchbare Antwort!


  • Mod

    Du kannst Doch nicht mitten in die Datei, die Du gerade liest wieder schreiben. Du überschreibst doch dann Daten!



  • Oh ja stimmt! Das war auch eigentlich nur zum testen gedacht...

    Aber selbst wenn ich das fprintf rausnehme kommen komische Zeichen in meinem Logfile an!

    vom prinzip will ich ja eine zeile finden und an diese etwas anhaengen!
    Also

    writeEventCancellation(char* Eventtyp,int SensorNumber){
       char* line = (char*) malloc (sizeof(char)) * 150);
       while (fgets(line,150,Logfile) != NULL){
           if(line[0] == 'W' && line[1] == 'a' && line[2] == 'r'){
             strcat(line,"zum testen eine warnung gefunden"}
      free(line);
    }
    

    aber wie gesagt, diese fgets schreibt 4 zeilen voll mit nem ! nur umgedreht und nicht mit nem punkt, sondern mit nem schraegen Strich! Auch wenn ich sonst nix mache in der Funktion 😕 😕 😕


  • Mod

    Ist da kien 0 terminator drin?
    Kann es sein, dass Dein Log File eine feste Zeilenlänge hat ohne CR/LF?



  • oh....hab den Fehler gefunden! Hab's mit 'w' geoeffnet und wollte dann ja daraus lesen! Kein Wunder, dass das nicht klappt!

    Aber nun hab ich n neues Problem. Eigentlich habe ich naemlich ganz am Anfang des Programms die Datei geoeffnet und erst ganz am ende wieder geschlossen! Das ist vermutlich nicht die beste Art um mit Dateien umzugehen, aber es wird eh immer nur eine Datei verwendet. Nun habe aber ja das Problem, dass ich mal rein schreiben will und mal lesen will! Also habe ich mir gedacht, dass ich es besser direkt auf dem vernuenftigen Weg mache und die Datei oeffne und direkt danach immer wieder schliesse!

    Das Problem ist, dass ich der Dateiname aber Uhrzeitabhaengig ist. So ist der Name bei mehrmaligem Programmaufruf immer unterschiedlich. Meine Idee dazu war, dass ich beim erstellen der Datei am Anfang des Programms den Dateipfad und Name als String speichere und somit immer wieder darauf zugreifen kann! Ungefaehr so:

    {...
    char tmp2[50];
    strcpy(tmp2,"Logfiles/");
    strcat(tmp2,m_sDate+tmp);//m_sDate ist das Datum und tmp ist ne Seriennummer  
                             //und Dateiende, also .txt
    m_sFilename = tmp2;
    Logfile = fopen(m_sFilename,"w");
    ...
    fclose (Logfile);
    }
    

    obwohl m_sFilename als Membervariable der Klasse deklariert ist wird diese irgendwann umgenannt!?!

    Meine Ueberlegung war, wenn ich lesen oder schreiben will an einer anderen Stelle des Programms:

    Logfile = fopen(m_sFilename,"w");
    

    geht aber nich, weil mein Programm die Variable veraendert, ohne, dass ich die Variable in irgendeiner Art und Weise benutzt!

    Hat jemand ne Idee warum?!

    Ich wollte schon fast die Datei am Anfang im Lese/Schreibemodus oeffnen und bis zum Ende geoeffnet lassen....aber das is vermutlich nicht ganz so toll! 😋


Anmelden zum Antworten