Float aus binary Datei wandeln



  • Hallo,

    ich bekomme nur 0,00 als ausgaben und weiß leider nicht was ich falsch mache.
    Es soll eine datei in binary ausgelesen werden in der die E reihen als text stehen. Diese sollen dann als float ausgegeben werden. Eigentlich gewandelt in die Datei zurück geschrieben werden, aber ich wäre froh sie erst mal auf dem bildschirm richtig zu sehen.

    using namespace std; 
    
    int main ( int argc , char *argv[] )
    {
    
      char sDateibezeichnung[256];
      ifstream Eingabedatei;
      float E[96];			// In diesem Array sollen die aus der Datei gelesenen E Werte gespeichert werden !
      int i, laenge;        
      char * buffer;
    
      if(argc!=2)
      {
    	printf_s("Ungültige Eingabe");
    	system("pause");
        exit(1);
      }
      strcpy_s (sDateibezeichnung,PFAD);
      strcat_s(sDateibezeichnung,argv[1]);
    
      Eingabedatei.open(sDateibezeichnung, ios::binary);
    	  if ( !Eingabedatei.is_open() )
    	  {
    		printf("Datei \"%s\" konnte nicht geoeffnet werden!\n",sDateibezeichnung );
    		system("pause");
    		exit(1);
    	  }
      else printf("Datei \"%s\" wurde geoeffnet!\n",sDateibezeichnung );
      // länge der Datei bestimmen:
      Eingabedatei.seekg (0, ios::end);
      laenge = Eingabedatei.tellg();
      Eingabedatei.seekg (0, ios::beg);
      printf("Laenge der Datei \"%s\" wurde bestimmt!\n",sDateibezeichnung );
      // allocate memory:
      buffer = new char [laenge];
      printf("Speicher wurde reserviert!\n");
    //----------------------------------------------------------------------
    //  Einlesen der ASCII-codierten Werte, Wandlung und Speicherung
    //  im float-Array E :
    //----------------------------------------------------------------------
         if ( Eingabedatei.good() )
      {
    	for(i=0;i<=12;i++)
    	{
    	Eingabedatei.read (buffer,sizeof(float));
        E[i]=atof(buffer);
    	}
        printf("Die ASCII-codierten E12-Werte wurden erfolgreich gelesen!\n"
               "Die ins float-Format umcodierten Werte sind:\n\n");
        for(i=0;i<=12;i++)
    	{
    	printf("%3.1f ",E[i]);
        }
      }
      else
        printf("Fehler beim Lesen aus  \"%s\"!\n",sDateibezeichnung);
    
      Eingabedatei.close();
    

  • Mod

    Das ist weder C noch C++, sondern ein Mischmasch aus beidem. Erfahrungsgemäß gehen solche Probleme auf diesen Mischmasch zurück (und darauf, dass Mischmaschprogrammierer selten Ahnung haben, sonst würden sie wissen, welche Sprache sie machen). Was darf es also sein? C++ (von dem du ca. 5 Zeilen hast) oder C?

    Außerdem kommt mir deine Aufgabenbeschreibung sehr merkwürdig vor: Die Zahlen liegen als Text vor, sollen aber binär gelesen werden? Das macht keinen Sinn!



  • Hurra,
    meine Befürchtungen werden bestättigt. Ich habe schon länger das gefühl das was uns da versucht wird beizubringen irgendwie weder fisch noch fleisch ist.

    Also dann bitte in C++.
    Und die Aufgaben des Lehrers sind häufiger seltsam!


  • Mod

    Ok, kann ich dir zeigen, aber bitte lös erst einmal noch den Widerspruch zwischen ASCII, float, binary usw. Wie sieht die Datei aus, wenn du sie in einem Texteditor aufmachst? So in dieser Art:

    1.2345 2.3445
    3.5465 6.68897
    

    Oder doch eher so:

    &# ``&#;&TT
    !&63;3&6``o
    

    ?



  • Ich danke schon einmal im vorraus. es sieht eher aus wie unten.



  • Auszug aus E6: €? À?ÍÌ @33S@ff–@š™Ù@



  • Wenn das Binärformat passt, ist das eigentlich recht einfach:

    #include <fstream>
    #include <iostream>
    #include <cstdlib> //EXIT_FAILURE
    
    int main(int argc , char *argv[])
    {
        if(argc != 2)
        {
            std::cout << "invalid argument" << std::endl;
            return EXIT_FAILURE;
        }
    
        std::ifstream reader(argv[1], std::ios::binary);
        if(!reader)
        {
            std::cout << "open file error" << std::endl;
            return EXIT_FAILURE;
        }
    
        float current_value;
        char read_buffer[sizeof(current_value)];    
        while(reader.read(read_buffer, sizeof(read_buffer)))
        {
            current_value = *reinterpret_cast<float*>(read_buffer);
            std::cout << current_value << std::endl;
        }
    }
    

  • Mod

    Hier mit etwas mehr Tantam drumherum. Das Programm ist fast 100% äquivalent zu dem was dein Programm machen soll, inklusive aller Fehlermeldungen und dem komischen hardcodierten Pfad. Um in eine Datei auszugeben, tauscht du cout gegen einen ofstream deiner Wahl:

    #include <iostream>
    #include <fstream>
    #include <vector>
    #include <string>
    
    using namespace std;
    
    const string PATH = "./";
    
    int main(int argc , char *argv[])
    {
      if(argc!=2)
      {
        cout << "Ungültige Eingabe.\n";
        return 1;
      } 
    
      string filename = PATH + argv[1];
      ifstream file(filename.c_str(), ios::binary);
      if (!file)
        {
          cout << "Datei \"" << filename << "\" konnte nicht geöffnet werden.\n";
          return 1;
        }
    
      // Get file length
      file.seekg (0, ios::end);
      streamsize length = file.tellg() / sizeof(float);
      file.seekg(0, ios::beg);
      cout << "Länge der Datei \"" << filename << "\" entspricht " << length << " floats.\n";
    
      // Read blockfile into float-array.
      vector<float> data(length);
      cout << "Speicher wurde reserviert.\n";
      file.read(reinterpret_cast<char*>(&data[0]), 
                data.size()*sizeof(float)); 
      if (!file)
        {
          cout << "Fehler beim Lesen aus Datei \"" << filename << "\"\n";
          return 1;
        }
    
      cout << "Die ASCII-codierten E12-Werte wurden erfolgreich gelesen!\n"
              "Die ins float-Format umcodierten Werte sind:\n\n";
      for (size_t i = 0; i < data.size(); ++i)
        cout << data[i] << '\n';
    }
    


  • Wow! SeppJ ich glaub ich hab mehr zum nachdenken in diesen paar Zeilen, als aus den Unterrichtstunden der letzten Monate.

    Ich bedanke mich!

    sorg das .c_str() das es einen Stringbegrenzer hinter filename gibt?

    Das ist der klare beweis wir haben die ganze Zeit C gehabt mit lustigen einspritzern wie klassen.

    Da ich nicht dumm sterben möchte, gibt es ein empfelenswertes Einsteigerbuch zu c++?


  • Mod

    Adrick schrieb:

    sorg das .c_str() das es einen Stringbegrenzer hinter filename gibt?

    Ja.

    Da ich nicht dumm sterben möchte, gibt es ein empfelenswertes Einsteigerbuch zu c++?

    http://www.c-plusplus.net/forum/251551
    Thinking gibt es auch als freies Ebook.


Anmelden zum Antworten