Groesse einer Textdatei bestimmen
-
Hallo zusammen,
leider habe ich bisher nicht gefunden wonach ich suche.
Ich denke ihr koennt mir hier schnell weiterhelfen.Ich habe eine Textdatei, die 1000 Zeilen hat und in jeder Zeile steht eine Zahl, z.B 0.22474.
Jetzt wuerde ich gerne mit der malloc() Funktion die Groesse bestimmen und damit ein Array erstellen, so dass ich nicht von Hand Array[1000] schreiben muss, sondern diese 1000 automatisch erzeugt wird und ich in Zukunft auch kleinere oder groessere Daten einlesen kann.Hier mein Code, der nicht so funktioniert wie ich das gerne haette
#include <stdio.h> #include <stdlib.h> int main() { int c = 0; int len = 0; double *X = NULL; FILE *fp; fp = fopen("Samples.txt","r"); if (fp == NULL) { printf("Error: can't open file!\n"); } while(c != EOF) { c = fgetc(fp); len++; } X = malloc(len * sizeof(double)); for (c = 0; c < len; c++) { X[c] = c; printf("Array [%lf]: %lf\n", c,X[c]); } free (X); return 0; }
Ich hoffe ihr koennt mir schnell helfen, da ich schon was laenger jetzt dran sitze...
Besten Dank schonmal!
-
fseek + ftell
http://en.cppreference.com/w/cpp/io/c/ftell
If the stream is open in binary mode, the value obtained by this function is the number of bytes from the beginning of the file.
caveat:
If the stream is open in text mode, the value returned by this function is unspecified and is only meaningful as the input to std::fseek
-
Du zählst die Anzahl der Zeichen in der Datei.
Du möchtest aber die Anzahl der Zeilen wissen.Dass du die Datei dann nochmal einlesen musst (zum Speichern im Array), ist dir klar?
-
DirkB schrieb:
Du möchtest aber die Anzahl der Zeilen wissen.
Ach das will er - dann muss er eben alle "\n" zählen und evtl. 1 dazuzählen falls die letzte Zeile keine Leerzeile ist.
-
Jap genau, ich moechte die Anzahl der Zeilenwissen, nicht der Zeichen.
Danke fuer den Hinweis, das bringt mich aufjedenfall schonmal weiter!
-
Hmmm ich komme gerade leider nicht dahinter wie ich die Zeilen gezaehlt bekomme bzw an welcher Stelle ich dem Programm mitteilen kann, dass es nur den Zeilenumbruch zaehlen soll.
-
if (c == '\n') zeilen++;
-
Vielen Dank!
Zugegebenermassen haette ich da auch selber drauf kommen muessen.
Naja, manchmal laeuft es halt nicht Rund
-
Anstatt jetzt einzelne Bytes zu lesen, '\n's zu zählen und dann Speicher zu allozieren, könntest Du natürlich auch erst Speicher allozieren. Dann lesen bis Speicher voll. Noch mehr Speicher allozieren, weiterlesen usw.
Setzte allerdings voraus, dass Du Dir
realloc()
anschautest. Was sich aber sicher lohnt...
-
Mit realloc() hab ich schon ein wenig rumgespielt.
Bin aber jetzt auch komplett ohne malloc() oder dergleichen ausgekommen, weil
das was DirkB gepostet hat fuer meine Zwecke am besten war.
Keep it simple
-
BlackWolf89 schrieb:
Bin aber jetzt auch komplett ohne malloc() oder dergleichen ausgekommen,
Und wo hast du den Speicher für deine Daten her?
-
So habe ich das jetzt fuer mich geloest:
while(n != EOF) { n = fgetc(fp); if (n == '\n') { len++; } } rewind(fp); double X[len+1];
-
VLA´s sind selten die richtige Lösung.
Die Malloc / Realloc Lösung sollte dein Freund sein