2 dimensionales Array speichern



  • Hallo,

    ich möchte ein Array

    double spielfeld[2000][2000];
    

    speichern.

    ich habe es bisher so probiert.

    Laden:

    FILE *Fpinput; 
    
    				if (Fpinput=fopen("1save.sav", "w")) { 
    				for (int a=0; a< 2000; a++) {
    					for (int b=0; b< 2000; b++) {
    					fwrite(&spielfeld[a][b], sizeof(double),1 , Fpinput ); 
    
    					}
    
    				}
    					fclose(Fpinput); 
    				}
    

    laden:

    FILE *Fpinput; 
    
    			double d;
    			if (Fpinput = fopen("1save.sav","r")) {
    
    				while ( !feof(Fpinput)){
    				for (int a=0; a< 2000; a++) {
    					for (int b=0; b< 2000; b++) {
    						spielfeld[a][b]=fread(&d,sizeof(double),sizeof(d),Fpinput);
    
    					}
    
    				}
    
    				}
    
    				fclose(Fpinput);
    			}
    

    Das speichern scheint zu funktionieren, denn ich erhalte eine ca. 30 Mb große Datei.

    Beim Laden bricht das Programm jedoch mit der Meldung

    Die Anweisung "0x00402c01" verweist auf Speicher in "0x400500000".
    der Vorgang "written" konnte nicht auf dem speicher durchgeführt werden

    Zudem zeigt der Editor des Compilers anschließend mit einem Ausrufungszeichen auf die Zeile

    spielfeld[a][b]=fread(&d,sizeof(double),sizeof(d),Fpinput);
    

    Was mache ich falsch?



  • 1.) fwrite und Konsorten benutzt man in C++ nicht so gerne.
    2.) Schau dir doch mal bitte die Doku zu fread an.





  • MaSTaH schrieb:

    1.) fwrite und Konsorten benutzt man in C++ nicht so gerne.

    nee, aber in c.

    MaSTaH schrieb:

    2.) Schau dir doch mal bitte die Doku zu fread an.

    das 'sizeof(d)' ist zuviel



  • net schrieb:

    MaSTaH schrieb:

    1.) fwrite und Konsorten benutzt man in C++ nicht so gerne.

    nee, aber in c.

    Deswegen sind wir hier im C++ Unterforum



  • Danke,

    ich habe jetzt die c++ Möglichkeit von "kingruedi" versucht und
    den Korrekturvorschlag von "net".

    Es funktioniert jetzt beides.
    Dennoch habe ich mich für die c Version entschieden, weil
    das Speichern und Laden damit nur 7 Sekunden dauert; mit der c++ Version jedoch fast 30 Sekunden. 😮



  • Also wenn du ofstream/ifstream im binary-Modus und read/write verwendest, sollte es nicht langsamer sein. Vielleicht hat ein einzelner read-/write-Call mit den IOStreams mehr Basis-Overhead (über den streambuf etc.)? Hm.

    Aber dass du read/write bzw. fread/fwrite so oft aufrufst, ist eh unnötig; warum nicht einfach:

    outstream.write(reinterpret_cast<char*>(spielfeld), sizeof spielfeld); // bzw. fwrite
    // dito für read
    

    Dann speicherst du alles am Stück. Ist soweit ich weiß aus der Sicht des Standards in Ordnung und vor allem vermutlich ne ganze Ecke schneller.



  • Dennoch habe ich mich für die c Version entschieden, weil
    das Speichern und Laden damit nur 7 Sekunden dauert; mit der c++ Version jedoch fast 30 Sekunden.

    Beweise bitte! Wie gemessen? Was gemessen? Womit gemessen?



  • HALT, bevor die große Benchmark Welle startet, kann es sein, dass du (Mister XXL) den MSVC6 Compiler benutzt? Wenn ja, ist die Frage leicht beantwortet, weil bei dem MSVC6 ua. die Standard Library Buggy ist und C++ Streams wohl extrem langsam sind.



  • kingruedi schrieb:

    Wenn ja, ist die Frage leicht beantwortet, weil bei dem MSVC6 ua. die Standard Library Buggy ist und C++ Streams wohl extrem langsam sind.

    Stimmt. Kann durch einen kleinen Eingriff in den fstream-Header aber deutlich beschleunigt werden:
    http://www.dinkumware.com/vc_fixes.html
    Oder gleich den STLFix von meiner HP laden.


Log in to reply