mit fscanf komplette Datei auslesen
-
Hiho,
habe folgendes Problem: Ich habe eine Datei erstellt und mit "fprintf" etwas hineingeschrieben. Es sind sowohl Strings, als auch Zeilenumbrüche, Tabs, Zahlen(damit es schöner aussieht^^). Jetzt habe ich eine Funktion geschrieben, die diesen Inhalt auslesen soll:
void load(char *filename, bundesligatabelle *tab) { char *text; FILE *f; f=fopen("C:\\DATEIPFAD\\Datei.txt","r"); fscanf(f,"%s",text); printf("%s",text); fclose(f); }
Allerdings liest er nur die erste Zeile der Txt Datei und schreibt sie in meinen "text" char.
Wie bekomme ich die restlichen Sachen in meinen Char sodass ich den gesamten Inhalt der Datei ausgeben kann? Denn eigentlich sind Zeilenumbrüche etc. doch auch durch gewisse Zeichen beschrieben!?
Gruß
-
char *text;
Tanzender Zeiger. Der zeigt irgendwo hin. Sehr schlechte Idee. Gib ihm Raum.
Dann nimm einfach man: fread.
-
sry ich weiß nicht was du mit tanzendem zeiger meinst, das andere werd ich mal ausprobieren
-
mstrkrft_ schrieb:
sry ich weiß nicht was du mit tanzendem zeiger meinst, das andere werd ich mal ausprobieren
Du mußt dem char* mittels malloc Platz zuweisen, sonst kracht's. Das mit dem scanf landet irgendwo im Speicher, weil der Zeiger drauf nicht initalisiert und nicht mit alloziertem Speicher versorgt ist.
-
In dem Fall könntest du im Prinzip statt dem malloc() auch ein lokales Array anlegen, und das Array statt dem Zeiger verwenden:
/* ungetestet */ #define FILEBUFSIZ (1024*8) void load(char *filename, bundesligatabelle *tab) { static char text[FILEBUFSIZ]; /* Array mit fester Grösse als Puffer */ FILE *f; f=fopen("C:\\DATEIPFAD\\Datei.txt","r"); /* Sieht tricky aus, spart aber eine temp. Variable für die Rückgabe von fread(), das ist nämlich die Anzahl der gelesenen Zeichen, und also auch das Offset für den Nullterminator. Ich lese ein Zeichen weniger als Platz ist, damit ich sicher noch die Null am Ende unterbringe. */ text[fread(text, FILEBUFSIZ - 1, 1, f)] = 0; fclose(f); printf("%s",text); /* Warum nicht gleich printf(text)? Oder (noch schlauer): puts(text) */ }
Warum ist der Vorschlag von pointercrash() besser als ein Puffer mit fixer Grösse? Das liegt daran, dass man einen Bereich, den man von man: malloc bekommen hat, mit realloc() im Nachhinein einfach vergrössern kann, was mit dem hartkodierten Puffer nicht möglich ist.
-
sry ich weiß nicht was du mit tanzendem zeiger meinst, das andere werd ich mal ausprobieren
Hast recht, das war eine sehr knappe Erklärung. Aber das Bild des tanzenden Zeigers ist allgemein bekannt:
http://en.wikipedia.org/wiki/Fandango_on_coreNur war es fast schon gemein, vorauszusetzen, dass du das kennst.
Jetzt alles klar?
-
hi, habs jetzt einfacher gemacht:
void load(char *filename, bundesligatabelle *tab) { char *text; text=malloc(400); FILE *f; f=fopen("DATEIPFAD\\Datei.txt","r"); fscanf(f,"%400c",text); printf("%s",text); fclose(f); }
find ich irgendwie am sinnigsten, da ich noch kein fread hatte...das programm funktioniert auch so
dankedanke nochmal an alle!
-
das programm funktioniert auch so
Du musst noch höllisch aufpassen, dass du den Speicher von malloc() mit free() wieder zurückgibst. Das kann auch woanders passieren als in dieser Funktion, aber irgendwann muss es passieren, sonst ist das Ding Schrott.