注意fread和fwrite的参数顺序

首先这个问题捆扰了我好长一段时间,但每次都很模糊的看下参数的区别,今天终于弄懂了这个区别

 

C标准库提供的文件函数fread和fwrite的原型为:

       #include <stdio.h>

       size_t fread(void *ptr, size_t size, size_t nmemb, FILE *stream);

       size_t   fwrite(const void *ptr, size_t size, size_t nmemb, FILE *stream);

第一次用的时候觉得接口不够简洁:size*count来表示一共有多少字节就行了,不必分开成两个参数。
   由于头脑中有这种先入为主的思想,所以每次使用这两个函数的时候,size和count的顺序都是随意的,反正乘起来是那么多个字节就行。
    其实不是这样的!这两个函数的size的大小是有限制的,fread中,如果size过大,读出数据会失败;fwrite中,size过大,会导致返回的写入字节数不正确,但是数据还是写成功了。size的最大限制是多少目前还没有测试,所以大家使用的时候注意不要把size这个值设置得过大。

******************************************************************************************************************************

代码如下:

#include <stdio.h>

int copy_file(const char * src_name,const char * dst_name)
{
   FILE * src = NULL,* dst = NULL;
   char buffer[1024];
   int len,cnt = 0;
  
   if((src = fopen(src_name,"rb")) == NULL)
     {
        fprintf(stderr,"open source file %s failure\n",src_name);
        return -1;
     }
    
      if((dst = fopen(dst_name,"wb+")) == NULL)
     {
        fclose(src);
        fprintf(stderr,"create destion file %s failure\n",dst_name);
        return -2;
     }
    
#if 1    
     while((len = fread(buffer,1,sizeof(buffer),src))>0)
       {
           cnt+= len;
           fwrite(buffer,1,len,dst);
       }
#endif

#if 0
//注意这样写是错误写法,这样造成最一段数据尺寸有错
      while((len = fread(buffer,sizeof(buffer),1,src))>0)------>就是因为给的buffer太大了,你可以定义buffer小点就这个段程序就可以用了,我定义 成10
       {
           cnt+= len;
           fwrite(buffer,sizeof(buffer),len,dst);
       }      
#endif      
      fclose(dst);
      fclose(src);
     
       printf("copy file %s to %s success,bytes is %d\n",src_name,dst_name,cnt);
      
      return 0;
    
}


int main()
{
  copy_file("1.pdf","11.pdf");
}

 

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值