fseek ftell rewind stat 等函数,实现获取文件大小

fseek ftell rewind stat 等函数,实现获取文件大小

fseek()函数:int fseek(FILE *stream, long int offset, int whence)

描述
C 库函数 int fseek(FILE *stream, long int offset, int whence) 设置流 stream 的文件位置为给定的偏移 offset,参数 offset 意味着从给定的 whence 位置查找的字节数。
参数
stream – 这是指向 FILE 对象的指针,该 FILE 对象标识了流。
offset – 这是相对 whence 的偏移量,以字节为单位。
whence – 这是表示开始添加偏移 offset 的位置。它一般指定为下列常量之一:
SEEK_SET 文件的开头
SEEK_CUR 文件指针的当前位置
SEEK_END 文件的末尾
返回值
如果成功,则该函数返回零,否则返回非零值。

ftell()函数:long int ftell(FILE *stream)

描述
C 库函数 long int ftell(FILE *stream) 返回给定流 stream 的当前文件位置
参数
stream – 这是指向 FILE 对象的指针,该 FILE 对象标识了流
返回值
该函数返回位置标识符的当前值。如果发生错误,则返回 -1L,全局变量 errno 被设置为一个正值。

rewind()函数:void rewind(FILE *stream)

描述
C 库函数 void rewind(FILE *stream) 设置文件位置为给定流 stream 的文件的开头
参数
stream – 这是指向 FILE 对象的指针,该 FILE 对象标识了流。
返回值
该函数不返回任何值。

stat()函数:int stat(const char *path, struct stat *buf)

​ 头文件
#include
#include
#include
描述
获取文件信息
参数
path:文件路径(名)
buf:struct stat 类型的结构体指针
​ 返回值
成功返回0,失败返回-1;

struct stat 结构体详解

struct stat
{
    dev_t     st_dev;     /* ID of device containing file */文件使用的设备号
    ino_t     st_ino;     /* inode number */    索引节点号 
    mode_t    st_mode;    /* protection */  文件对应的模式,文件,目录等
    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;    /* total size, in bytes */ 以字节为单位的文件容量   
    blksize_t st_blksize; /* blocksize for file system I/O */ 包含该文件的磁盘块的大小   
    blkcnt_t  st_blocks;  /* number of 512B blocks allocated */ 该文件所占的磁盘块  
    time_t    st_atime;   /* time of last access */ 最后一次访问该文件的时间   
    time_t    st_mtime;   /* time of last modification */ /最后一次修改该文件的时间   
    time_t    st_ctime;   /* time of last status change */ 最后一次改变该文件状态的时间   
};
代码示例:
#include 
#include 
#include 
#include 
#include 
#include 

/*确保此文件存在*/
#define TEST_FILE "/home/xxx/mysrc/test/test.file"

/* 获取文件大小的方法:
 * 方法1:fseek设置文件指针位置+ftell获取文件指针位置离文件头部的长度(rewind:将文件指针重置到文件头)
 * 方法2:使用stat函数,获取文件信息,然后获取文件信息中的长度(stat不适用与符号链接文件;会反馈链接对应的引用件信息) */


int main(){

    /*fseek+ftell*/
    FILE *fp = NULL;
    int iRet = 0;
    int fLen = 0;

    struct stat fStat;
    long int fSize = 0;
 
    fp = fopen( TEST_FILE, "r" );
    if( NULL == fp ){
        printf( "fopen() error.\n" ); 
        return 0;
    } 
    printf( "fopen() success.\n" ); 

    iRet = fseek( fp, 0, SEEK_END );
    if( -1 == iRet ){
        fclose( fp );
        printf( "fseek() error.\n" ); 
        return 0; 
    } 
    printf( "fseek() success.\n" ); 

    fLen = ftell( fp ); 
    if( -1 == fLen ){
        fclose( fp );
        printf( "ftell() error.\n" ); 
        return 0; 
    }
    printf( "ftell() success.\n" ); 
    printf( "file=%s;len=%d\n", TEST_FILE, fLen );

    /*重置文件指针到文件头*/
    rewind( fp ); 
    fclose( fp );

    /*方法2*/
    printf( "==================================================\n" );

    memset( &fStat, 0x00, sizeof( fStat ) ); 
    iRet = stat( TEST_FILE, &fStat);
    if( -1 == iRet ){
        printf( "stat() error.\n" );
        return 0;
    }
    printf( "stat() success.\n" );
    fLen = 0;
    fLen = fStat.st_size;
    printf( "fSize=%d.\n", fLen );
    

    return 1;
}
stat,fstat和lstat函数区别

函数原型

int stat(const char *path, struct stat *buf);
int fstat(int filedes, struct stat *buf);
int lstat(const char *path, struct stat *buf);

描述
这三个函数的功能是一致的,都用于获取文件相关信息,但应用于不同的文件对象。对于函数中给出pathname参数,stat函数返回与此命名文件有关的信息结构,fstat函数获取已在描述符fields上打开文件的有关信息,lstat函数类似于stat但是当命名的文件是一个符号链接时,lstat返回该符号链接的有关信息,而不是由该符号链接引用文件的信息。第二个参数buf是指针,它指向一个用于保存文件描述信息的结构,由函数填写结构内容。该结构的实际定义可能随实现有所不同.

参数
path:文件路径名。
filedes:文件描述符。
buf:struct stat 结构体的指针

返回值
成功执行时,返回0。失败返回-1,errno被设为以下的某个值
EBADF: 文件描述词无效
EFAULT: 地址空间不可访问
ELOOP: 遍历路径时遇到太多的符号连接
ENAMETOOLONG:文件路径名太长
ENOENT:路径名的部分组件不存在,或路径名是空字串
ENOMEM:内存不足
ENOTDIR:路径名的部分组件不是目录

你可能感兴趣的:(c语言,c++,开发语言,fseek)