我怎样才能获得在C文件的大小?

可能重复:
你如何确定在C文件的大小?

我怎样才能找出文件的大小? 我用C编写的应用程序打开。我想知道大小,因为我想把加载的文件的内容放入一个string,我使用malloc()分配。 只要写malloc(10000*sizeof(char)); 恕我直言,一个坏主意。

你需要寻find文件的结尾,然后要求的位置:

 fseek(fp, 0L, SEEK_END); sz = ftell(fp); 

然后,你可以回头,例如:

 fseek(fp, 0L, SEEK_SET); 

或(如果想要开始)

 rewind(fp); 

使用标准库:

假设您的实施有效地支持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的:

您可以使用GetFileSize或GetFileSizeEx 。

如果你有文件描述符fstat()返回一个包含文件大小的stat结构。

 #include <sys/types.h> #include <sys/stat.h> #include <unistd.h> // fd = fileno(f); //if you have a stream (eg from fopen), not a file descriptor. struct stat buf; fstat(fd, &buf); int size = buf.st_size; 

你有没有考虑过不计算文件大小,只是在必要时增加数组? 这里是一个例子(错误检查ommitted):

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

即使对于不可能获得文件大小的stream(比如stdin),这也具有工作的优势。

如果你在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库没有这样的function是很愚蠢的,但是我可以明白为什么它不是每个“文件”都有大小(比如/dev/null

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