Frage zum Auslesen einer Binärdatei
-
Hallo,
ich habe als neue Belegarbeit folgendes Problem:
Ich habe eine Binärdatei vertrag.dat mit vorgegebener Struktur (siehe unten). Diese habe ich mit mit fread ausgelesen...klappt. Doch nun soll ich speziell auf die Daten zugreifen können, d.h. nach Lieferanten sortieren, editieren, Rechnungen mit den Bestellmengen ausführen etc. wie kann ich dies machen?????
Bitte um Hilfe!!!!!!!!!!!!!!!Hier die Struktur:
--- Struktur ---
struct vertrag
{
char vertrnr[7];
char art[21];
char liiferant[21];
unsigned short vertagsmenge;
unsigned short liefertermin[3];
unsigned short liefermenge;
};--- Inhalt ---
EAN: 512621
Beteichnung: Schokorosinen
Lieferant: Waldbaur
Bestand: 300
Liefermenge: 200EAN: 512622
Beteichnung: Ritter-Rum
Lieferant: Ritter
Bestand: 280
Liefermenge: 290EAN: 512623
Beteichnung: Ritter-Sport
Lieferant: Ritter
Bestand: 935
Liefermenge: 935EAN: 512624
Beteichnung: MonCheri
Lieferant: Ferrero
Bestand: 100
Liefermenge: 100EAN: 512625
Beteichnung: Raffaello
Lieferant: Ferrero
Bestand: 520
Liefermenge: 0EAN: 512626
Beteichnung: Pr„sent
Lieferant: Piasten
Bestand: 130
Liefermenge: 0EAN: 512627
Beteichnung: Weinbrandbohnen
Lieferant: Wissoll
Bestand: 255
Liefermenge: 235EAN: 512628
Beteichnung: Goldb„ren
Lieferant: Harribo
Bestand: 95
Liefermenge: 0EAN: 512629
Beteichnung: Elisenlebkuchen
Lieferant: Schmidt
Bestand: 850
Liefermenge: 0EAN: 512630
Beteichnung: Teefix-Zitrone
Lieferant: Teekanne
Bestand: 150
Liefermenge: 50EAN: 572311
Beteichnung: Earl-Grey-Tea
Lieferant: Milford
Bestand: 50
Liefermenge: 0EAN: 572312
Beteichnung: Darjeeling-Tea
Lieferant: Messmer
Bestand: 750
Liefermenge: 0EAN: 572313
Beteichnung: Frchtetee
Lieferant: Flensburger Teekonto
Bestand: 30
Liefermenge: 30EAN: 572314
Beteichnung: Hibiskus-Tee
Lieferant: Mller KG
Bestand: 95
Liefermenge: 95EAN: 572315
Beteichnung: Erdbeer-Frchtetee
Lieferant: Tropical
Bestand: 200
Liefermenge: 30EAN: 572316
Beteichnung: Grner Chinatee
Lieferant: Milford
Bestand: 300
Liefermenge: 305EAN: 572317
Beteichnung: Assam-Tea
Lieferant: Messmer
Bestand: 225
Liefermenge: 0EAN: 572318
Beteichnung: Raffaello
Lieferant: Ferrero
Bestand: 775
Liefermenge: 0EAN: 572319
Beteichnung: Capuccino Tasse
Lieferant: Krger GmbH & Co. KG
Bestand: 940
Liefermenge: 0EAN: 572320
Beteichnung: Kaba-Schokotrunk
Lieferant: Nestl‚
Bestand: 300
Liefermenge: 0
-
Sinnvoller wäre es, anstatt mit fread() die Daten mit fscanf() in die Struktur zu speichern,
wobei numerische Größen als integers und nicht als characters gespeichert werden sollten. Dies ist für einen späteren Vergleich der Daten einfacher.
Ausserdem benötigst du für jeden Datensatz in der Datei eine Struktur.
Definiere dir also ein Feld von Strukturen und fülle dieses mit Daten.
Eine verkettete Liste wäre ebenfalls eine Möglichkeit, die Daten abzulegen.
-
Ich denke fscanf bringt hier wenig, da die drei shorts doch schon binär abgespeichert wurden.
Da die struct ne feste Länge hat kannst Du fseek jeden Eintrag direkt ansteuern. Die Anzahl der Einträge ist über die Dateigröße bekannt (fseek ans Ende, ftell ist die Dateigröße). Mit fread kannst Du einen einzelnen Eintrag lesen und mit fwrite wieder schreiben.
Wenn Du die Anzahl kennst kannst Du einen Array von vertrag mit der passenden Länge mit malloc belegen, die gesamte Datei einlesen und dann qsort drüberlaufen lassen. Je nach Vergleichsfunktion wird dann nach einem Kriterium sortiert...
int lieferant_sorter(const void *a, const void *b) { const struct vertrag *v1 = (const struct vertrag*)a; const struct vertrag *v2 = (const struct vertrag*)b; return strcmp(v1->lieferant, v2->lieferant); } ... struct vertrag *feld = (struct vertrag*)malloc(sizeof(struct vertrag) * anzahl); fread(feld, sizeof(struct vertrag), anzahl, datei); qsort(feld, anzahl, sizeof(struct vertrag), lieferant_sorter); ...
-
Vielen Dnk für die schnelle Antwort. Leider habe ich gerade erst mit dem Programmieren angefangen und kann Euren Ausführungen noch nicht bis ins Detail folgen. Ich habe versucht Eure Ideen zu implementieren, leider weniger erfolgreich.
Meine erste Überlegung war, daß ich quasi eine Schleife bräuchte, die die mir von i=1 bis 20 Variablen *vertrnr[7];
*art[21];
*liiferant[21]; *
*vertagsmenge;
*liefertermin[3];
*liefermenge;
erzeugt. Und genau das ist mein "Knackpunkt". Wie wird genau das gemacht. Wie gesagt leider fehlt mir das Verständnis hierfür.
Sorry, dass ich so ein "Dumm-Patz" bin, doch bitte helft mir.
-
Du brauchst ein Array, das groß genug ist um die benötigte Anzahl an 'vertrag'-Objekten aufzunehmen - wenn die Anzahl fest ist, geht das statisch, ansonsten mußt du den Speicher per malloc bereitstellen. Auf die Elemente des Arrays kannst du dann über ihren Index zugreifen:
//Platz bereitstellen: struct vertrag* vertraege=malloc(anzahl*sizeof(struct vertrag)); //Array füllen: for(i=0;i<anzahl;++i) { //Direkte Zuweisung: vertraege[i].vertrnr=...; ... //oder alternativ - einlesen aus Datei: fscanf(infile,"%s",&(vertreage[i].vertrnr)); ... }
-
Schon wieder fscanf?
-
bin am verzweifeln...ich kriege das nicht hin. das normle auslesen klappt, zumindest kriege ich die liste der daten, die ich oben pepostet habe. doch leider kriege ich das ganze nicht in einen array.
-
LordJaxom schrieb:
Schon wieder fscanf?
OK, dann kein fscanf:
//1: Platz schaffen: //erzeuge einen Speicherbereich, der groß genug ist für 'anzahl' Verträge //'anzahl' mußt du vorher selber berechnen struct vertrag* vertraege=malloc(anzahl*sizeof(struct vertrag)); //2: Einlesen //lese entsprechend viele Datensätze aus der Datei: fread(vetraege/*Ziel*/,sizeof(struct vertrag)/*Größe*/,anzahl,infile/*Eingabe-FILE* */);
Anschließend kannst du mit 'vertraege[i]' auf die einzelnen Elemente des Arrays zugreifen.
PS: Nicht vergessen - free(vertraege); ans Programmende
-
thommy, hat dir keiner beigebracht, wie man programmiert?
ich bezweifle irgendwie, dass du mit der aufgabe ins kalte wasser geschmissen wurdest.
du hast doch garantiert massig gelegenheit gehabt, die lehrer um hilfe oder erklaerungen zu bitten, oder?
-
Keine Ahnung wie Du programmieren gelernt hast. Ich jedenfalls habe im Oktober im 1.Semester angefangen. Bis Ende November haben wir C progrmmiert, momentan Java und dann noch C#. Für 3 Sprachen in einem Semester bleibt nicht viel Zeit ins Detail zu gehen und wenn man die Profs fragt, bekommt man eher eine Antwort dahingehend, man könnte ja auch aufhören zu studieren, wenn man es nicht packt. Das Problem oben ist nur ein kleiner Bruchteil meiner Abschlußarbeit in C. Aus Deinen Zeilen klingt ein bißchen "Faulheit" meinerseits durch. Falls Du Faulheit damit bezeichnet, dass man stundenlang (bis nach mitternacht) und das über Tage an einer Sache sitzt, die mn gerne begreifen möchte aber die Grundlagen nicht richtig versteht, dann bin ich wohl faul. Es wäre eher schön, wenn Du mir weiterhelfen kannst. Oder ist das hier nur ein Forum für Kenner???
Falls mir irgendwer weiterhelfen möchte, dem bin ich echt,echt dankbar!!!!
-
Wenn Du weitergeholfen werden willst, beschreibe was Du nicht verstehst oder was nicht funktioniert, poste Codeabschnitte etc...
Wenn wie Du sagst das auslesen einzelner Sätze schon funktioniert, sollte es kein Problem sein z.B. CStolls (oder auch mein) letztes Codebeispiel einzubauen und auszuprobieren. Hast Du das versucht? Was funktioniert nicht, was für Effekte bemerkst Du? Wie sieht Dein Programm jetzt aus?
Wir helfen eigentlich alle gern, aber wir machen unbezahlt keine spontanen Marathonexkursionen über ungenau bekannte Problemfelder.
-
Du hilfst uns aber auch nicht wirklich um dir helfen zu können.
Erstmal versuchst du gar nicht Irrtümer unsererseits aufzuklären. Und irgendwelchen Code deinerseits gibts auch nicht. Wenn du eine fertige Lösung willst dann wist du dir das etwas kosten lassen müssen.
Also Du zeigst uns eine struct in die du deine Daten einlesen willst. Gleichzeitig zeigst du uns eine Haufen Daten die, wenn sie wirklich so vorliegen, darauf schliessen lassen dass man sie mit scanf() einlesen sollte -> keine Reaktion deinerseits. Dann kommt das Gerücht auf dass die Daten binär gespeichert sein könnten. Wieder zeigt dir jemand wie man das machen könnte -> wieder nichts von dir. Und dann jammerst du herum wie schwierig es ist 3 Sprachen auf einmal lernen zu müssen und dass wir nur Kennern helfen würden.
Glaubst du nicht dass es auch an dir liegen könnte das da nichts gescheites dabei rauskommt. An mir solls nicht liegen. Würde gerne helfen wenn ich wüsste wobei.
Kurt
-
im ernst, alles steigt und faellt mit den grundlagen. ob du die beigebracht bekommst oder nicht ist irrelevant. im studium ist es deine aufgabe, zu koennen, was verlangt wird. das ist logischerweise schwierig, damit die spreu vom weizen getrennt wird. keiner schenkt dir was.
konkret: du willst bei dieser aufgabe hilfe, dann sag auch bitte, wo konkret dein problem ist.
wenn du keinen plan hast, wie du ueberhaupt anfangen sollst, dann fang am besten mit blatt und bleistift an, leg dich irgendwo gemuetlich hin und stell dir vor, wie das programm im groben laufen sollte. dann kritzelst du dir ein paar flow charts (freihandkreise und kaesteln verbunden mit geschwungenen strichen), damit du nicht alle detailgrade gleichzeitig im kopf haben musst.
wenn dir die "details" fehlen, dann kommt es immer gut, wenn man seine vollbrachten muehen darstellt. du sollst also kleine beispiele zeigen, in denen du zeigen kannst, wo deine probleme liegen. hat mehrere vorteile: wir, die helfenden, muessen weniger code lesen und du kommst vielleicht beim vorbereitend der beispiele von allein auf die loesungen. alternativ poste einfach deinen bisherigen code, damit wir auch experimentieren koennen (also vollstaendige kompilierbare codes).
dann ist es wichtig, dass du dein problem penibelst detailiert schilderst. bei "ich weiss nicht weiter" koennen wir dir nicht helfen. "ich kann die daten lesen und schreiben, aber nicht sortieren" ist schon viel besser, weil wir jetzt ansatzpunkte haben, dir zu helfen.machs uns einfach, dir zu helfen. hilf uns.