Datei in struct einlesen, C

#1549565
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?
Gast #1550297
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..... :(
#1550300
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.
Gast #1551019
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 :)
#1551039
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.

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren