Einlesen mit fgetc() geht nicht
-
Hallo,
Ich haber wiedermal Probleme mit den File Streams. Ich habe versucht es in folgendem Demo nachzubauen. Ich bekomme einen Seg Fault bei der Funktion "read_char()" leider laesst sich fuer mich dort nicht die Zeile lokalisieren, in der das Programm aussteigt - mir kommt es sogar so vor, als wenn es jenachdem, wenn ich einen printf() Befehl hineinsetze sogar etwas weiterlaeuft als ohne??!!! Kann das sein? - Das Programm benoetigt noch eine .txt Datei zum einlesen, namens "file2.txt", bspw mit Text "Hello World!" - es sollte das File einlesen in einen Puffer 'content' und diesen auf dem Bildschirm ausgeben. Woran liegt dieses Verhalten und wie kann ich den Fehler beheben?
Ein anderes Problem ist die "Speichererweiterungsfunktion": getMoreSpace() die ich hier mal versucht habe zu implementieren. Ich denke sie kommt hier nicht zum Einsatz, wollte aber mal fragen ob man diese so implementieren kann oder ob sie grobe Fehler enthaelt und ich mir damit irgendwas zerschiessen kann?
// test.c #include <stdlib.h> #include <stdio.h> #include <string.h> #define LIN_LEN BUFSIZ int get_read_file_pointer(FILE **fp, char filename[FILENAME_MAX]) { *fp = NULL; if(filename == NULL) return -1; if((*fp = fopen(filename, "r")) == NULL){ perror("fo::get_read_file_pointer(FILE**, char[] - Failed!\n"); return -1; } return 0; }; int read_char(FILE* fp, char** content, unsigned long int* content_size) { if(fp == NULL) return -1; if(*content_size == 0) return -1; int c = 0; unsigned long int idx = 0; const unsigned long int INITIAL_SIZE = *content_size; // if pTemp full, append and allocate new space while( (c=fgetc(fp)) != EOF){ putchar(c); // print out on screen *content[idx] = c; if(idx >= (*content_size)-2){ if(getMoreSpace(content, content_size, INITIAL_SIZE) == -1){ fprintf(stderr, "fo::read_char(*fp, char**, unsigned long int*) - Failed!\n"); exit(EXIT_FAILURE); } } ++idx; } *content[idx] = '\0'; return 0; }; int getMoreSpace(char** str, unsigned long int* str_size, const unsigned long int how_much_more){ char* tmp = NULL; if((tmp = realloc(str, (*str_size + how_much_more))) == NULL){ free(tmp); tmp = NULL; return -1; } *str = tmp; *str_size += how_much_more; return 0; }; int close_stream(FILE** fp) { if(fp == NULL) return -1; int iRes = fclose(*fp); *fp = NULL; return iRes; }; int main() { // init long int* pFilesize = 0; FILE* fp = NULL; fp = malloc(sizeof(FILE)); char file2[] = "file2.txt"; unsigned long int content_size = LIN_LEN; char *content = malloc(content_size*sizeof(char)); strcpy(content,""); printf("%i - Get read file pointer to %s\n", get_read_file_pointer(&fp, file2), file2); printf("%i - Reading file characterwise\n", read_char(fp, &content, &content_size)); printf("content:\n\'%s\'\n", content); strcpy(content, ""); printf("%i - Close stream\n", close_stream(&fp)); printf("Done.\n\n"); return EXIT_SUCCESS; }
-
Ich denke, die Operatorpriorität stimmt nicht, versuch mal
(*content)[idx] = c;
Ich bin froh, daß ich nur noch C++ programmiere, dann entfallen diese ganzen Double-Pointer Parameter...
Bzgl. getMoreSpace:
du solltest auf keinen Fall free(NULL) aufrufen...
-
Also, das mit der Operatorenprioritaet hat gestimmt - danke!!! Hab es nun an
zwei Stellen entsprechend geklammert, es laeuft. Wegen der getMoreSpace()
Funktion, reicht denn einif(tmp!=NULL) free(tmp);
hier aus, statt:
free(tmp);
Th schrieb:
Ich denke, die Operatorpriorität stimmt nicht, versuch mal
Ich bin froh, daß ich nur noch C++ programmiere, dann entfallen diese ganzen Double-Pointer Parameter...Tja, nicht nur dass...
-
Hallo, noch ein kleiner Nachtrag, die "Speichererweiterungsfunktion" get_more_space() enthielt noch einige Fehler, naja war ja auch von mir..
Also hier die soweit verbesserte und getestete Version - falls sie jemand braucht (das arbeiten mit zweifachen Zeigern ist tueckisch!!!):
int get_more_space(char** str, unsigned long int* str_size, const unsigned long int how_much_more){ char* tmp = NULL; if((tmp = malloc((*str_size) * sizeof(char))) == NULL) return -1; if((tmp = realloc(*str, (*str_size + how_much_more))) == NULL){ if(tmp!=NULL) free(tmp); tmp = NULL; return -1; } *str = tmp; *str_size += how_much_more; return 0; };