在Linux里面有一个标准io操作光标的函数off_t lseek(int fd, off_t offset, int whence);,直接用他把光标移到最末尾就行了,这个函数的返回值就是当前光标位置相对于最前面的偏移量。(单位是字节)当然你的加上相应的头文件。
int file_size(char* filename)
{
int fd = open(filename, O_RDONLY);//只读方式打开就够了
off_t num = lseek(fd, 0, SEEK_END);
close(fd);
return num;
}
当然你也可以使用系统io操作光标的函数int fseek(FILE *stream, long offset, int whence);,实现的思路也是一样的。
int file_size(char* filename)
{
FILE *fp=fopen(filename,"r");
if(!fp) return -1;
fseek(fp,0L,SEEK_END);
int size=ftell(fp);
fclose(fp);
return size;
}
关于lseek与fseek的区别可以参考:https://blog.csdn.net/jaken99/article/details/77686427
这个两个方法效率都不是最高的,都要打开文件读取数据,而且fseek还要将数据读取到内存上来再操作,当数据很大的时候效率就会很低。而且超过2Gfseek还会报错。
在Linux下,还有一种更简单的方式,通过读取文件信息获得文件大小,这个时候就快的多。
int file_size2(char* filename)
{
struct stat sta;
stat(filename,&sta);
int size=sta.st_size;
return size;
}
文件会有一个文件属性,里面维护这么一个结构体。
SYNOPSIS:
#include
#include
#include
struct stat {
dev_t st_dev; /*容纳该文件的那个设备的设备号 */
ino_t st_ino; /*inode节点 */
mode_t st_mode; /* 文件的权限位 */
nlink_t st_nlink; /* Number of hard links */
uid_t st_uid; /* User ID of owner */
gid_t st_gid; /* Group ID of owner */
dev_t st_rdev; /* Device ID (if special file) */
off_t st_size; /*这个文件的大小,单位字节*/
blksize_t st_blksize; /* Block size for filesystem I/O */
blkcnt_t st_blocks; /* Number of 512B blocks allocated */
/* Since Linux 2.6, the kernel supports nanosecond
precision for the following timestamp fields.
For the details before Linux 2.6, see NOTES. */
struct timespec st_atim; /* Time of last access */
struct timespec st_mtim; /* Time of last modification */
struct timespec st_ctim; /* Time of last status change */
#define st_atime st_atim.tv_sec /* Backward compatibility */
#define st_mtime st_mtim.tv_sec
#define st_ctime st_ctim.tv_sec
};