Zeile einer Matrix schreiben in einem Rutsch mit fwrite im Binärformat funktioniert nicht



  • wenn ich also bei mir die defintion meiner matrix von matrix[512][10] auf matrix[10][512] abändere, sollte es gehen oder?



  • torstenschw schrieb:

    wenn ich also bei mir die defintion meiner matrix von matrix[512][10] auf matrix[10][512] abändere, sollte es gehen oder?

    Momentmal Deine Matrix sieht doch so aus:

    int *m_imatrix[512];
    

    Wenn Du Deine Matrix so definierst:

    int matrix[512][10];
    

    oder so

    int matrix[10][512];
    

    Dann kannst Du sie auch so speichern:

    fwrite( matrix, sizeof(int)*512*10, 1, fp );
    

    mfg Martin



  • mgaeckler schrieb:

    fwrite( matrix, sizeof(int)*512*10, 1, fp );
    

    hab eben mal deine code mit meiner alten matrix-defintion verwendet. leider kommt da im Hex-Editor immer noch Datenmüll an. Was ich brauche, ist, dass da jetzt laut Belegung der Matrix im Programm 512x hintereinander eine 1 steht, dann 512x eine 2 und sofort. Leider sehe ich das im Hex-Editor nicht.

    Aber ich bin dir schon mal sehr dankbar, dass du dich auf meine Problemstellung einlässt.



  • aber so sollte es funktionieren, wie mgaeckler geschrieben hat - hast du mal mit dem debugger geguckt, ob in matrix auch das steht, was du gern hättest?

    bb

    PS: Dir ist bewusst, dass das C und kein C++ ist?



  • im debugger habe ich mir das auch schon angeguckt, da passt alles mit der matrix (an mehreren stellen geprüft). nur leider schreibt er müll in die datei. wie sieht denn bei euch die binärdatei aus? würde das gerne mal sehen.

    zu c/c++: ja, ich hab auch etwas c drin, aber ging nicht anders.



  • hm - also so funktioniert es jedenfalls:

    #include <cassert>
    #include <cstdio>
    
    int main()
    {
    	int matrix[10][512] = {};
    	matrix[3][12] = 1;
    
    	FILE *c_gefrickel = fopen("asd", "w");
    	fwrite(matrix, sizeof(int), 10*512, c_gefrickel);
    	fclose(c_gefrickel);
    
    	c_gefrickel = fopen("asd", "r");
    	fread(matrix, sizeof(int), 10*512, c_gefrickel);
    	fclose(c_gefrickel);
    
    	assert(matrix[3][12] == 1);
    }
    

    bb



  • dank dir unskilled. jetzt fabriziere ich zumindest keinen datenmüll mehr.
    hab meine matrix jetzt wie bei dir definiert über

    int m_imatrix[10][512];
    

    das ganze wieder mit zahlen gefüllt und über

    fwrite((short int*)m_imatrix,sizeof(short int)*512*10,1,file_csi);
    

    leider hab ich immer noch ein kleines problem: jetzt speichert er nur die hälfte der daten ab. hab da anscheinend noch probleme mit dem casten. im hex-editor siehts dann so aus, 01 00 00 00 01 00 00 00 01 ....
    also immer 2Byte zuviel mit einer Null belegt, was ich nicht ganz versteh, da meine ausgerechnete dateigröße mit der erzeugten übereinstimmt.



  • guck dir doch mal an, wie ich die fkt aufgerufen habe und wie du sie aufrufst...

    das hat schon nen sinn, dass die elementgröße und elementanzahl getrennt übergeben werden und nicht einfach miteinander multipliziert werden.
    (wenn du mal guckst, wirst du nur die hälfte abgespeichert haben)

    aber vermutlich wird dann die falsche hälfte der zahl gespeichert : D
    wieso willst du unbedingt nur shorts speichern?

    bb



  • ok, das mit der elementgröße und anzahl sehe ich ein (klappt trotzdem nicht). short int brauche ich dann für ein anderes programm, mit die daten dann eingelesen werden. das braucht halt short int. das auswerteprogramm wird auch nicht mehr geändert.



  • und was heißt klappt trotzdem nciht? ich merk aber gerade selbst, dass es nicht klappen kann 😉

    naja - short int ist zwar doof(in jeder beziehung, weil 0 vorteile, außer nur halb so große datei, aber das sollte eh egal sein), aber wenns denn sein muss, wirst du nicht umherkommen, das int-array in nen short-array umzukopieren.

    z.B. so:

    int matrix[10][512];
    
    short schreib_mich[10*512];
    for(std::size_t i(0); i != 10*512; ++i)
    {
      schreib_mich[i] = matrix[i/512][i%512];
    }
    
    FILE* fd = fopen("asd", "w");
    fwrite(schreib_mich, sizeof(short), 10*512, fd);
    fclose(fd);
    

    bb



  • danke noch mal für deine mühen. ich hab leider gerade keine zeit mehr, um deinen code zu testen. morgen setz ich mich noch mal dran. aber meinst nicht, dass der anfang der for-schleife so lauten sollte;

    for(i=0;i!=10*512;i++)
    

    was dann kommt, versteh ich leider nicht so ganz. da sind meine c/c++-kenntnisse zu schlecht, aber ich will mich reinfuchsen. % = modulo?

    grüße



  • nein, die for-schleife ist so richtig, wie sie ist.
    du kannst im initialisierungsteil auch neue variablen anlegen:
    for(int i=0; i != 12; ++i)
    kennst du ja sicherlich, genau so geht es auch, andere typen als int zu nehmen.
    und statt int i=0 kann man auch int i(0) schreiben.

    % heißt modulo, japp (also welcher rest bei der division entsteht)
    ich habs so doof geschrieben, weil ich zu faul für die 2. schleife war, macht genau das gleiche wie:

    for(int i=0; i != 10; ++i)
    {
      for(int j=0; j != 512; ++j)
      {
        /*mache irgendwas mit*/ matrix[i][j];
      }
    }
    

    bb



  • so, jetzt klappt alles. wunderbar 👍


Anmelden zum Antworten