文件的copy(一次性完成数据的传递 )

来源:互联网 发布:2017淘宝爆款打造方法 编辑:程序博客网 时间:2024/06/14 06:07

学习文件位置定位函数接口,完成对文件内容的任意位置的访问



#include <stdio.h>

#include <stdlib.h>
#include <string.h>
int main(int agrc,char **argv)
{
        //新的需求:


        //一次性完成数据的传递
        //一次性读取源文件
        //一次性写入到源文件


        int ret=-1;


        //总体的需求:拷贝 源文件(source.c)到目标文件(dst.c


        //第一步:打开source.c文件


        FILE *fp_s=NULL;//源文件流
        fp_s=fopen("source.c","r");//只读该文件 r
        if(NULL==fp_s)
        {
        perror("fopen source.c");
        return -1;
        }




        //第二步:打开目的文件
        FILE *fp_d=NULL;//目标文件流
        fp_d=fopen("dst.c","w");
        if(fp_d==NULL)
        {
        perror("fopen dst.c");
        return -1;
        }


        //第三步:准备内存


        char *buff=NULL;
        //计算出源文件的大小
        //将光标设置到数据的尾部,计算到光标到文件首部的字节数、
        //计算出文件的大小


        ret=fseek(fp_s,0,SEEK_END);
        if(-1==ret)
        {
         perror("fseek");
         return -1;
        }
        long file_size;
        file_size=ftell(fp_s);
        //在获取文件的大小后,别忘了,将光标移动到文件的首部。
        //文件位置---文件头
        ret=fseek(fp_s,0,SEEK_SET);
        if(-1==ret)
        {
         perror("fseek");
         return -1;
        }
        //在这里我们分配的内存就是ret,而不是20个


        buff=malloc(file_size);//堆
        if(NULL==buff)
        {
         perror("malloc buff");
         return -1;
        }
         memset(buff,'\0',file_size);//内存每一次完成后清零
        //第四步:读、写


        //文件,内存地址,读多少内容
        //给读函数提供的信息:读的文件的名称,读到那去,读多少,从哪里开始读。
        //从源文件的默认光标(文件位置处)
        //存放到用户内存里面


        ret= fread(buff,1,file_size,fp_s);
        //ret的值有三种情况:ret>20,ret<20,ret=0


        if(20>ret)
        {
           //读到source.c文件的尾部
          if(feof(fp_s))
          {
            ret=fwrite(buff,1,ret,fp_d);
            if(0==ret)
            {
            perror("fwrite");
            return -1;
            }


          }
          else
          {
         perror("fseek");
         return -1;
        }
        long file_size;
        file_size=ftell(fp_s);
        //在获取文件的大小后,别忘了,将光标移动到文件的首部。
        //文件位置---文件头
        ret=fseek(fp_s,0,SEEK_SET);
        if(-1==ret)
        {
         perror("fseek");
         return -1;
        }
        //在这里我们分配的内存就是ret,而不是20个


        buff=malloc(file_size);//堆
        if(NULL==buff)
        {
         perror("malloc buff");
         return -1;
        }
         memset(buff,'\0',file_size);//内存每一次完成后清零
        //第四步:读、写


        //文件,内存地址,读多少内容
        //给读函数提供的信息:读的文件的名称,读到那去,读多少,从哪里开始读。
        //从源文件的默认光标(文件位置处)
        //存放到用户内存里面


        ret= fread(buff,1,file_size,fp_s);
        //ret的值有三种情况:ret>20,ret<20,ret=0


        if(20>ret)
        {
           //读到source.c文件的尾部
          if(feof(fp_s))
          {
            ret=fwrite(buff,1,ret,fp_d);
            if(0==ret)
            {
            perror("fwrite");
            return -1;
            }


          }
          else
          {
           //出错
           perror("fread");
           return -1;
          }
        }


        //写
        ret=fwrite(buff,1,ret,fp_d);
        if(0==ret)
        {
        perror("fwrite");
        return -1;
        }




        free(buff);
        buff=NULL;
        fclose(fp_d);
        fp_d=NULL;
        fclose(fp_s);
        fp_s=NULL;
    return 1;

}



哪个错误:没有循环的结构中使用了break

0 0
原创粉丝点击