466 Stimmen

Wie kann ich die Größe einer Datei in C ermitteln?

Wie kann ich die Größe einer Datei herausfinden, die ich mit einer in C geschriebenen Anwendung geöffnet habe? Ich möchte die Größe wissen, weil ich den Inhalt der geladenen Datei in einen String schreiben möchte, den ich mit malloc() . Einfach schreiben malloc(10000*sizeof(char)); ist IMHO eine schlechte Idee.

9voto

Pat Morin Punkte 99

Haben Sie in Erwägung gezogen, die Dateigröße nicht zu berechnen und das Array bei Bedarf einfach zu vergrößern? Hier ist ein Beispiel (ohne Fehlerprüfung):

#define CHUNK 1024

/* Read the contents of a file into a buffer.  Return the size of the file 
 * and set buf to point to a buffer allocated with malloc that contains  
 * the file contents.
 */
int read_file(FILE *fp, char **buf) 
{
  int n, np;
  char *b, *b2;

  n = CHUNK;
  np = n;
  b = malloc(sizeof(char)*n);
  while ((r = fread(b, sizeof(char), CHUNK, fp)) > 0) {
    n += r;
    if (np - n < CHUNK) { 
      np *= 2;                      // buffer is too small, the next read could overflow!
      b2 = malloc(np*sizeof(char));
      memcpy(b2, b, n * sizeof(char));
      free(b);
      b = b2;
    }
  }
  *buf = b;
  return n;
}

Dies hat den Vorteil, dass es auch bei Streams funktioniert, bei denen es unmöglich ist, die Dateigröße zu ermitteln (wie bei stdin).

8voto

Ben Combee Punkte 16303

Wenn Sie unter Linux arbeiten, sollten Sie ernsthaft in Erwägung ziehen, nur das Programm g_file_get_contents Funktion von glib. Sie übernimmt den gesamten Code für das Laden einer Datei, die Zuweisung von Speicher und die Fehlerbehandlung.

-42voto

plan9assembler Punkte 2876
#include <stdio.h>

#define MAXNUMBER 1024

int main()
{
    int i;
    char a[MAXNUMBER];

    FILE *fp = popen("du -b  /bin/bash", "r");

    while((a[i++] = getc(fp))!= 9)
        ;

    a[i] ='\0';

    printf(" a is %s\n", a);

    pclose(fp);
    return 0;
}  

HTH

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X