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

/********************************************************************************************************
*
*
* 用标准IO函数接口实现文件拷贝,把本地磁盘的文件A中的数据完整的拷贝到另一个文本B中,如果文本B不存在则创建,要求
* 文本A的名称和文本B的名称通过命令行传递,并进行验证是否正确。
*
* 
*
* Copyright (c)  2023-2024   18975491291@163.com   All right Reserved
* ******************************************************************************************************/

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


//用户缓冲区的大小
#define  BUFFERSIZE	 512   

int main(int argc, char const *argv[])
{
	int src_size = 0; //记录待拷贝文件的大小
	int loop_cnt = 0; //循环次数
	int remainder= 0; //记录剩余字节数量

	//1.由于待拷贝文件的路径需要通过命令行传递,则需要分析命令行参数数量是否符合需求
	if (3 != argc)
	{
		printf("argument is invaild\n");
		exit(1);
	}

	//2.则分别打开待拷贝文件(rb)和目标文件(wb)
	FILE *src_fp = fopen(argv[1],"rb");	
	if (NULL == src_fp)
	{
		printf("fopen %s is error\n", argv[1]);
		exit(1);
	}

	FILE *dest_fp = fopen(argv[2],"wb");	
	if (NULL == dest_fp)
	{
		printf("fopen %s is error\n", argv[2]);
		exit(1);
	}

	//3.为了提高程序的运行效率,采用空间换时间的思想,定义数据缓冲区来存储文件数据
	char data_buffer[BUFFERSIZE] = {0};

	fseek(src_fp,0,SEEK_END); //偏移待拷贝文件的光标到文件末尾
	src_size = ftell(src_fp); //统计待拷贝文件的大小
	fseek(src_fp,0,SEEK_SET); //偏移待拷贝文件的光标到文件开头

	printf("src file size = %d\n",src_size);

	//4.计算需要读取数据块的次数,循环写入到目标文件中即可     
	loop_cnt = src_size / BUFFERSIZE;
	remainder= src_size % BUFFERSIZE;

	while(loop_cnt--)
	{
		//从待拷贝文件中读取数据
		fread(data_buffer,BUFFERSIZE,1,src_fp);
		//向目标文件中写入数据块
		fwrite(data_buffer,BUFFERSIZE,1,dest_fp);
	}

	//5.分析待拷贝文件是否存在剩余未拷贝的数据,如果存在,则再拷贝依次即可
	if (remainder > 0)
	{	
		//需要提前清空数据缓冲区
		bzero(data_buffer,BUFFERSIZE);

		//从待拷贝文件中读取数据
		fread(data_buffer,remainder,1,src_fp);

		//向目标文件中写入数据块
		fwrite(data_buffer,remainder,1,dest_fp);
	}

	//6.为了验证是否拷贝完成,则统计目标文件的数据量
	printf("dest file size = %ld\n",ftell(dest_fp));

	//7.完成拷贝动作,则需要分别关闭两个文件
	fclose(src_fp);
	fclose(dest_fp);

	return 0;
}
posted @ 2024-05-09 15:21  小懿同学  阅读(30)  评论(0)    收藏  举报