Variable leeren



  • Hi,
    Ich wollte mit Hilfe eines Programmes Texte in einer Datei ausgeben. Dabei habe ich das Problem, dass am Ende des von mir geschreibenen Textes immer (mehr oder weniger) zufällige Zeichen ausgegeben werden. Also bei meinem Programm...

    #include <stdio.h>
    #include <conio.h>
    #include <iostream>
    
    using namespace std;
    
    #define MAX_LENGTH 50
    
    int main( void )
    {
       FILE *stream;
       char insert[MAX_LENGTH+1];
       int  numread, numwritten;
    
       // Open file in text mode:
       if( fopen_s( &stream, "logfile.txt", "w+t" ) == 0 )
       {
          cout<<"Gebe etwas ein (max 50Zeichen)";
    	  cin>>insert;
          numwritten = fwrite( insert, sizeof( char ), 50, stream );
          printf( "Wrote %d items\n", numwritten );
          fclose( stream );
    
       }
       else
          cout<<"Problem opening the file\n";
    
       if( fopen_s( &stream, "logfile.txt", "r+t" ) == 0 )
       {
          numread = fread( insert, sizeof( char ), 50, stream );
          printf( "Number of items read = %d\n", numread );
          printf( "Contents of buffer = %.50s\n", insert );
          fclose( stream );
       }
       else
          cout<<"File could not be opened\n";
    getch();
    }
    

    ...steht in der Ausgabedatei:

    (mein Text)          ñ ¾çy     £
    

    jetzt meine Frage: Kann ich die Variable "leeren"? Also damit dort dann nurnoch dass drin steht was ich reinschreibe.



  • Wozu leeren? Du mußt einfach nur sicherstellen, daß deine Daten Nullterminiert sind, wenn du sie als String verwenden willst (sonst rennt printf() so lange weiter, bis es zufällig auf ein 0x00 stößt):

    numread = fread( insert, sizeof( char ), 50, stream );
    insert[numread]='\0';
    

    Umgekehrt schreibst du 50 Byte in die Datei - da wird bei einer kürzeren Eingabe eben das genommen, was zufällig im Speicher stand. Um nur deine Nutzdaten zu speichern, mußt du die korrekte Länge beim fwrite()-Aufruf angeben (die bekommst du mit strlen()) - und am besten auch mit in die Datei schreiben.

    PS: Wozu hast du überhaupt das "#define MAX_LENGTH 50", wenn du die 50 dann trotzdem direkt verwendest 😉



  • erstmal danke für die schnelle Antwort^^

    nullterminierenhört sich gut an
    aber ich kann mit strlen() nix anfangen ^^"
    und die Hilfedatei von meinem compiler is alles andere als hilfreich...
    könntest du mir dafür evtl. ein Beispiel geben, bitte?

    zu dem MAX_LENGTH 50 ...öhm ja... ich war da wohl ein wenig mit den Gedanken wo anders als ich das da eingebaut habe...



  • Wolfi-kun schrieb:

    nullterminierenhört sich gut an
    aber ich kann mit strlen() nix anfangen ^^"
    und die Hilfedatei von meinem compiler is alles andere als hilfreich...
    könntest du mir dafür evtl. ein Beispiel geben, bitte?

    man: strlen() liefert dir die Länge eines nullterminierten Strings (und die meisten String-Funktionen in C und C++ sorgen dafür, daß char-Arrays nullterminiert werden (bzw. erwarten, daß sie es sind).

    Und die Frage, wie man am günstigsten einen String speichert, wird im C++ Board unter "string speichern" diskutiert.

    zu dem MAX_LENGTH 50 ...öhm ja... ich war da wohl ein wenig mit den Gedanken wo anders als ich das da eingebaut habe...

    Das einzubauen war schon eine brauchbare Idee - nur solltest du es auch nutzen (das ist der Vorteil von benannten Konstanten gegenüber "Magic Numbers" - wenn du der Meinung bist, 50 reicht nicht aus, mußt du die Arraygröße nur an einer Stelle berichtigen).


Anmelden zum Antworten