Advertisement
jjessie

ReadFile Function

Jul 31st, 2011
100
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C 1.19 KB | None | 0 0
  1. char *ReadFile(char *filename)
  2. {
  3.     // declare file pointer f
  4.     FILE *f;
  5.    
  6.     f = fopen(filename, "r");
  7.     // growable buffer for chars
  8.     char *buffer = NULL;
  9.    
  10.     // capacity of buffer
  11.     unsigned int capacity = 0;
  12.    
  13.     // number of chars actually in buffer
  14.     unsigned int n = 0;
  15.    
  16.     // character read or EOF
  17.     int c;
  18.    
  19.     // iteratively get chars from stdin
  20.     while ( ( c = fgetc(f) ) != EOF)
  21.     {
  22.         // grow buffer if necessary
  23.         if (n + 1 > capacity)
  24.         {
  25.             // determine new capacity: start @32 then 2x
  26.             if (capacity == 0)
  27.                 capacity = 32;
  28.             else if (capacity <= (UINT_MAX / 2))
  29.                 capacity *= 2;
  30.             else
  31.             {
  32.                 free(buffer);
  33.                 return NULL;
  34.             }
  35.            
  36.             // extend buffer's capacity
  37.             char *temp = realloc(buffer, capacity * sizeof(char));
  38.             if (temp == NULL)
  39.             {
  40.                 free(buffer);
  41.                 return NULL;
  42.             }
  43.             buffer = temp;
  44.         }
  45.        
  46.         // append current char to buffer
  47.         buffer[n++] = c;
  48.     }
  49.    
  50.     // return NULL if no chars received
  51.     if (n == 0 && c == EOF)
  52.       return NULL;
  53.        
  54.     // minimize buffer
  55.     char *minimal = malloc((n + 1) * sizeof(char));
  56.     strncpy(minimal, buffer, n);
  57.     free(buffer);
  58.    
  59.     // terminate string
  60.     minimal[n] = '\0';
  61.    
  62.     // return string
  63.     return minimal;
  64. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement