因为无聊,所以。。。
文件大小识别
第一反应当然是使用file系列函数。
代码如下:
#include <stdio.h> int main() { FILE *fp; fpos_t pos; //stream 指针位置 fp = fopen("./test2.txt","rb"); fseek(fp, 0, SEEK_END); //fseek是使fp从偏移0的位置开始,读到文件的结尾位置 fgetpos(fp, &pos);//fgetos是把fp的当前位置赋给位置变量pos rewind(fp);//把文件指针移到由stream指定的开始处, 同时清除和流相关的错误和EOF标记. printf("fileSize = %lld\r\n",pos);//这样pos的位置其实就是这个文件的大小了,当然了,单位为字节 printf("orig pos = %d\r\n",fp);//fp的原始位置 return 0; }
这样是可以处理绝大多数文件的
要注意的是,stdio.h定义的fpos_t 是 int64的,也就是说如果文件大小超过2的32次方(就是4G),fseek就无法处理
了,结果会为0。
所以要处理大于4G的文件,就要使用_fseeki64()。
关于最后的fp清零,有多种做法(不知道微软定义这么多种清零方式有何意义。。。)
1. rewind(fp);
2. fpos_t currentPos = ftell(fp);//取得当前文件指针位置,可能已经移动了文件指针
fsetpos(fp , ¤tPos);//把给出的流的位置指针移到由position对象指定的位置
3. fpos_t currentPos = ftell(fp);
fseek(File,currentPos,SEEK_SET);//恢复到原来的文件指针位置(SEEK_SET从文件开始位置搜索)
附另外一种在网上看到的办法:
#include <stdio.h> #include <sys/stat.h> int main() { struct stat f_stat; if( stat("test2.txt", &f_stat ) == -1 ) { return -1; } printf("size = %u\r\n",(long long int)f_stat.st_size); }
这种办法使用简单,但是不支持大于4G的文件