一般在读取文件中的内容的时候,如果你不知道到底分配多大的空间,为何不先获取文件的大小,然后再……
这里贴出两种方法:
1.
unsigned long get_file_size(const char *path)
{
unsigned long filesize = -1;
FILE *fp;
fp = fopen(path, "r");
if(fp == NULL)
return filesize;
fseek(fp, 0L, SEEK_END);
filesize = ftell(fp);
fclose(fp);
return filesize;
}
2.
#include <sys/stat.h>
unsigned long get_file_size(const char *path)
{
unsigned long filesize = -1;
struct stat statbuff;
if(stat(path, &statbuff) < 0){
return filesize;
}else{
filesize = statbuff.st_size;
}
return filesize;
}
第一种:通过打开文件的方式seek得到文件大小,这种方式如果文件比较大,则效率可想而知。而且如果另外一个进程打开文件写的时候,冲突来了。
第二种:通过C语言的函数stat将文件先放到buffer中,然后获取buffer的大小,这种方式效率更高
例子:
struct stat buf;
stat (“/tmp/tmpfile”,&buf);
printf(“/tmp/tmpfile size = %d /n”,buf.st_size);
下面给出stat封装的结构
#ifdef __EXT_LF64SRC
struct stat64 {
ino64_t st_ino; /* File serial number. */
off64_t st_size;
_CSTD dev_t st_dev; /* ID of device containing file. */
_CSTD dev_t st_rdev; /* Device ID, for inode that is device */
uid_t st_uid;
gid_t st_gid;
_CSTD time_t st_mtime; /* Time of last data modification */
_CSTD time_t st_atime; /* Time last accessed */
_CSTD time_t st_ctime; /* Time of last status change */
_CSTD mode_t st_mode; /* see below */
nlink_t st_nlink;
blksize_t st_blocksize; /* Size of a block used by st_nblocks */
_Int32t st_nblocks; /* Number of blocks st_blocksize blocks */
blksize_t st_blksize; /* Prefered I/O block size for object */
blkcnt64_t st_blocks; /* Number of 512 byte blocks */
};
#endif