Textdatei komplett in einem Char speichern
-
Hallo,
Ich habe ne normale Textdatei mit einer bestimmten Anzahl an Zeilen. Jetzt würde ich den Inhalt der Datei gerne komplett in einer Variable speichern, um ihn dann weiterverwenden zu können. Hab leider grad gar keine Ahnung wie ich das machen soll. Ich habs mal so gemacht:
blabla[255]; ; FILE *fp = fopen("/tmp/test.txt", "r"); if ( fp ) { fgets(blabla,255,fp); fclose(fp); }
Das speichert mir aber leider nur eine Zeile in der Variable, aber ich braucht das Ganze File (Am besten wär's noch mit \n da wo die Zeilenumbrüche sind
Hoffe jemand kann mir auf die Sprünge helfen
-
Jo,
kein Problem.1. Datei binär öffnen (mit "b")
2. Speicherbereich der Dateigröße mit malloc reservieren.3. Die ganze Datei in einem Schwung mit fread in deinem Speicherbereich einlesen.
Ach, ich schreibs dir als Beispiel:
#include <io.h> #include <stdio.h> #include <malloc.h> #define DATEIGROESSE 12 int main() { FILE *fp = fopen("/tmp/test.txt", "rb"); if ( fp ) { char* my_Mem = malloc(DATEIGROESSE); if (!my_Mem) return -1; fread(my_Mem,sizeof(char), DATEIGROESSE, fp); free(my_Mem); fclose(fp); } } Wie man Standardkonform die Dateigröße ermittelt, weiß ich jetzt nicht. Dir fällt sicher was ein... :xmas2:
-
Juhuu, es klappt so ähnlich, danke
Musste es nur so machen:
char* my_Mem = (char *)malloc(DATEIGROESSE);
-
Kompilierst du vielleicht als C++ ?
-
SeppSchrot schrieb:
Kompilierst du vielleicht als C++ ?
würde mich nicht wundern, das machen die meisten. Ich verstehe nicht, warum sie nicht gleich C++ programmieren, wenn sie sowieso alles in .cpp Datein reinstecken.
-
supertux schrieb:
SeppSchrot schrieb:
Kompilierst du vielleicht als C++ ?
würde mich nicht wundern, das machen die meisten. Ich verstehe nicht, warum sie nicht gleich C++ programmieren, wenn sie sowieso alles in .cpp Datein reinstecken.
Manchmal hilft es nicht nur die Dateiendung zu ändern ;).
-
zum Thema Dateigröße aus nem tut:
FILE *fz; char *buffer = NULL; int iFileSize; fz = fopen("text.txt", "rb"); if(fz != NULL) { fseek(fz, 0, SEEK_END); iFileSize = ftell(fz); buffer = malloc(iFileSize); fseek(fz, 0, SEEK_SET); fread(buffer, 1, iFileSize, fz); fclose(fz); }
Viel Spaß
Euer ItsNotYou
-
Hier mein Vorschlag nochmal bei einem sequentiellen Zugriff.
Zeile für Zeile wird von "buffer" mit strcat() nach "eingelesen" angefügt.
Die Methode ist bestimmt nicht sehr elegant, gelobe aber Besserung.#include <stdio.h> #define MAX 100000 FILE *fp; char *filename = ".//test.txt"; char *buffer = NULL; char gelesen[MAX]; int main() { fp = fopen(filename, "r"); if(fp == NULL) { printf("Fehler: Datei %s kann nicht geoeffnet werden!\n", filename); } else { buffer = malloc(MAX); if(buffer == NULL) { printf("Nicht genug Speicher vorhanden.\n"); } while(!feof(fp)) { fgets(buffer, MAX, fp); strcat(gelesen, buffer); } fclose(fp); } printf("%s", gelesen); while(getchar() != '\n'); return 0; }
#define MAX 100000, damit es auch etwas mehr Zeilen sein dürfen.
-
@ItsNotYou, hier im Forum meinte mal irgendjemand (weiß leider auch nicht mehr wer), dass fseek( SEEK_END/SEEK_SET ) nicht immer funktionieren muss, wenn man es zur Größenbestimmung von Dateien verwendet. Daher sollte man lieber auf Funktionen des Betriebssystems zurückgreifen. fseek hat jedoch bisher bei mir immer funktioniert