length 我如何在C中獲得文件的大小?




linux stat size (7)

可能重複:
你如何確定C文件的大小?

我怎樣才能找出文件的大小? 我用C編寫的應用程序打開。我想知道大小,因為我想將加載的文件的內容放入一個字符串中,我使用malloc()分配該字符串。 只需編寫malloc(10000*sizeof(char)); 恕我直言,一個壞主意。


#include <stdio.h>

int main(void)
{

   FILE *fp;
   char filename[80];
   long length;

   printf("input file name:");
   gets(filename);
   fp=fopen(filename,"rb");

   if(fp==NULL) {
      printf("file not found!\n");
   }
   else {
      fseek(fp,OL,SEEK_END);
      length=ftell(fp);
      printf("the file's length is %1dB\n",length);
      fclose(fp);
   }

   return 0;
}

使用標準庫:

假設您的實施有效地支持SEEK_END:

fseek(f, 0, SEEK_END); // seek to end of file
size = ftell(f); // get current file pointer
fseek(f, 0, SEEK_SET); // seek back to beginning of file
// proceed with allocating memory and reading the file

Linux的/ POSIX:

你可以使用stat (如果你知道文件名)或fstat (如果你有文件描述符)。

這是stat的一個例子:

#include <sys/stat.h>
struct stat st;
stat(filename, &st);
size = st.st_size;

Win32的:

您可以使用GetFileSizeGetFileSizeEx


如果你在Linux上,認真考慮使用glib中的g_file_get_contents函數。 它處理加載文件,分配內存和處理錯誤的所有代碼。


我最終做出了一個簡短而甜蜜的fsize函數(注意,沒有錯誤檢查)

int fsize(FILE *fp){
    int prev=ftell(fp);
    fseek(fp, 0L, SEEK_END);
    int sz=ftell(fp);
    fseek(fp,prev,SEEK_SET); //go back to where we were
    return sz;
}

標準C庫沒有這樣的功能是很愚蠢的,但我可以明白為什麼它很難,因為不是每個“文件”都有一個大小(例如/dev/null


#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


您是否考慮過不計算文件大小,並在必要時增加數組? 這裡有一個例子(省略了錯誤檢查):

#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;
}

即使對於不可能獲得文件大小的流(如stdin),這也具有工作的優勢。


如果你有文件描述符fstat()返回一個包含文件大小的統計結構。

#include <sys/types.h>
#include <sys/stat.h>
#include <unistd.h>

// fd = fileno(f); //if you have a stream (e.g. from fopen), not a file descriptor.
struct stat buf;
fstat(fd, &buf);
int size = buf.st_size;






size