Forum: PC-Programmierung Datei in struct einlesen, C


von Daniel (Gast)


Lesenswert?

Hallo, ich möchte gerne wissen wie ich Daten aus einer Datei einlesen 
kann und in ein struct bekomme?? Es handelt sich um verschiedene 
Datentypen... char, float, int,...

Wäre wirklich froh über Eure Antworten...

Liebe Grüße

von Daniel (Gast)


Lesenswert?

Achso die Daten sind durch punkte voneinander getrennt.... :)

von Klaus W. (mfgkw)


Lesenswert?

kommt auf die Datei an.

Entweder liegen die Daten dort binär vor, dann mit fread() lesen
(in der Hoffnung, daß die Daten dort auch im richtigen Layout
liegen, je nach System und Compiler beim Erzeugen).

Oder die Daten sind dort als Text abgelegt, dann Element für
Element z.B. mit fscanf() lesen.

Wenn du nicht mehr weißt, als aus deiner Frage hervorgeht, wirst
du nochmal nachdenken müssen.
Falls du doch mehr weißt: wieso verrätst du es dann nicht?

von Klaus W. (mfgkw)


Lesenswert?

Float-Zahlen, die einen Punkt enthalten, mit Punkten voneinander zu 
trennen, ist ziemlich schlau :-(

von Daniel (Gast)


Lesenswert?

Okay ;)

also ein bisschen genauer

habe hier sowas :

struct adres
{
char name[20] ;
char str [20] ;
char ort [20] ;
}

dann noch dieses :

struct pers
{
char artikel [20] ;
int anzahl [3] ;
float preis [6] ;
}

die datei sieht folgendermaßen aus : (doch semikolon, sorry)

Juergen Wolf;Hansestr 21;22222 Musterstadt;
Buch; 2; 20.20;
;
Martin Gans;Gartenstr 23;11111 Berlin;
Nutella; 3;2.10;
Marmelade;1;3.99;
;
usw
.
.
.

ich komm hier leider nicht weiter..... :(

von Karl H. (kbuchegg)


Lesenswert?

Daniel schrieb:

> struct pers
> {
> char artikel [20] ;
> int anzahl [3] ;
> float preis [6] ;
> }

BIst du dir da ganz sicher, dass ein pers 3 verschiedene Anzahlen und 6 
verschiedene Preise haben soll?

> die datei sieht folgendermaßen aus : (doch semikolon, sorry)
>
> Juergen Wolf;Hansestr 21;22222 Musterstadt;
> Buch; 2; 20.20;

eine Zeile mit fgets als Ganzes einlesen.
Dadurch bekommt man die Zeile als einzigen String eingelesen.
Danach im String die ';' suchen und die Einzelteile als Strings 
entsprechend umkopieren. Bei den Zahlen werden natürlich nicht die 
Teilstrings umkopiert, sondern die Teilstrings in die entsprechenden 
Zahlen umkonvertiert und dieses Ergebnis in der Struktur abgelegt.

fgets + strtok sind deine Freunde

fscanf könnte man auch nehmen. Da müsste man dann allerdings dem %s 
beibringen, dass es bei einem ; in den Daten dieses als Ende eines 
Teilstrings wertet. Mit den regex-Möglichkeiten, die es seit C99 gibt, 
sollte das machbar sein. Persönlich bevorzuge ich allerdings immer noch 
die alte fgets + strtok Methode. Ist beim Error-Handling, Ausgabe einer 
sinnvollen Fehlermeldung und Wiederaufsatz der Leseschleife nach einem 
Fehler einfach simpler zu handhaben.

von Klaus W. (mfgkw)


Lesenswert?

einfacher ginge es mit fscanf, wenn man die Formatierung verstanden
hat. Das ist hier aber vermutlich nicht der Fall.

Sieht eh nach Hausaufgabe aus, also würde ich mal wieder
pauschal auf das richtige C-Buch verweisen...

von Daniel (Gast)


Lesenswert?

Ja lieber Klaus, da hast du recht, deswegen versuche ich mir ja Hilfe zu 
holen um es endlich zu verstehen..... Natürlich war mein erster Blick 
der ins Buch, nur bin ich leider nicht so erfahren was das Programmieren 
angeht, daher fällts mir nicht so leicht das gelesene sofort richtig 
anwenden zu können...
Vielen Dank für den Tipp Karl, das habe ich natürlich falsch gemacht...

Ich danke euch für eure Antworten :)

von Karl H. (kbuchegg)


Lesenswert?

Klaus Wachtler schrieb:
> einfacher ginge es mit fscanf, wenn man die Formatierung verstanden
> hat. Das ist hier aber vermutlich nicht der Fall.

Da muss ich mich auch an der Nase nehmen :-)
Im "alten" C gab es die ausgefuchsteren Möglichkeiten der 
Formatierangaben nicht.
Wäre:

   fscanf(input, "%[^;]%[^;]%[^;\n]\n", str1, str2, str3);

korrekt?

(Ich bleib trotzdem bei der althergebrachten Methode, mit fgets eine 
komplette Zeile lesen und dann als String zerlegen :-) Schon alleine aus 
dem Grund, da ich dann auch Fehlerfall weiß, wo der Filepointer steht.

von Klaus W. (mfgkw)


Lesenswert?

... das kann man bei fscanf() auch erfahren, wenn man will
(über %n) :-)

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.