复制文件是一种常见功能,需要创建一段代码来复制文件,以便用户输入要复制的文件和新创建的文件。可复制的文件包括文本文件和二进制文件,还可以复制1G的电影或复制1Byte的txt文档。
复制文件的主要想法是打开从原始文件继续将内容读取到缓冲区的缓冲区,每次读取完成后将缓冲区的内容写入新创建的文件,直到读取原始文件的内容为止。
以下是需要解决的两个主要问题。
1)打开多少个缓冲区是恰当的?缓冲区太小会增加读取和写入次数,过大不会显着提高效率。当前,大多数磁盘扇区与4K对齐,如果读写数据不是4K的整数倍,则跨扇区读取,从而效率降低,因此保持4K的缓冲区打开。
2)缓冲区中的数据没有结束标志,如果缓冲区不满意,如何确定记录的字节数?最好的方法是每次读取时返回读取的字节数。
Fread()的基本体如下:
Size _ t fread (void * ptr,size _ t size,size _ t count,file * FP);
返回小于Count的读取和写入成功的块数。Size参数等于1将返回读取的字节数。
注意:fopen()必须以二进制格式打开文件,不能以文本形式打开。否则,系统会稍微处理文件,如果文件是文本文件。像txt等。在txt等情况下,这可能没有问题。mp4,rmvb,其他格式的文件(如jpg)在复制后出错,无法读取。
代码实现:
1.#include
2.#include
3.
4.int copyfile (char * file read,char * file write);
5.
6.int main()' ~
7.char file read[100];//要复制的文件名
8.char file write[100];//复制的文件名
9.
10.//获取用户输入
11.printf(“要复制的文件:”);
12.scanf(“% s”,file read);
13.printf(“将文件复制到:”);
14.scanf(“% s”,fileWrite);
15.
16.//执行复制操作
17.if (copyfile(读取文件,写入文件)
18.printf('恭喜,文件复制成功!\ n ');
19.}else{}
20.无法复制文件“printf(”!\ n ');
21.执行以下操作
22.
23.return 0;
24.执行以下操作
25.
26./**
27.*文件复制函数
28.* @param fileRead要复制的文件
29.* @param fileWrite复制后文件的保存路径
30.* @ return int 1:复制成功。23360复制失败
31.**/
32.int copyfile (char * file read,char * file write) {
33.FILE * fpRead//指向要复制的文件
34.FILE * fpWrite//指向复制的文件
35.int buffelen=1024 * 4;//缓冲区长度
36 . char * buffer=(char *)malloc(buffelen);//打开缓存
Int read count//实际读取的字节数
38.
39.if ((FP read=fopen (file read,' Rb '))=null | |(FP write=fopen(file write,' WB '))
40.printf ('cannot open file,press any key to exit!\ n ');
41.getch();
exit(1);
43.}
44.
45.//继续从fileRead读取内容,将其放入缓冲区,然后将缓冲区的内容写入fileWrite
46.while ((readcount=fread (buffer,1,buffelen,FP read)) 0)、
47.fwrite (buffer,read count,1,FP write);
48.执行以下操作
49.
50.free(缓冲区);
51.f close(f pread);
52.f close(FP write);
53.
54.return 1;
55.}
运行结果:
要复制的文件:d://1.mp4
文件复制到:d://2.mp4
祝贺你。文件复制成功!
如果文件不存在,则显示提示并退出程序。
要复制的文件:d://123.mp4
将文件复制到:d://333.mp4
d ://c yuyan . txt : no such file or directory
第46行是文件复制的核心代码。每次通过Fread()函数从fileRead文件读取bufferLen字节时,都将缓冲区放入缓冲区,然后通过fwrite()函数将缓冲区的内容写入fileWrite文件。
通常每次读取buffelen字节。即readCount=bufferLen;如果文件大小不足buffelen字节,或者读取到文件结尾,则实际读取的字节将小于buffelen,即readCount