Zeilenweises Auslesen aus Textdatei
-
Hallo Community
Mir wurde es als Aufgabe gestellt aus einer gegebenen Textdatei die so aussieht:
Milch 0.49
Käse 3.55
Spühlmittel 1.99Mein Lösungsansatz sieht derzeit folgendermaßen aus:
#include<stdio.h> int main () { FILE *datei; char string1[100]; char string2[100]; char string3[100]; double zahl1=0.0,zahl2=0.0,zahl3=0.0; datei = fopen ("artikel.txt", "r"); if (datei != NULL) { while(fscanf(datei,"%s %s %s %lf %lf %lf ",string1,string2,string3,zahl1,zahl2,zahl3) !=EOF) { printf("\n--------------------------------------\n"); printf("%s %s %s %s %i %i %i %i\n",string1,string2,string3,zahl1,zahl2,zahl3); printf("--------------------------------------\n"); } fclose (datei); } getch(); }
Wenn ich es dann jedoch ausführe stürzt das Programm ab, wenn die .txt jedoch nur aus einer Zeile besteht macht er es ohne Probleme...
wo ist mein fehler?
Und noch eine frage, wie kann ich das ganze variabel gestalten? Quasi dass ich in einer schleife alles einlese bei einer ungewissen anzahl an Zeilen?Danke im Voraus!
-
Dein Formatstring ist nicht geeignet um eine Zeile der Form
Produkt 0.45 \n
einzulesen
sondern für
pr1 pr2 pr3 1.0 2.0 5.1und bei printf ist der formatstring auch nicht passend
-
Stimmt, danke
und hast du eine Idee wie ich dies mit einer schleife für eine variable zeilenanzahl lösen könnte?
-
für eine variable zeilenzahl wirst du malloc usw. bemühen müssen
allerdings solltest du bei deiner jetzigen lösung aufpassen es könnte zu überläufen kommen deshalb
FILE *f = .... char str[100]; fscanf(f, "%99s", str);
oder du schreibst deine eigene string einlese funktion mit malloc für beliebig lange strings
-
Hast du schon structs kennen gelernt?
-
Ja, haben wir!
-
Mach eine struct aus Name und Preis.
Dann ein Array von der struct.
Dann hast du nicht 6 Variablen für 3 Produkte sondern nur noch eine mit einem IndexJetzt kannst du erstmal einlesen.
Wenn das klappt, kannst du dich um variable Zeilenzahl mit malloc kümmern (dann aber auch malloc für den Namen).
-
komme iwie nicht weiter mit dem Einlesen, hab keine Idee wie ich das in einer schleife realisieren soll... derzeit sieht es bei mir so aus:
#include <stdio.h> typedef struct{ double Preis; char Name[30]; }a[100]; void open ( FILE *datei, char dateiname[], a *artikel){ datei = fopen (dateiname, "r"); if (datei == NULL) printf("Fehler beim Einlesen der Datei"); else{ printf("Datei erfolgreich eingelesen!"); while ((fscanf(datei,"%s,%lf\n",&artikel.name,&artikel.preis)!=EOF)); } fclose(datei); } int main(){ a artikel; FILE *datei; char dateiname[50]="artikel.txt"; open(&datei,dateiname,&artikel); return 0; }
-
Sei nicht so faul und benenne den struct-Typ mal vernünftig.
Und Schleifen kennst du ja wohl.
Einfach das Array mit einem Index durchlaufen.
-
#include <stdio.h> typedef struct{ double Preis; char Name[30]; }Artikel[10]; void open ( FILE *datei, char dateiname[], Artikel *a){ int i=0; datei = fopen (dateiname, "r"); if (datei == NULL) printf("Fehler beim Einlesen der Datei"); else{ printf("Datei erfolgreich eingelesen!"); while (datei != EOF){ fscanf(datei,"%s %lf\n",a[i].Name,a[i].Preis); i++; } } fclose(datei); } int main(){ Artikel a; FILE *datei; char dateiname[50]="artikel.txt"; open(datei,dateiname,&a); return 0; }
Es stimmt trotz alledem etwas nicht in der Schleife und der Funktionsübergabe, weiß nur nicht was!
Folgende Meldung:
error: request for memberName' in something not a structure or union| error: request for member
Preis' in something not a structure or union|
-
Das & und * vor a muss weg.
-
Es comp. stürzt dann aber nach ausführen direkt ab...
geht meine while bedingung überhaupt so?while(datei != EOF){}
Weiß er denn dass er auf die nächste Zeile springen muss nach einem durchlauf?
-
Wenn a ein Zeiger auf einen einzelnen Artikel ist, was ist dann a[i]?
fussl134 schrieb:
geht meine while bedingung überhaupt so?
while(datei != EOF){}
Nein, das ist auf vielerlei Weise falsch. Vielleicht solltest du dir lieber erst einmal ein schlaues Buch besorgen und lesen, sonst müssen wir dir am Ende noch jede einzelne Zeile deines Programms korrigieren und verstehen wirst du die Korrekturen vermutlich auch nicht.