Doubles aus Binärdateien in Textdateien speichern



  • Hallo zusammen,

    ich poste hier zum ersten mal, sage deshalb nochmal HALLO, und freue mich auf eine gute Zusammenarbeit.

    Zu meinem Problem: ich habe Binärdateien, in denen eine Reihe von double-Werten (Punktkoordinaten) gespeichert sind (sagen wir mal eine 800byte-Datei, also mit 100 doubles). Die Frage ist, wie kann ich diese in ein double-Array einlesen und danach dieses in einer lesbaren Form speichern (txt-file). Im Moment kommen absolute falsche (riesige) Werte raus.

    Hier mein (nicht funktionierender) Code:

    FILE * pFile;
    double x[50][2]
    
    buffer = (double*) malloc (sizeof(double)*100);
    
    pFile = fopen("...", "rb");
    
    // read file to buffer (8byte-blocks)
    result = fread (buffer,8,100,pFile);
    
    for(int i=0;i<50;i++){
      for(int j=0;j<2;j++) x[i][j] = buffer[2*i+j];
    }
    
    fclose(pFile);
    
    // save data to textfile
    pFile = fopen ("...","w");
    for(int i=0;i<50;i++){
      fprintf(pFile,"%f\t%f\n", x[i][0], x[i][1]);
    }
    
    fclose(pFile);
    

    Würde mich über eine Hilfestellung sehr freuen, habe auch schon mit dem fread() ein bisschen experimentiert, jedoch ohne Erfolg.

    Beste Grüße,
    ElMuesli.



  • falsches Forum?

    bist du sicher, dass du in C++ und nicht C programmieren möchtest? Oo

    bb



  • 🙂 Ich soll es in C oder Fortran machen. In dem Fall dachte ich mir, dass es wohl egal ist, ob C oder C++.



  • ElMuesli schrieb:

    🙂 Ich soll es in C oder Fortran machen. In dem Fall dachte ich mir, dass es wohl egal ist, ob C oder C++.

    Ne, ist es nicht - sonst würden die versch. Unterforen wohl auch keinen Sinn machen...
    Also sieh mal zu, dass du es entweder noch mal im C-Forum postest oder wartest, bis dich wer verschiebt...

    bb



  • Ok, dann poste ich es nochmal ins C-Forum. Hatte gedacht, dass mein Problem (wahrscheinlich fread oder Pointer/Speicher-Zuweisung) auch hier beantwortet werden könnte.
    Gruß und Danke, ElMuesli



  • std::basic_fstream<unsigned char> in(L"values.bin", std::ios::binary | std::ios::in);
    if (in.is_open())
    {
    	in.seekg(0, std::ios::end);
    	std::basic_ifstream<unsigned char>::pos_type len = in.tellg();
    	in.seekg(0, std::ios::beg);
    
    	std::wofstream out(L"values.txt");
    	if (out.is_open())
    	{
    		long count = len / sizeof(double);
    		for (long i = 0; i < count; ++i)
    		{
    			double val = 0.0;
    			in.read(reinterpret_cast<unsigned char*>(&val), sizeof(val));
    			out << val << L"\n";
    		}
    		out.close();
    	}
    }
    


  • Danke dafür... Die Werte sehen damit (von der Formatierung her) schonmal schöner aus. Jedoch können sie nicht stimmen (weiterhin viel zu groß).

    Teilweise steht da auch einfach sowas: 1.#QNAN

    Die ersten 8 Byte meiner Binärdatei sehen im Hex-Editor so aus: 4036FCEC4004A7DA
    Das müsste laut http://babbage.cs.qc.edu/IEEE-754/64bit.html ein Wert um die 23 sein. Dein (und auch mein) Code speichert -4.98574e+128. Was nun?



  • Das Thema hat sich erledigt. Das Problem bestand darin, dass meine binary files offensichtlich auf einer anderen Platform erstellt wurden und noch bearbeitet werden mussten, bevor ich sie auf meinem intel lesen konnte.


Anmelden zum Antworten