linux下的文件操作之文件复制

知识点提炼:

  1. open(const char *pathname,int flags)函数的使用,
    第一个参数为文件所在路径以及文件名,
    第二个参数为的打开文件的方式,有三种O_RDONLY.(只读),O_WRONLY(只写),O_RDWR(读写),以“|”连接添加新功能,常用功能 有O_APPEND(以追加的方式打开文件),O_CREAT(若无该文件,就创建文件)
  2. main()函数参数的使用  main(int argc,char **argv)  
    argc代表参数的个数,
    argv为二级字符串指针,即为多个字符串数组,a也就是说,argv[0]代表其第一个参数,argv[1]代表其第二个参数,arg[2]代表其第三个参数,以此类推
  3. lseek()函数的使用,
    第一个参数为文件描述符,
    第二个参数为偏移量,
    第三个参数(SEEK_CUR,SEEK_SET,SEEK_END),返回值为当前位置到开头的字节数

    以下为实现文件复制的代码:
  4. #include <stdio.h>
    #include <string.h>
    #include <stdlib.h>
    #include <sys/types.h>
    #include <sys/stat.h>
    #include <unistd.h>
    #include <fcntl.h>
    #define BUFFER_SIZE 15
    //文件复制
    int main(int argc,char **argv)
    {
            int from_fd ,to_fd;
            int file_len=0;//记录文件的长度
            int ret=1;//记录读文件的字节数
            char buffer[BUFFER_SIZE];
            if(argc !=3)//参数个数
            {
                    printf("argc not enough\n");
                    exit(0);
            }
    
            if((from_fd=open(argv[1],O_RDONLY|O_CREAT))==-1)
            {
                    printf("open %s failed\n",argv[1]);
                    exit(0);
            }
            if((to_fd=open(argv[2],O_WRONLY|O_CREAT))==0)
            {
                    printf("open %s failed\n",argv[2]);
                    exit(0);
            }
            //lseek的使用
            file_len=lseek(from_fd,0,SEEK_END);//读出文件行数
            lseek(from_fd,0,SEEK_SET);//将文件指针放回文件起始位置
            printf("this file has %d bytes\n",file_len);
            //进行文件的复制
            while(ret)
            {
                    ret=read(from_fd,buffer,BUFFER_SIZE);//读文件中的内容
                    if(ret==-1)
                    {
                            printf("read error");
                            exit(1);
                    }
                    write(to_fd,buffer,ret);//将读到的数据写到文件里
                    file_len-=ret;
                    bzero(buffer,BUFFER_SIZE);//清空缓冲区
            }
            close(from_fd);
            close(to_fd);
            exit(0);
    
    
    }
    

    编译以及测试代码
     

    //编译文件
    gcc  copy_file.c -o copy
    //执行文件
    sudo ./copy from.c to.c
    //测试文件
    //若文件内容相同则无输出
    sudo diff from.c  to.c

    注意:应保证from.c里有内容

  • 1
    点赞
  • 17
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

qq_33974167

有价值,请赏瓶水喝

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值