mikrocontroller.net

Forum: PC-Programmierung Datei in struct einlesen, C


Autor: Daniel (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Daniel (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Achso die Daten sind durch punkte voneinander getrennt.... :)

Autor: Klaus Wachtler (mfgkw)
Datum:

Bewertung
0 lesenswert
nicht 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?

Autor: Klaus Wachtler (mfgkw)
Datum:

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

Autor: Daniel (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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..... :(

Autor: Karl Heinz (kbuchegg) (Moderator)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Klaus Wachtler (mfgkw)
Datum:

Bewertung
0 lesenswert
nicht 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...

Autor: Daniel (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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 :)

Autor: Karl Heinz (kbuchegg) (Moderator)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Klaus Wachtler (mfgkw)
Datum:

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

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.