Beliebig viele int aus Zeile von File auslesen
-
Hallo!
Ich habe ein File in dem beliebig viele integer Werte pro Zeile stehen.
Diese sind durch ein Leerzeichen getrennt.Gibt es eine Möglichkeit das ich der Funktion fscanf sage das es beliebig viele int einlesen soll und in ein array speichern?
Also wenn ich jetzt weiß das es drei int sind dann kann ich das ja einfach machen:
fscanf (stdin, "%d %d %d", input[0], input[1], input[2]);Oder muss ich da jedes Zeichen einzeln mit einer Schleife auswerten?
lg,
godi
-
Du kannst die ganze Zeile einlesen. Danach die Zeile in Token zerlegen und diese per sscanf in einer Schleife verarbeiten.
-
Schleife.
fscanf (stdin, "%d ", input[i]);
-
godi schrieb:
Gibt es eine Möglichkeit das ich der Funktion fscanf sage das es beliebig viele int einlesen soll und in ein array speichern?
Nein.
godi schrieb:
Oder muss ich da jedes Zeichen einzeln mit einer Schleife auswerten?
Ja.
-
int fscan_int (FILE * fp, const char * form, int arr[]) { int zaehler; for (zaehler=0; fscanf (fp, form, &arr[zaehler]); zaehler++); return zaehler; }
Mal als kleiner schlecht überlegter Denkansatz...
Sollte sowas ähnliches tun, wie alle im Stream erreichbaren und über den formatstring erkennbaren Integers in dein Array zu klatschen.
Selber schauen obs funzt! Ist mir zu früh :p
-
Da muss aber noch eine Prüfung rein, dass nicht über das Ende des Arrays hinausgeschrieben wird. Denkbar:
size_t read_ints(FILE *fd, int *dest, size_t space) { size_t count; for(count = 0; count < space && 1 == fscanf(fd, "%d", dest + count); ++count) ; return count; } /* ... */ size_t n, i; int numbers[100]; FILE *fd; fd = fopen("foo.txt", "r"); n = read_ints(fd, numbers, 100); for(i = 0; i < n; ++i) { printf("%d\n", numbers[i]); }
-
Würmchen schrieb:
{ ... for (zaehler=0; fscanf (fp, form, &arr[zaehler]); zaehler++); ... }
Hier ist die Abbruchbedingung falsch, du läufst solange, wie fscanf != 0 liefert,
d.h. bei Dateiende brichst du nicht ab, da ( != 0 ) == ( == EOF ).
-
Danke Wutz, EOF hatte ich natürlich nicht bedacht - wie vieles andere auch
War mehr als Denkanstoß gedacht und nicht als paste&go snippet.