针对文件描述符和合针对流的两种函数对文件的复制

1.针对文件描述符的函数文件复制:

#include <stdio.h>
#include <stdlib.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <unistd.h>
#include <fcntl.h>
/*使用几个文件操作函数所需要的头文件*/

#define MAXSIZE 1024

int main(int argc,char *argv[])
{
    int from_fd;
    int to_fd;
/*定义打开文件返回的文件描述符*/

    int bytes_read;
    int bytes_write;
/*定义读取和写入的字符数*/

    char buf[MAXSIZE];

    char *str;

    if(argc != 3)
    {
        exit(1);
    }

    from_fd = open(argv[1],O_RDONLY);           /*打开原文件,如果打开失败就退出*/
    printf("from_fd = %d\n",from_fd);
    if(from_fd == -1)
    {
        exit(1);
    }

    to_fd = open(argv[2],O_WRONLY|O_CREAT,0755);          /*打开目标文件,如果不存在就创建,失败就退出*/
    printf("to_fd = %d\n",to_fd);
    if(to_fd == -1)
    {
        exit(1);
    }

    while((bytes_read = read(from_fd,buf,MAXSIZE)))            /*循环的从原文件中读取MAXSIZE个字符,直到文件尾或                                                                                                  无字符可读*/
    {
        if(bytes_read > 0)
{
   str = buf;
   while((bytes_write = write(to_fd,str,bytes_read)))       /*循环的将读取的字符写入到目标文件中,直到将读取到                                                                                                    的全部字符都写入*/
   {
       if(bytes_write == -1)                                                      /*如果写入失败,退出循环,从新写入*/
{
   break;
}
else if(bytes_write == bytes_read)                             /*如果将读取的字符全部写入,退出循环*/
{
   break;
}
else if(bytes_write > 0)                                 /*如果读取的字符只写了一部分,继续写入,直到写 完为止*/
{
   str = str + bytes_write;
   bytes_read = bytes_read - bytes_write;
}
   }
}
    }

  /*关闭两个文件*/
    close(from_fd);               
    close(to_fd);
    return 0;
}

2.针对流的函数文件复制:

#include <stdio.h>
#include <stdlib.h>
#include <string.h>


/*使用几个文件操作函数所需要的头文件*/


#define MAXSIZE 1024

int main()
{

/*定义两个文件流,一个为原文件流,一个为目标文件流*/
    FILE *fp1;
    FILE *fp2;

    int num;
    int num2;
    int ff;

    char str[MAXSIZE] = {0};
    
    fp1 = fopen("copy_file.c","r+");                      /*打开原文件,失败退出程序*/
    if(NULL == fp1) 
    {
        printf("fopen1 error!\n");
exit(1);
    }

    fp2 = fopen("to_copy.c","w+");                   /*打开目标文件,失败退出程序*/
    if(NULL == fp2)
    {
        printf("fopen2 error!\n");
exit(1);
    }

    while((ff = feof(fp1)) == 0)                               /*循环判断原文件文件是否到达文件尾,到达文件尾循环退出*/
    {
        num =  fread(str,100,1,fp1);                       /*读取原文件的一个字符块,失败结束循环,从新读取*/
        if(num < 0)
        {
   printf("fread error!\n");
   break;
}

num2 = fwrite(str,100,1,fp2);                  /*将读取的原文件的字符块写入目标文件,失败结束循环,从新写入*/
if(num2 < 0)
{
   printf("fwrite error!\n");
   break;
}
memset(str,0,100);                                /*将读取字符块存放的地方清空*/
        
    }

/*关闭两个文件*/
    fclose(fp1);
    fclose(fp2);
    return 0;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值