Einlesen einer Binärdatei (10 Datensätze in ein struct)



  • Guten Abend, ich sitze nun schon einige Stunden über meinem Code und
    finde den Fehler nicht ...

    Ich habe eine vorgegebene Binär-Datei und ein vorgegebenes struct-Gebilde.
    Ich möchte nun die Datei einlesen und im struct speichern.

    Vielleicht poste ich erst mal die entscheidenden Teile meines Codes :

    #define MAX 20
    
    struct SATZ
    {
          char Filiale[21];
          float Umsatz;
          float Bestand;
          float Beschaeftigte;
          float Loehne;
          short Quadratmeter;
          float AnlageVermoegen;
    };
    
    main()
    {
          int i=0, anzahl=0;
          FILE *fp=NULL;
          char *dateiname="HANDEL.DAT";
          struct SATZ daten[MAX];
    
          //Kopfzeile ausgeben
          printf("\n\t");
          for(i=0;i<63;i++) printf("-");
          printf("\n\t| Untersuchung von Leistungsparametern verschiedener Filialen |\n\t");
          for(i=0;i<63;i++) printf("-");
          printf("\n\n\n\n\n\n");
    
          //Fehlerbehandlung beim Öffnen der Datei
          if((fp=fopen(dateiname,"rb"))==NULL) fprintf(stderr, "Datei kann nicht geoeffnet werden\n");
          else
          if(fread(daten, sizeof(daten[0]),MAX, fp)<MAX &&!feof(fp)) fprintf(stderr, "\n\t\t\tFehler beim Lesen der Datei\n");
    
          //Test
          for (i=0; i<MAX; i++)
          {
              printf(daten[i].Filiale);
          }
    

    Ich vermute meinen Fehler in Zeile 31. Denn es wird mir keine Fehlermeldung
    aus Zeile 29 oder 31 angezeigt. Also gehe ich mal davon aus, dass das
    grundsätzliche Einlesen der Datei funktioniert.

    Nur wenn ich dann testweise den Code ab Zeile 33 ausführen lasse, bekomme
    ich ausschließlich Datenmüll angezeigt.

    Vielleicht sieht ja jemand den Fehler ... würde mich freuen !

    LG
    Brain



  • zewig doch mal den output.
    (eventuell lad mal das bionärfile irgendwo hin und verlinke es)

    Meine vermutungen sind:
    entweder hat das file einen header, den du vergessen hast
    oder die Zeichenkette enthält keine terminierende 0, so das mehr ausgegeben wird, als gewollt.
    was gibt denn ein strlen(daten[0].Filiale) zurück



  • @vlad_tepesch

    Vielen Dank schon mal für deine Hilfe. Ich habe mal ein ScreenShot
    gemacht. Da sieht man den Datenmüll, und die einsame 12 kurz drunter ist
    die Ausgabe von

    strlen(daten[0].Filiale)
    

    Bruchstückhaft sind Fragmente des Inhaltes der Datei zu erkennen.

    http://img88.imageshack.us/my.php?image=fehlergq7.jpg

    Und hier der Link zur Binär-Datei :
    http://www.file-upload.net/download-1330932/HANDEL.zip.html



  • was mir grad auffällt:

    mach mal ein sizeof(SATZ) und vergleiche mit dem theoretischen wert.
    Ich vermute, dass der compiler die structmember an 4 bytegrenzen ausrichtet, was in dem file eventuell nicht der fall ist.

    wahrscheinlich reicht ein

    #pragma pack(push, 1)
    

    vor und ein

    #pragma pack(pop)
    

    nach der Struct definition (gilt für VC 8, bei gcc-abarten eventuell anders) um den kompiler davon zu überzeugen, dass er keine padding bytes einfügen soll.



  • Also wenn ich

    sizeof(SATZ)
    

    eingebe, dann beendet mir
    der Compiler den Dienst mit einer Fehlermeldung.
    Merkwürdigerweise bekomme ich den Fehler 'SATZ' undeclared (first use in this function), der für mich nicht ganz nachvollziehbar ist. Denn SATZ
    sollte doch bekannt sein !?

    Nachdem ich den Code-Vorschlag (vor und nach dem struct) von dir
    eingegeben habe, werden mir die 10 Daten aus der .dat-Datei
    korrekt angezeigt. Aber es werden nach den 10 Daten noch weitere
    Hyroglyphen ausgegeben.

    Grundsätzlich bin ich nun auf dem richtigen Weg, was mich schon mal
    sehr freut !

    So sieht es jetzt aus :
    http://img361.imageshack.us/img361/39/fehler2fe5.th.jpg



  • struct SATZ 🙄



  • Ja, stimmt natürlich. Da bekomme ich die Ausgabe der Größe von 43 !



  • -=The Brain=- schrieb:

    Aber es werden nach den 10 Daten noch weitere
    Hyroglyphen ausgegeben.

    Sind denn 20 korrekte Datensätze drin?



  • Habe jetzt meinen

    #define MAX 20
    

    auf 10 geändert.
    Dann passt alles. Aber ich dachte, die Zeile 31 erkennt automatisch
    das Ende der Einträge im struct.

    Grundsätzlich muss es aber auch anders gehen. Denn ich kann ja nicht
    immer, nach Hinzufügen weiterer Daten, den #define-Wert erhöhen müssen.

    Aber grundsätzlich bin ich erst mal zufrieden ... aber es gibt Sachen,
    die eben verbesserungswürdig sind ! Wie eben die Sache mit dem MAX-Wert.



  • Es wird ja auch nur das eingelesen, was in der Datei steht. Aber die Anzahl musst du dir auch iwo im Programm merken und nicht einfach alle MAX Elemente ausgeben, von denen ja die letzten (wenn Datei weniger als MAX Datensätze enthält) keine sinnvollen Daten enthalten.


Anmelden zum Antworten