strings in textdatei schreiben



  • hallo,

    meine Software erstellt eine Log-file in dem alle ausgeführten Funktionen archiviert werden. Hierzu verwende ich den folgenden Code:

    void CError::Wr2LogFile(CString szActualRuntimeFunction)
    {
    	FILE* Stream;
    	LPSTR pstrActualFunction = szActualRuntimeFunction.GetBuffer(0);
    	Uint8_t nLength = szActualRuntimeFunction.GetLength();
    
             if((Stream = fopen("Logg.txt", "a")) != NULL)
    	{
    		fwrite(pstrActualFunction, nLength, 50, Stream);
    	}
    	fclose(Stream);
    }
    

    In der Datei ist schließlich nur der zuletzt geschriebene String aufzufinden, auf ihn folgen dann nur noch "kryptische" Zeichen. Wer kennt sich hiermit aus, und kann mir weiterhelfen?



  • size_t fwrite ( const void * ptr, size_t size, size_t count, FILE * stream );

    <cstdio>

    Write block of data to stream

    Writes an array of count elements, each one with a size of size bytes, from the block of memory pointed by ptr to the current position in the stream.
    The postion indicator of the stream is advanced by the total amount of bytes written.
    The total amount of bytes written is (size * count).

    Parameters

    ptr
    Pointer to the array of elements to be written.
    size
    Size in bytes of each element to be written.
    count
    Number of elements, each one with a size of size bytes.
    stream
    Pointer to a FILE object that specifies an output stream.

    size und count sind bei dir falsch



  • und was ist daran falsch?



  • Du versuchst das fünfzigfache der Daten zu schreiben, die eigentlich im String stehen. (woher hast du diese '50' denn überhaupt?)



  • ahh, okay ich verstehe! Dachte damit wäre die maximale Anzahl der zu schreibenden Bytes gemeint.
    Noch eine Frage wie mache ich carriage return oder line feed?



  • fwrite(pstrActualFunction, nLength, 50, Stream);
    

    sollte

    fwrite(pstrActualFunction, sizeof(pstrActualFunction[0]), nLength, Stream);
    

    heissen.

    Im Momment ist dein String den du schreibt nämlich immer 50*nLength zeichen lang.

    // Edit:

    Da war ich wohl zu langsam. Zu Newline/CarriageReturn:

    Ein newline machst du mit "\n".
    Die C-Library konvertiert automatisch "\n" zu "\r\n", also CarriageReturn + Newline wenn du dein Programm unter Windows kompilierst. Außer die Datei ist als Binärdatei geöffnet.



  • maRKus23 schrieb:

    Noch eine Frage wie mache ich carriage return oder line feed?

    Das sind ganz normale Zeichen und werden als '\n' bzw. '\r' im Quelltext geschrieben (welcher was ist, bringe ich immer durcheinander - aber normalerweise wird ein einfaches \n in die OS-spezifisch richtige \r\n-Kombination umgerechnet)

    PS: Für die Ausgabe von Strings solltest du besser fputs() verwenden - oder gleich die C++ IO-Streams.


Anmelden zum Antworten