可能重複:
如何肯定C中文件的大小? html
如何找出用C語言編寫的應用程序打開的文件大小? 我想知道大小,由於我想將加載文件的內容放入一個字符串,我使用malloc()
分配。 只寫malloc(10000*sizeof(char));
恕我直言是一個壞主意。 數組
您是否考慮過不計算文件大小而只是在必要時增長數組? 這是一個例子(省略錯誤檢查): 函數
#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)也能工做。 spa
如何使用lseek / fseek / stat / fstat獲取文件大小? code
#include <fcntl.h> #include <unistd.h> #include <stdio.h> #include <stdlib.h> #include <sys/stat.h> void fseek_filesize(const char *filename) { FILE *fp = NULL; long off; fp = fopen(filename, "r"); if (fp == NULL) { printf("failed to fopen %s\n", filename); exit(EXIT_FAILURE); } if (fseek(fp, 0, SEEK_END) == -1) { printf("failed to fseek %s\n", filename); exit(EXIT_FAILURE); } off = ftell(fp); if (off == (long)-1) { printf("failed to ftell %s\n", filename); exit(EXIT_FAILURE); } printf("[*] fseek_filesize - file: %s, size: %ld\n", filename, off); if (fclose(fp) != 0) { printf("failed to fclose %s\n", filename); exit(EXIT_FAILURE); } } void fstat_filesize(const char *filename) { int fd; struct stat statbuf; fd = open(filename, O_RDONLY, S_IRUSR | S_IRGRP); if (fd == -1) { printf("failed to open %s\n", filename); exit(EXIT_FAILURE); } if (fstat(fd, &statbuf) == -1) { printf("failed to fstat %s\n", filename); exit(EXIT_FAILURE); } printf("[*] fstat_filesize - file: %s, size: %lld\n", filename, statbuf.st_size); if (close(fd) == -1) { printf("failed to fclose %s\n", filename); exit(EXIT_FAILURE); } } void stat_filesize(const char *filename) { struct stat statbuf; if (stat(filename, &statbuf) == -1) { printf("failed to stat %s\n", filename); exit(EXIT_FAILURE); } printf("[*] stat_filesize - file: %s, size: %lld\n", filename, statbuf.st_size); } void seek_filesize(const char *filename) { int fd; off_t off; if (filename == NULL) { printf("invalid filename\n"); exit(EXIT_FAILURE); } fd = open(filename, O_RDONLY, S_IRUSR | S_IRGRP); if (fd == -1) { printf("failed to open %s\n", filename); exit(EXIT_FAILURE); } off = lseek(fd, 0, SEEK_END); if (off == (off_t)-1) { printf("failed to lseek %s\n", filename); exit(EXIT_FAILURE); } printf("[*] seek_filesize - file: %s, size: %lld\n", filename, off); if (close(fd) == -1) { printf("failed to close %s\n", filename); exit(EXIT_FAILURE); } } int main(int argc, const char *argv[]) { int i; if (argc < 2) { printf("%s <file1> <file2>...\n", argv[0]); exit(0); } for(i = 1; i < argc; i++) { seek_filesize(argv[i]); stat_filesize(argv[i]); fstat_filesize(argv[i]); fseek_filesize(argv[i]); } return 0; }
您須要尋找文件的末尾而後詢問位置: htm
fseek(fp, 0L, SEEK_END); sz = ftell(fp);
而後你能夠回頭,例如: 內存
fseek(fp, 0L, SEEK_SET);
或者(若是想要開始) 字符串
rewind(fp);
假設您的實現有意義地支持SEEK_END: get
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
您能夠使用stat
(若是知道文件名)或fstat
(若是您有文件描述符)。 it
如下是stat的示例:
#include <sys/stat.h> struct stat st; stat(filename, &st); size = st.st_size;
您能夠使用GetFileSize或GetFileSizeEx 。
若是您使用的是Linux,請認真考慮使用glib中的g_file_get_contents函數。 它處理加載文件,分配內存和處理錯誤的全部代碼。