敖雨燕 发表于 2025-8-6 00:25:39

通过文件IO进行文件复制

利用标准 IO 函数接口实现文件拷贝,把本地磁盘的文件 A 中的数据完整的拷贝到另
一个文本 B 中,如果文本 B 不存在则创建,要求文本 A 的名称和文本 B 的名称通过命令行
传递,并进行验证是否正确。linux 上进行验证:

/****************************************************************************
*
* file name: 2025-07-28_filecopy.c
* author   : 15515376695@163.com
* date   : 2025-07-28
* function : 该程序实现把一个文件的数据拷贝到一个指定文件
* note   : None
* CopyRight (c)   202515515376695@163.com   Right Reseverd
*
****************************************************************************/
#include <stdio.h>
#include <strings.h>
#include <stdlib.h>
//用户缓冲区大小
#define BUFFERSIZE 512

int main(int argc, char const *argv[])
{
        int loop_cnt = 0;//记录循环次数
        int remainder = 0;//记录余数
        int src_size = 0;//记录源文件大小
        //判断
        if (3 != argc)//加上自身文件一共有三个文件
        {
                printf("arument is invaild\n" );
                exit(1);
        }
        //打开文件,并进行错误处理
        FILE * src_fp = fopen(argv,"rb");//argv表示传入的第一个文件
        if (NULL == src_fp)
        {
                printf("file %s is error\n",argv );
                exit(1);
        }
        FILE * tg_fp = fopen(argv,"wb");
        if (NULL == tg_fp)
        {
                printf("file %s is error\n",argv );//argv表示传入的第二个文件
                exit(1);
        }
        //建立缓冲区,用空间换时间
        char buffer = {0};
        //进行光标偏移,来获取源文件大小
        fseek(src_fp,0,SEEK_END);
        src_size = ftell(src_fp);
        fseek(src_fp,0,SEEK_SET);
        printf("file size is %d \n",src_size);
    //计算需要循环写入的次数
    loop_cnt = src_size/BUFFERSIZE;
    //计算余数
    remainder = src_size%BUFFERSIZE;
    //进行循环向目标文件写入
    while(loop_cnt--)
    {
            //从待拷贝文件中读取数据
            fread(buffer,BUFFERSIZE,1,src_fp);
            //向目标文件中写入数据
            fwrite(buffer,BUFFERSIZE,1,tg_fp);
    }
    if (remainder > 0)//将循环写入数据后剩余的数据继续进行写入
    {
            //提前清空数据缓存区
            bzero(buffer,BUFFERSIZE);
            //从待拷贝文件中读取数据
            fread(buffer,remainder,1,src_fp);
            //向目标文件中写入数据
            fwrite(buffer,remainder,1,tg_fp);
    }
    //输出目标文件的大小
    printf("%s is %ld \n",argv,ftell(tg_fp) );
    //分别关闭两个文件
    fclose(src_fp);
    fclose(tg_fp);
    return 0;
}
来源:程序园用户自行投稿发布,如果侵权,请联系站长删除
免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!
页: [1]
查看完整版本: 通过文件IO进行文件复制