2017-11-19 3 views
2

Alles, was ich tun will, ist eine Datei Inhalt lesen und sie zu einer Zeichenfolge.
Ich habe ein Problem beim Lesen aus der Datei. Ich beginne mit fgets zu lesen und wenn mein Platz nicht ausreicht, speichere ich den Speicher neu. Wenn ich versuche, erneut zu schrumpfen, stürzt es ab. Ich lese, dass es mit den Meta-Daten von malloc sein könnte, aber ich kann nicht sehen, wie ich sie beeinflusse. Vielen Dank im VorausLesen mit malloc und Realloc aus Datei

int readStringFromALE(int height,int width,char **stringImage,FILE *fout){ 
    char buffer[BUFFER_SIZE] = {'\0'}; 
    *stringImage=(char *)malloc(sizeof(char)*BUFFER_SIZE+1); 
    *stringImage[0]='\0'; 
    int i=1; 
    int size=sizeof(char)*BUFFER_SIZE,readSize=0; 
    while(fgets(buffer, sizeof(buffer), fout) != NULL){ 
     strncat(*stringImage,buffer,strlen(buffer)+1); 
     readSize+=strlen(buffer)+1; 
     printf("%s",buffer); 
     if(size<=readSize){ 
      char *temp; 
      temp=(char *)realloc(*stringImage,i*BUFFER_SIZE*sizeof(char)+1); 
      if(temp==NULL){ 
       printf("Unable to allocate memory\n"); 
       return EXIT_FAILURE; 
      } 
      i++; 
      *stringImage=temp; 
      size=i*BUFFER_SIZE*sizeof(char); 
     } 
     if (buffer[strlen(buffer) - 2] == ':') 
      break; 
    } 
    char *temp=(char *)realloc(*stringImage,strlen(*stringImage)+10); 
    if(temp==NULL){ 
     printf("Unable to allocate memory\n"); 
     return EXIT_FAILURE; 
    } 
    *stringImage=temp; 
    return EXIT_SUCCESS; 
} 
+1

Vielleicht möchten Sie [getline (3)] (http://man7.org/linux/man-pages/man3/getline.3.html) –

+1

'strncat (* stringImage, Puffer, strlen (Puffer) +1); 'ist gefährlicher Unsinn. – wildplasser

Antwort

1

mit fgets Versuchen Sie, das Ende der Zeichenfolge (* stringImage + len) bei jedem Aufruf zu lesen.

#include <stdio.h> 
#include <stdlib.h> 
#include <string.h> 

#define BUFFER_SIZE 10 

int readStringFromALE(int height,int width,char **stringImage,FILE *fout){ 
    char *temp = NULL; 
    size_t size = 0; 
    size_t dif = 0; 
    size_t len = 0; 

    while (1) { 
     if (NULL == (temp = realloc (*stringImage, size + BUFFER_SIZE))) { 
      fprintf (stderr, "problem realloc\n"); 
      free (*stringImage); 
      return 0; 
     } 
     *stringImage = temp; 
     //len = strlen (*stringImage); 
     dif = BUFFER_SIZE + (size - len); 
     if (fgets (*stringImage + len, dif, fout)) { 
      len += strlen (*stringImage + len); 
      if ((*stringImage)[strlen(*stringImage) - 2] == ':') 
       break; 
     } 
     else { 
      printf("\n\n---end of file---\n"); 
      break; 
     } 
     size += BUFFER_SIZE; 
    } 
    temp=(char *)realloc(*stringImage,strlen(*stringImage)+10); 
    if(temp==NULL){ 
     printf("Unable to allocate memory\n"); 
     return EXIT_FAILURE; 
    } 
    *stringImage=temp; 
    return EXIT_SUCCESS; 
} 

int main(int argc,char** argv){ 
    char *stringImage = NULL;//so realloc will act like malloc on first call 
    int height = 0; 
    int width = 0; 
    FILE *fout = NULL; 

    if (NULL == (fout = fopen ("somefile.txt", "r"))) { 
     perror ("problem"); 
     return 0; 
    } 

    readStringFromALE(height, width, &stringImage, fout); 
    fclose (fout); 
    printf("%s\n\n",stringImage); 

    free (stringImage); 

    return 0; 
} 
+0

Vielen Dank ich habe es ausprobiert und es funktioniert perfekt !!! Ich habe nie daran gedacht, die Fgets zu benutzen, um die Saite zu füllen. –