double-array in datei schreiben



  • Hallo,
    ich möchte eine double-array in eine Datei schreiben und zu einem späteren Zeitpunkt laden. Die Datei muss nicht im editor o.ä. lesbar sein und weil Zeit bei meinem Programm ein sehr großes Thema ist, will ich die Daten direkt reinschreiben, sodass ich sie mit fread direkt in in das array laden kann.

    Ich bin mir eigentlich zimelich sicher, dass das schon mal so funktioniert hat:
    schreiben:

    double* arr = new double[n];
    	/* ...*/
    	char* cArr = (char*)arr;
    	FILE* f = fopen("test.txt", "w");
    	for(int i = 0; i < n * sizeof(double); i++)
    		fprintf(f, "%c", cArr[i]);
    	fclose(f);
    

    lesen:

    f = fopen("test.txt", "rb");
    	fseek(f, 0, SEEK_END);
    	long fsize = ftell(f);
            if(fsize == n * sizeof(double) {
    	    rewind(f);
    	    fread(arr, 1, n * sizeof(double), f);
        	    fclose(f);
            }
    

    aber jetzt ist die Datei um einiges größer als n * sizeof(double) und wenn ich versuche, sie trotzdem zu lesen, stimmen zwar die ersten Werte, aber nach ein paar Werten sind sie völlig falsch.
    Was mache ich falsch und wie kann ich es besser machen?



  • Zu fread gehört fwrite und zu fprintf dann fscanf .

    Bei fwrite kannst du auch das ganze Array auf einmal schreiben.

    Beim Schreiben solltest musst du auch im binary-Mode arbeiten.
    Es ist auch doof, eine Binärdatei mit der Erweterung .txt zu versehen.

    (Nebenbei: zum schreiben von einzelnen Zeichen gibt es viel bessere Funktionen als fprintf )



  • Zusätzlich zu Dirks Kommentar:

    Der Lese-Code kompiliert nicht. Es fehlt mindestens mal eine Klammer zu.

    Du machst ein seek ans Dateiende und liest nur, wenn die Dateigröße der erwarteten Größe entspricht. Wo liest du also, wenn die Datei ne andere Größe hat? (und auch hier den Rückgabewert von fread überprüfen - und warum als Parameter 1, n * sizeof(double) ? Logisch korrekt wäre doch sizeof(double), n



  • Hab mir grad mal bei einem kleinen Beispiel(n=4) die bytes angeschaut, die er reinschreiben sollte und die, die er liest und festgestellt, dass schon alle korrekt vorhanden waren, nur dass zwischen dem 18. und 19. byte einfach ein zusätzliches byte eingefügt wurde. Passiert übrigens nicht bei allen Zahlen.

    Das array war:

    int n = 4;
    	double* arr = new double[n];
    	arr[0] = 3.125;
    	arr[1] = 7.146;
    	arr[2] = 97.26;
    	arr[3] = 789.21;
    


  • ok das probiere ich mal



  • gleiches Problem,
    egal ob ich fwrite(arr, 1, n*sizeof(double), f) oder fwrite(arr, sizeof(double), n,f) benutze, ich bekomm immer das zusätzliche byte zwischen dem 18. und 19.



  • Ginso89 schrieb:

    nur dass zwischen dem 18. und 19. byte einfach ein zusätzliches byte eingefügt wurde. Passiert übrigens nicht bei allen Zahlen.

    DirkB schrieb:

    Beim Schreiben solltest musst du auch im binary-Mode arbeiten

    (beim Lesen machst du das ja schon)

    Edit: es müssten die Werte 10 und 13 im Spiel sein.



  • Was meinst du mit "im binary mode arbeiten"? Kannst du mir kurz den Code zeigen, mit dem ich schreiben muss?

    ja, nach der 10 wurde eine 13 eingefügt



  • Du liest mir "rb" also Binary. Du schreibst aber Text.

    Öffne die Datei mit

    FILE* f = fopen("test.txt", "wb");
    

    Btw. hast du dich im Unterforum geirrt? Das liest sich für mich wie C Code. Oder hast du dich extra für den "C-Weg" unter C++ entschieden?



  • fopen("test.bin", "wb");
    

    Und ".txt" für eine Binärdatei ist irgendwie doof.



  • Ginso89 schrieb:

    Was meinst du mit "im binary mode arbeiten"? Kannst du mir kurz den Code zeigen, mit dem ich schreiben muss?

    ja, nach der 10 wurde eine 13 eingefügt

    Im Text-Mode (ohne dem "b") ersetzt MS-DOS/Windows das \n im Text durch \r\n in der Datei.
    Beim Lesen wird aus \r\n wieder nur das \n

    Es wird auch noch das Zeichen mit dem Wert 26 (Ctrl-Z oder ^Z) als EOF (EndOfFile) erkannt.
    Das macht dann beim Lesen Probleme.

    Schau mal in der ASCII-Tabelle nach.



  • Dieser Thread wurde von Moderator/in SeppJ aus dem Forum C++ (alle ISO-Standards) in das Forum C (alle ISO-Standards) verschoben.

    Im Zweifelsfall bitte auch folgende Hinweise beachten:
    C/C++ Forum :: FAQ - Sonstiges :: Wohin mit meiner Frage?

    Dieses Posting wurde automatisch erzeugt.


Anmelden zum Antworten