💎一站式轻松地调用各大LLM模型接口,支持GPT4、智谱、星火、月之暗面及文生图 广告
ftell() 函数用来获取文件内部指针(位置指针)距离文件开头的字节数,它的原型为: ~~~ long int ftell ( FILE * fp ); ~~~ 注意:fp 要以二进制方式打开,如果以文本方式打开,函数的返回值可能没有意义。 先使用 fseek() 将文件内部指针定位到文件末尾,再使用 ftell() 返回内部指针距离文件开头的字节数,这个返回值就等于文件的大小。请看下面的代码: ~~~ long fsize(FILE *fp){ fseek(fp, 0, SEEK_END); return ftell(fp); } ~~~ 这段代码并不健壮,它移动了文件内部指针,可能会导致接下来的文件操作错误。例如: ~~~ long size = fsize(fp); fread(buffer, 1, 1, fp); ~~~ fread() 函数将永远读取不到内容。 所以,获取到文件大小后还需要恢复文件内部指针,请看下面的代码: ~~~ long fsize(FILE *fp){ long n; fpos_t fpos; //当前位置 fgetpos(fp, &fpos); //获取当前位置 fseek(fp, 0, SEEK_END); n = ftell(fp); fsetpos(fp,&fpos); //恢复之前的位置 return n; } ~~~ fpos\_t 是在 stdio.h 中定义的结构体,用来保存文件的内部指针。fgetpos() 用来获取文件内部指针,fsetpos() 用来设置文件内部指针。 完整的示例: ~~~ #include<stdio.h> #include<stdlib.h> #include<conio.h> long fsize(FILE *fp); int main(){ long size = 0; FILE *fp = NULL; char filename[30] = "D:\\1.mp4"; if( (fp = fopen(filename, "rb")) == NULL ){ //以二进制方式打开文件 printf("Failed to open %s...", filename); getch(); exit(EXIT_SUCCESS); } printf("%ld\n", fsize(fp)); return 0; } long fsize(FILE *fp){ long n; fpos_t fpos; //当前位置 fgetpos(fp, &fpos); //获取当前位置 fseek(fp, 0, SEEK_END); n = ftell(fp); fsetpos(fp,&fpos); //恢复之前的位置 return n; } ~~~