Datei zeilenweise auslesen und Zeilenanzahl feststellen
-
Hallo!
Ich habe eine Text-Datei, in der durch Tabs getrennt zwei Zahlenspalten beliebiger Länge stehen, also:1 2
3 4
5 6
7 8usw.
In meinem kleinen C-Programm möchte ich diese Datei derart einlesen, dass ich schlussendlich zwei Array vorliegen habe, in denen die beiden Spalten separat abgespeichert sind, also:
spalte1[0] = 1 spalte1[1] = 3 ... spalte2[0] = 2 spalte2[1] = 4 ...
Dieses Format ist notwendig, damit ich mit den einzelnen Koordinatenpaaren (um die handelt es sich nämlich) diverse Berechnungen anstellen kann.
Meine Fragen sind nun:
a) Wie kann ich dieses Text-file zeilenweise einlesen, so dass die Trennung der Zahlenspalten berücksichtigt wird und ich danach die herausgelesenen Daten in das Array abspeichern kann?
b) Eng damit verbunden: Wie lasse ich mein Programm herausfinden, wie viele Zeilen meine Textdatei hat (muss es ja wissen, damit es das Array in der entsprechenden Größe bereitstellen kann).Kann mir da jemand weiterhelfen?
Vielen Dank!
-
mit fscanf in ner schleife die Daten einlesen und
nen Zeilenzähler mitlaufen lassen.
-
Ich hab das mal mit folgendem Code realisiert:
for(i=0; ; i++){ fscanf(inputdatei, "%f %f", &x, &y); x_koordinaten[i] = x; y_koordinaten[i] = y; printf("Zeile Nr. %d: %f und %f\n", i+1, x_koordinaten[i], y_koordinaten[i]); } printf("Die Datei hat %d Zeilen.", i);
Das Problem ist aber nun für die for-Schleife: Sie weiß doch gar nicht, wo sie enden soll! Das macht sich beim Ausführen des Programms logischerweise dadurch bemerkbar, dass es versucht, weitere Zeilen zu lesen (macht es auch und gibt dann irgendwelche Werte aus) und schließlich mit der Meldung "Speicherzugriffsfehler" abbricht.
Wie bringe ich denn der Schleife bei, dass sie am Ende der Input-Datei angelangt ist und abbrechen soll?
-
Oli90x schrieb:
Wie bringe ich denn der Schleife bei, dass sie am Ende der Input-Datei angelangt ist und abbrechen soll?
for (i = 0; !feof (inputdatei); i++) { ... }
-
Hi!
So kannst du die Koordinaten einlesen:
int main() { char* filename = "test.txt"; double x, y; FILE* fp = fopen (filename, "r"); if ( fp == NULL ) return 1; while ( 0 == feof (fp) ) { if ( 2 != fscanf (fp, "%lf %lf\n", &x, &y)) puts ( "Koordinatenpaar unvollstaendig!" ); else printf ( "%lf %lf\n", x, y ); } fclose(fp); return 0; }
-
Am besten wäre es, wenn du das Dateiformat selbst bestimmen könntest; dann ist es möglich, einmalig Speicher bereit zu stellen und alles mit einer Anweisung (fread) einzulesen.
Wenn das nicht möglich ist: dann nimm zum Einlesen einen Puffer mit einer definierten Blockgröße (je nachdem, z.B. für 100 Koordinaten). Wenn der Puffer voll ist, dann erweiterst du ihn einfach um den nächsten Block, usw.
Zum Speichern von Koordinaten bietet sich ein Strukturarray/Strukturliste an:
struct Coord { double x, y; }Coord;
Die Struktur lässt sich einfach auf mehrere Dimensionen erweitern.
-
Hallo Leute,
ich habe mal das gleiche probiert, bin mir aber nicht im klaren wie ich die Arrays deklarieren muss ...
Wenn ich es so mache:int *a; a = (int*)malloc(j*sizeof(int)); int *b; b = (int*)malloc(j*sizeof(int)); int *c; c = (int*)malloc(j*sizeof(int)); int *d; d = (int*)malloc(j*sizeof(int)); int *e; e = (int*)malloc(j*sizeof(int)); int buffera=0, bufferb=0, bufferc=0, bufferd=0, buffere=0; fopen_s(&datei1, "test1.txt", "r"); fopen_s(&datei2, "test2.txt", "a"); for (int i = 0; !feof (datei1); i++) { fscanf_s(datei, "a: %d\tb: %d\tc: %d\td: %d\te: %d\n", &buffera, &bufferb, &bufferc, &bufferd, &buffere); a[i] = buffera; b[i] = bufferb; c[i] = bufferc; d[i] = bufferd; e[i] = buffere; fprintf (datei2, "Zeile Nr. %d: a: %d\tb: %d\tc: %d\td: %d\te: %d\n", i+1, a, b, c, d, e); } fclose(datei1); fclose(datei2);
bekomme ich eine Fehlermeldung, das die Arrays von unbekannter größe sind. Aber das sollen sie doch eigentlich auch sein. Je nachdem wie lange das file ist.
File datei1:
a: 1 b: 23 c: 52 d: 5 e: 13 a: 45 b: 354 c: 22 d: 45 e: 3 ... a: 37 b: 43 c: 2 d: 15 e: 53 ...
Gruß Saul
-
Sicher muss ich wieder malloc nutzen oder?
int *a; a = (int*)malloc(j*sizeof(int));
// Edit
jo klappt
-
Hi,ich hab ein ähnliches Problem.
Ich muss eine Datei einlesen deren Daten etwa so aussehen:
1 00000 0,600
2 00300 0,687
3 00600 0,623
4 00900 0,637
5 01200 0,746
der ganze Spaß ist 250 Zeilen lang...
Zur Erklärung:
1 (Nummer d Messung)
00000 (Koordinate)
0,600 (Messwert)Ich komm nicht ganz klar mit dem, was mit prinf() liefert.
{ char c; char puffer[1024]; char* pp; // Pointer auf den Puffer int wert,wert2, ao ; float wert3; char filename[80] = "c:\\temp\\dat.txt"; FILE *fp; fp = fopen(filename,"r"); if (fp==NULL) { printf("Fehler: Datei %s nicht geöffnet !!",filename); } else { do // Datei erfolgreich geöffnet – nun ist Lesen möglich { ao=fscanf(fp,"%i %s %f",&wert, puffer, wert3 ); if ( ao != -1 ) { printf("%i %s %f \n", wert, puffer, wert3 ); // Testausgabe } } while (ao!=EOF) ; //Prüfen auf End Of File if ( ! fclose(fp)) // ungleich 0 -> Erfolg printf("Datei erfolgreich geschlossen");
Die erste Zahl (Nummer der Messung) und die zweite Zahl (Koordinate) gibt er mir sauber raus, aber bei der dritten (Messwert) macht er irgendwas und das Versteh ich nicht. Kann mir jemand meinen Fehler sagen? Ich seh ihn nicht
Schon mal danke im Vorraus
-
Falsches Forum (du machst C), Threadnekromantie.
Wenn du deine Frage nochmal vernünftig neu stellst, dann:
- Stehen in der Datei wirklich Kommas als Dezimaltrennzeichen?
- "Macht irgendwas", "versteh ich nicht", usw. sind weder brauchbare Fehlerbeschreibungen noch brauchbare Fragen. Die mit wichtig markierten Threads im Forum helfen dir, Fragen zu stellen, die besser zu beantworten sind.edit: Ups, war ja C-Forum. War in Gedanken noch bei C++. Dann passt es schon. Aber Threadnekromatie wird trotzdem nicht gerne gesehen.