ofstream und Zeilenumbrüche



  • Hi Forum,

    ich versuche mit c++ unter Win32 eine Textdatei Zeilenweise zu beschreiben. Nach einer gewissen Anzahl von Zeilen möchte ich wieder am Anfang der Datei beginnen und die erste (älsteste) Zeile neu beschreiben.

    Dazu folgender Code:

    #include <iostream>;
    #include <fstream>;
    using namespace std;
    
    char theLogUnitsName[81];
    char theLogLineFormatter[21];
    ofstream file;
    
    //Datei öffnen und erste Zeile eintragen
    int LogFile::init(char*filename){
    	char logset[256]="";
    	strcpy (theLogUnitsName, "../");
    	strcat (theLogUnitsName, filename);
    	strcat (theLogUnitsName, ".log");
    	file.open(theLogUnitsName, ios::out | ios::trunc);
    	sprintf(logset,"%s.%s\t%s\t%s", "Zeitstempel", "ms", "Ausnahme", "Nachricht" );
    	file << logset << std::endl;
    	return 0;
    }
    
    //Streampointer wieder auf Anfang
    void LogFile::rewind(){
            file.seekp(0, ios::beg);
    }
    
    int LogFile::doLog(int theexception, char* theMessage){
    	char logset[256]="";
    	char millisec[21] = "";
            struct _timeb tstruct;
    	_ftime_s( &tstruct );
    	sprintf(logset, "%ld.", tstruct.time);
    	sprintf(millisec, "%u\t", tstruct.millitm);
    	strcat(logset, millisec);
    	strcat(logset, "\t");
    	strcat(logset, exception[theexception]);
    	strcat(logset, ":\t");
    	strcat(logset, theMessage);
    	file << logset << std::endl;
    	return 0;
    }
    

    Problem: solange ich nur "doLog" aufrufe sieht die textdatei super aus, Zeilenumbrüche sind da wo sie hingehören und der gesamte Text ist da.
    Rufe ich nach z.B. 20x "doLog" einmal "rewind" auf und dann wieder "doLog" wird die neue Zeile zwar mit Zeilenumbruch korrekt eingetragen, jedoch fehlt von der folgenden Zeile das erste Zeichen. Beim zweiten aufruf von "doLog" nach "rewind" fehlen in der dritten Zeile die ersten beiden Zeichen usw.

    Jemand eine Lösung? Gibt es anstelle seekp() eine geschicktere Lösung an den Beginn der Datei zurückzukommen?



  • Daniel S schrieb:

    Hi Forum,

    ich versuche mit c++ unter Win32 eine Textdatei Zeilenweise zu beschreiben. Nach einer gewissen Anzahl von Zeilen möchte ich wieder am Anfang der Datei beginnen und die erste (älsteste) Zeile neu beschreiben.

    das klappt nur wenn die neue zeile genau so lang ist wie die erste.
    ansonsten kommt müll raus



  • Wenn die Textzeilen nicht gleich lang sind, dann kannst eine weitere Datei erstellen. Da deine neue Zeile hineinschreiben plus den Rest deiner 1. Datei hinein kopieren und dann die 1.Datei löschen. Es gibt da noch eine andere Reihenfolge. Aber das Ergebnis sollte gleich sein.

    Musst du beim Quelltext diese Mischung aus C und C++ wählen? Oder darfst du auch pur C++ 😕



  • das haengt auch davon ab um wieviele zeilen es sich handelt und wie lange so eine zeile ist. wenn du mit der maximalgroesser der datei im kbyte bereich bist, dann einfach die ganze datei einlesen, zeile anhaengen bzw. eine zeile aendern und wieder in die datei schreiben. das OS hat ansich zu meist ein recht gutes cache-system fuer die dateien, das wahrscheinlich die meiste zeit erst garnicht auf die platte runtergeschrieben wird.

    Meep Meep


Anmelden zum Antworten