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
-
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 vonstrlen(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.