因为无聊,所以。。。
文件大小识别
第一反应当然是使用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的文件