wie speichere ich ein struct array und lese dies dann wieder ein?
-
Hallo,
wie schreibe ich ein struct array in eine Datei? Und anschließend sollen diese Daten wieder in ein struct array geschrieben werden.Gibt es da eine einfache Möglichkeit?
struct datum { int tag; int monat; int jahr; int windstaerke; int regendauer; int temp; int sonnenscheindauer; } daten[100];
Wenn es geht ohne lästige Trennzeichen o.ä.
Danke für eure Hilfe
-
Hi,
du suchst fread/fwrite .
-
ja das habe ich schon versucht, funktioniert aber nicht richtig, könntest du mir die funktion mit den ganzen parametern geben?
-
fread (daten,sizeof(struct datum),sizeof(daten)/sizeof*daten,fp);
-
Viperjumper schrieb:
ja das habe ich schon versucht, funktioniert aber nicht richtig, könntest du mir die funktion mit den ganzen parametern geben?
fopen(filename, "wb"); // ... fopen(filename, "rb");
Auf das b- Attribut kommt's an, Du mußt die Dateien im Binärmodus öffnen,
-
pointercrash() schrieb:
fopen(filename, "wb"); // ... fopen(filename, "rb");
Auf das b- Attribut kommt's an, Du mußt die Dateien im Binärmodus öffnen,
nö nur unter Wind00f
-
also irgendwie mach ich da wohl ein Fehler.
zuerst leg ich ein struct array an. das funktioniert auch.
dann rufe ich die funktion speichern auf, und zwar in der funktion der eingabe:void Eingabe(int nr, struct datum neu[]) { //da Frag ich die Wert eben ab speichern(*neu); } //Jetz kommt die Speicher Funktion: void speichern(struct datum sicher[]){ FILE *f; // Zeiger auf die Struktur zur Dateibearbeitung f = fopen("myfile.txt", "wb"); // Datei für Schreiben öffnen if(f == NULL) { printf("Datei %s kann nicht erstellt werden!\n"); system("PAUSE"); exit(0); } fwrite(sicher,sizeof(struct datum),sizeof(sicher)/sizeof*sicher, f); fclose(f); // File schließen system(" \n \n PAUSE"); }
dabei tritt folgender fehler auf, ohne eine Angabe in welcher zeile:
undefined reference to `speichern(datum)'
-
Du hast die Bedingungen geändert: Nu hast du kein Array mehr, sondern einen Zeiger. In dem Fall musst du die Anzahl der Elemente übergeben:
void speichern(struct datum* sicher, int n)
-
ja den zeiger hab ich nur gemacht damit der compiler nicht mehr meckert....
Jetzt hab ich sowas hier, immer noch der selbe Fehler:void speichern(datum,int);//Protoype der Funktion speichern(*neu,x);//Aufruf der Funktion void speichern(struct datum* sicher, int n){ FILE *f; // Zeiger auf die Struktur zur Dateibearbeitung f = fopen("myfile.txt", "wb"); // Datei für Schreiben öffnen if(f == NULL) { printf("Datei %s kann nicht erstellt werden!\n"); system("PAUSE"); exit(0); } fwrite(sicher,sizeof(struct datum),sizeof(sicher)/sizeof*sicher, f); fclose(f); // File schließen system(" \n \n PAUSE"); }
also wenn das auch ohne Zeiger geht ist mir das fast noch lieber!
Wäre cool wenn jemand mal ne komplette lösung mir gibt....DANKE
-
Die Anzahl auch an fwrite weitergeben: fwrite(sicher,sizeof(struct datum),n, f);
-
also wenn ich deine fwrite mit meiner ersetzte, bekomme ich immernoch den gleich scheiß fehler...
noch ne idee???
-
Meinste den undefined reference Fehler? Da wird wohl deine Funktion nicht gefunden. Mit ner Headerdatei inkludieren oder mit extern deklarieren/bekannt machen.
-
Viperjumper schrieb:
also wenn ich deine fwrite mit meiner ersetzte, bekomme ich immernoch den gleich scheiß fehler...
noch ne idee???
das Problem ist am wahrscheinlichsten hier
fwrite(sicher,sizeof(struct datum),sizeof(sicher)/sizeof*sicher, f);
denn
sizeof(sicher)/sizeof*sicher
ist stets konstant, und zwar 4/sizeof*sicher.sicher
ist kein Arrays, sondern ein Zeiger.In deiner Funktion 'speichern' musst du zusätzliche die Anzahl der Elemente übergeben, dann
void speichern(struct datum* sicher, int n, size_t len){ ... fwrite(sicher,sizeof *sicher, len, f); ... }
das hat dir aber Big brother schon 2 Mal gesagt, du musst nur lernen die Antworten zu lesen, sonst macht es keinen Sinn dir zu helfen.
-
und was ist jetzt meine "len"?
wie muss ich meinen prototypen und meinen funktionsaufruf ändern?
-
und was ist jetzt meine "len"?
len ist die Anzahl von Elementen, die du über 'sicher' übergibst.
wie muss ich meinen prototypen und meinen funktionsaufruf ändern?
copy & paste?
-
--
-
also der compiler bringt jetzt wenigstens keinen fehler mehr, doch steht dann nichts in der angelegtendatei drin, d.h. nur so rechteckige zeichen!!! Warum? Ist das normal?
Habe jetzt folgenden code:void speichern(struct datum* sicher,int n);//Protoype //******************************************** speichern(neu,x);//funktionsaufruf in der eingabefunktion //************************************************************* //die speicherfunktion selbst void speichern(struct datum* sicher,int n, size_t len){ FILE *f; // Zeiger auf die Struktur zur Dateibearbeitung f = fopen("myfile.dat", "wb"); // Datei für Schreiben öffnen if(f == NULL) { printf("Datei %s kann nicht erstellt werden!\n"); system("PAUSE"); exit(0); } len=sizeof(sicher);//len ermitteln fwrite(sicher,sizeof *sicher,len, f); fclose(f); // File schließen system(" \n \n PAUSE"); }
-
len=sizeof(sicher);//len ermitteln
das mit der anzahl der elemente hast du noch nicht verstanden.
nur so rechteckige zeichen drin ist normal, liest das ganze wieder ein und lass dir den inhalt anzeigen, nachdem du es mit der anzahl richtig gemacht hast.
-
ja mit der länge hab icha uch noch nicht wirklich verstanden!!!
wie ermittele ich sonst die länge???
-
Du ermittelst sie gar nicht. Du kennst sie. Schliesslich legst Du den Speicherbereich irgendwo an.
-
hi
möglicherweise nur für arrays#define array_length(x) (sizeof(x)/sizeof(x[0]))