C语言识别文件大小

 

     因为无聊,所以。。。

     文件大小识别
     第一反应当然是使用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 , &currentPos);//把给出的流的位置指针移到由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的文件

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值