Zeilenumbruch wird komisch in der Logdatei ausgegeben!



  • Hallo Leute,

    mein Problem ist folgendes:
    Nachdem ich meine char-Variable mit folgendem Text fülle...

    strcpy(help_line, "Ende des Lesevorgangs: "+datensatz);
    strcat(help_line, "\n");
    

    ...gebe ich meine Variable einer Funktion weiter, die mir diesen Text in eine Datei schreibt:

    CKernel::setLogFile(help_line, logdateipfad);
    

    Jedoch nachdem ich mir die Datei angeguckt habe, kommen da völlig unsinnige Zeichen mitrein, und ich verstehe nicht warum: 😞

    Wed Aug 25 10:28:54 2004: Ende des Lesevorgangs: Anzahl DS: 00014, 17.08.2004, 09:05:43
    ¨&( Wed Aug 25 .......
    

    Nehme ich den Umbruch raus, also das \n, schreibt er mir die nächste Zeile in die vorherige hinten rein, was ja auch logisch ist...
    ...hat einer vielleicht Rat für mich?

    Gruss,

    chullain



  • ist die datei im binaren modus geoeffnet ? falls ja versuchs mal ohne bzw. falls nein versuchs mal mit. falls du unter windows arbeitest, hast du es auch schon mit "\r\n" versucht ?

    was auch immer



  • ich hab es mal in binären Modus versucht, jedoch macht er die Sache nur schlimmer...diesmal quetscht er die ganzen Ausgabe, die beim einmaligen Durchlauf vom Programm aus 30-40 Zeilen besteht auf 5 Zeilen zusammen...

    ...im Textmodus ändert er die Zeichen ab, diesmal sieht das dann so aus:

    Wed Aug 25 15:04:14 2004: Ende des Lesevorgangs: Anzahl DS: 00014, 17.08.2004, 09:05:43
    ¨&RWed A..........
    

    obwohl ich nicht verstehen kann, warum, wenn default-Einstellung text ist...

    ...mit \r\n hab ich auch schon probiert, hat auch nicht viel geholfen 😞



  • ...noch eine parallele Frage dazu, wenn ich ein Datensatz aus einer Datei in einen CString auslese, und möchte den Zeilenumbruch entfernen, wie identifiziere ich den Zeilenumbruch in dem CString

    ...würde dann CString.Remove('Zeilenumbruch') probieren...



  • komisch ist auch, dass er anfängt zu spinnen erst dann, wenn ich diesen ausgelesenen Datensatz aus einer anderen Datei in die Logdatei schreiben möchte.

    Bsp.

    Wed Aug 25 15:16:07 2004: Start der Anwendung
    Wed Aug 25 15:16:07 2004: Initialisierung der Anwendung erfolgreich!
    Wed Aug 25 15:16:07 2004: Öffnen der Datei ComAusExt.txt erfolgreich
    Wed Aug 25 15:16:07 2004: Beginn des Lesevorgangs: COMAUSEXT.TXT, 17.08.2004, 08:54:32
    Wed Aug 25 15:16:07 2004: Ende des Lesevorgangs: Anzahl DS: 00014, 17.08.2004, 09:05:43
    ¨&RWed Aug 25 15:16:07............
    

    ...das meine ich



  • ...hat es vielleicht was damit zu tun, dass ich als output den datentyp char verwende?



  • "Ende des Lesevorgangs: "+datensatz
    

    Das sollte so aber nicht funktionieren. Ich nehme an, dass Datensatz ein char* ist. Du addierst auf ein Literal einen Pointer... wundert mich, dass der Compiler dort nicht meckert, und wie das gutgehen kann.

    So sollte es besser gehen:

    strcpy(help_line, "Ende des Lesevorgangs: ")
    strcat(help_line, datensatz);
    strcat(help_line, "\n");
    

    Oder gleich sprintf nehmen. Ist help_line denn auch groß genug, um den String aufzunehmen?

    Dein Problem klingt aber eher so, als wenn Dir eine 0-terminierung verloren geht. Wie schreibst Du raus in das Logfile? Mit ofstream? Wenn Du einen ofstream benutzt (nicht auf binär schalten!), dann brauchst Du Dir um das \n keinerlei Gedanken machen, weil das unter Windows automatisch auf #13#10 erweitert wird.

    Warum benutzt Du nicht std::string?



  • Hallo, erstmal danke für die Antwort...

    ...schreibe jetzt die Daten in die Datei unter zur Hilfenahme der Klasse CStdioFile...

    Dann sieht der Code nämlich so aus...der folgende Auszug zeigt die Methode setLogfile, mit der ich in die Datei schreibe...

    f4.Open( dateipfad, CFile::modeCreate | CFile::modeNoTruncate | CFile::modeWrite, &e );
    f4.SeekToEnd(); 
    f4.WriteString(help_file_gesamt); //<---help_file immer noch char
    f4.WriteString("\n");
    f4.Close();
    

    ...soweit klappt auch das ganze, jedoch, wenn ich jetzt bis zum folgendem Code in meinem Prg. komme...

    strcpy(hyperObj.help_line, "Abgleich der Daten aus der ComsiExtr-Datei und der Repositories erfolgreich!");
    hyperObj.setLogFile(hyperObj.help_line, hyperObj.logdateipfad);
    

    ...und das Programm dann die Methode setLogFile() ausführt, stürzt er an der Stelle f4.SeekToEnd() ab, was ich halt nicht verstehe...davor hat das Schreiben in die Datei funktioniert...

    ...was ich noch dazu sagen muss ist, dass ich eine Konsolenanwendung hab mit einer main-Methode, die mir ein Objekt meiner erstellten Klasse erzeugt.
    Zuvor beim Schreiben in die Datei wurde die Methode setLogFile immer innerhalb der Klasse aufgerufen, also CFoo::setLogFile(...)
    ...bei diesem Abbruch erfolgt der Aufruf aus der main-Methode heraus...also hyperObj.setLogFile(...)

    ...



  • nur zur Info...
    ...hat nichts mit dem Aufruf von Innen oder Aussen zu tun...hab es eben ausprobiert, stürzt auch innerhalb der Klasse ab... 😞



  • man bin ich blöd...
    ...hier natürlich auch die Fehlermeldung dazu

    Nicht abgefangene Ausnahme in SCA.exe: 0xC0000005: Access Violation
    


  • Hallo,

    ich denke die Frage solltest du so langsam ins MFC-Forum stellen, denn z. B.
    CStdioFile kennt Standard-C++ (und auch ich :)) nicht.

    mfg
    v R


Log in to reply