Char zu "String".
-
Hallo,
Ich habe es jetzt so gemacht:
main.c - int main:
char *buffer; //... input = fopen("input.txt","r"); //... buffer = (char*)malloc(ftell(input)); //... /* Das geht alles wunderbar, das einlesen der File auch, aber hier kommt immer eine Art Segmentation fault: */ fclose(input); free(buffer); printf("\n"); system("PAUSE"); //ab hier return 0;
why? Danke
-
hast du vor dem ftell sowas gemacht?
fseek (input, 0, SEEK_END);
ausserdem besser im binary mode öffnen: fopen("input.txt","r+b")
-
Hi net,
habe jetzt:
fseek(input,0, SEEK_END);
buffer = (char*)malloc(ftell(input));Jetzt spuckt er nur Herzchen aus in der Dos Zeile... super, zuerst geht er nicht, dann ist er in mich verliebt.
gruss johnny.xy
-
johnny.xy schrieb:
fseek(input,0, SEEK_END);
buffer = (char*)malloc(ftell(input));vor'm einlesen musste den filepointer wieder auf den anfang setzen. probier mal dies:
... fseek(input,0, SEEK_END); buffer = (char*)malloc(ftell(input)); fseek(input, 0, SEEK_SET); ...
oder als extra funktion um die grösse rauszufinden:
long file_size (FILE *f); { long cur_pos, length; cur_pos = ftell(f) fseek(f, 0, SEEK_END); // set pointer to end of file length=ftell(f); // offset in bytes from file's beginning fseek(f, cur_pos, SEEK_SET); // restore original position return length; }
-
#include <stdio.h> int main(int argc, char *argv[]) { FILE *input = fopen(argv[1], "r"); char *text; int len; fseek(input, 0, SEEK_END); /* Ans Ende der Datei gehen (genaugenommen hinter das Ende der Datei) */ len = ftell(input); /* Momentane Position in der Datei merken, also in diesem Fall die Länge der Datei */ rewind(input); /* Wieder auf Anfang gehen */ /* Speicher alloziieren - einen mehr als die Länge der Datei für den Sentinel. * calloc überschreibt den Speicher mit Null - das ist hier vielleicht etwas * verschwenderisch, aber zu Anschauungszwecken OK, und so ist sicher, * dass der Sentinel auch \0 ist. Alternativ: * * text = (char*) malloc(len + 1); * text[len] = '\0'; */ text = (char*) calloc(len + 1, sizeof(char)); fread(text, sizeof(char), len, input); /* Datei einlesen */ printf(text); /* Datei ausgeben */ free(text); /* Speicher freigeben */ return 0; }
-
Hi,
Danke OxDeadBeef. Ist malloc weniger verschwenderisch? Wieso ist es verschwenderisch und was ist "Sentinel"?
Vielen Dank für eure treue Hilfe.
johnny.xy
PS: Um euch herum werd ich ja richtig gut *hehe*
-
Erstmals, sorry für doppelposting! Ist normalerweise nicht meine Art.
Wieso len + 1 in der calloc? Ich habe es nur mit len probiert, aber ich stelle keinen Unterschied fest.
Danke
-
Der Sentinel ist das Zeichen, das das Ende des Strings markiert. In C ist das '\0'.
len + 1 deshalb, weil der String sowohl den Inhalt der Datei als auch den Sentinel fassen muss. Wenns auch mit len geht, war wahrscheinlich ein \0-Zeichen am Ende der Datei.
calloc braucht in der Tat mehr Rechenzeit als malloc (jedenfalls, wenn die Implementierung nicht völlig bekifft gemacht ist), weil calloc mehr macht als malloc. malloc fordert Speicher an, calloc fordert Speicher an und überschreibt ihn mit Nullen. Da uns in diesem Fall nur interessiert, dass am Ende des Strings eine Null steht, ist calloc eigentlich overkill.
-
HI,
Nun bin ich ein wenig verwirrt, aber ich versuchs:
malloc: erstellt Dyn. Speicherbereich
calloc: erstellt Dyn. Speicherbereich und füllt diesen mit Nullen + Sentinel?
realloc: verändert den Dyn. Speicherbereich?Vielen Dank.
Gruss, johnny.xy
-
johnny.xy schrieb:
realloc: verändert den Dyn. Speicherbereich?
jo, im einfachsten (und langsamsten) fall macht 'realloc' ein weiteres malloc, kopiert die daten aus dem alten speicher da rüber und löscht den alten speicherbereich.
-
Vielen Dank für eure treue Hilfe.
johnny.xy