Probleme mit Dateizugriffen
-
Moin zusammen,
ich habe von euch vor längerem schon mal einen Vorschlag bekommen, wie ich aus cvs-Dateien Daten extrahieren kann. Ich habe einen Wert als Integer vorgegeben, und die zugehörigen Daten aus der Zeile ausgeprintet. (Ich gebe Artikelnummer ein, und bekomme Preis, Bezeichnung usw.) wieder raus.
Jetzt habe ich längere Artikelnummern, sodass ein Integer nicht mehr geht. Ich habe Strings genommen. Aber jetzt funktioniert es nicht richtig. Es wird immer nur der erste Wert aus der Datei gelesen. Wenn der nicht mit der Artikelnummer übereinstimmt, wird die nächste Zeile NICHT gescannt. Warum? Kann jemand helfen? Gerne Kann die Funktion auch "umgestrickt" werden.int readrow(FILE *fp, char column_a[20], char *column_b, double *column_c) { int c; int found; int n; int test; /*Erste zeile ueberlesen*/ c = fgetc(fp); while(c!='\n' && c !=EOF) c = fgetc(fp); rc = 0; found = 0; test=0; while(!found && c!=EOF) { /*Wert aus Spalte A einlesen*/ fscanf(fp,"%[^;]", i); printf("i: %s\n", i); printf("a: %s\n", column_a); /*Wert aus Spalte A mit a vergleichen*/ for (n=0; n<20; n++) { if (i[n] != column_a[n]) { printf("Ungleichheit\n"); /*fals nicht gleich zur naechten Zeile Springen*/ c = fgetc(fp); while(c!='\n' && c !=EOF) c = fgetc(fp); test=1; } } if(test==1) { fscanf(fp,"%[^;]", i); printf("i: %s\n", i); } if (test==0) { printf("Gleichheit\n"); rc = 1; /*falls doch beiden anderen werte einlesen;*/ fgetc(fp); /*;-lesen*/ rc += fscanf(fp, "%[^;]", column_b); fgetc(fp); /*;-lesen*/ rc += fscanf(fp, "%lf", column_c); found = 1; } } return rc; }
Achso, was genau macht eigentlich
c = fgetc(fp); while(c!='\n' && c !=EOF) c = fgetc(fp);
Beste Abendliche Grüße
(und Danke schon mal)
-
hilo schrieb:
Achso, was genau macht eigentlich
c = fgetc(fp); while(c!='\n' && c !=EOF) c = fgetc(fp);
Beste Abendliche Grüße
(und Danke schon mal)Netter Einfall, bei der Ausgangsfrage, gerade noch diese Frage zu stellen :).
(was für ein deutsch, ein glück, dass kein semikolon drin war :))Nun ja, int fgetc(FILE *fp)
liest ein Zeichen von dem Eingabe-Stream, auf den
fp verweist. Der Return-Wert ist das gelesene Zeichen oder EOF, wenn ein
Fehler auftrat ;).
Zeilenweise lesen:
char *fgets(char *buf, int n, FILE *fp)
liest vom Eingabe-Stream, auf den
fp verweist, bis zu n-1 Zeichen in den mit buf angegebenen Puffer und hängt
ein Null-Zeichen an. Das Lesen wird beim Erreichen eines Zeilenendes oder des
Dateiendes beendet. Ein gelesenes Newline-Zeichen '\n' bleibt erhalten, d. h.,
es wird im Puffer gespeichert. Der Return-Wert ist entweder buf oder NULL, wenn
ein Fehler auftrat.
Oder
Blocks lesen:
size_t fread(void *buffer, size_t size, size_t n, FILE *fp)
liest bis zu n Objekte der Größe size aus dem durch fp adressierten Stream
und schreibt sie in den Vektor, auf den dessen Anfang buffer zeigt. Der Return-Wert ist die Anzahl der gelesenen Objekte.
-
ha, und was muss ich machen, damit mein programm läuft?
Wenn es mit integern geht, muss es doch auch mit strings möglich sein...
-
strcmp()
-
Ja, das wäre eine gute Möglichkeit.
Dann müsste ich einen String-Arry nicht zeichenweise vergleichen wie beifor (n=0;n<10;n++) { if (arry1[n] == arry2[n] { ...
aber das Problem ist ja, dass ich nicht weiss, wie ich in die nächste Zeile springe. Wie das bei mir aussieht, hast du ja oben gesehen...
String;Int;Double;Int stringnummereins001;123;0.325;1 stringnummerzwei002;234;0.795;2 stringnummerdrei004;567;0.985;3 stringnummervier005;789;0.515;4
Also, ich öffnen die Datei und suche in der ersten "Spalte" (??? iste es eine???) nach "stringnummerdrei004". rauskommen soll dann "567" , "0.985" und "3"
-
omfg, wo bin ich hier nur gelandet...
also du machst folgendes:
zeilenweise lesen mit fgets
zeilen zerhacken mit sscanfdann hast du die wahl...
entweder: das zerhackte irgendwo inn speicher packen und dann filtern
oder: gleich beim lesen filternsag mal, belegst du keinen kurs, wo du programmieren lernst? wenn du ein gutes buch ueber programmierung (wie z.b. k&r C oder sicp) liest, werden eigentlich alle deine probleme geloest.
davon mal abgesehen, dir steht die komplette befehlsreferenz von ansi c zur verfuegung. schmoeker da drin und such mal selber nach ner loesung. wie soll das denn nur weitergehen, wenn du nie ohne hilfe ans ziel kommst?
jaja, anfaenger brauchen hilfe. das is mir klar. dann such dir aber auch nicht so grosse ziele aus, sondern geh in kleinen schritten vor.