在前面章节中我们学习了如何打开关闭文件,如何读写文件,以二进制方式和字符方式来读写文件。今天我们将通过一个综合练习来完成一个文件复制的命令。
一、main函数的参数
想要实现一个复制命令,也就是我们通常所说的拷贝命令cp,这个cp命令通常有两个参数,一个是源文件目录,另一个是目标文件目录。例如:
cp /data/temp/a /data/mnt/b
这样就是将在目录/data/temp/目录下的文件a复制到/data/mnt/目录下的文件b。我们的目标就是要实现这样的一个cp命令。并编写一个叫作cp.c的源代码文件,我们知道,编写程序中要实现一个main函数,而这个main函数的参数表我们就在这里学习
int main(int argc, char *argv[])
这是main函数的定义,它具有两个参数,int argc表示调用程序主函数时传入的参数个数,而char *argv[]这个指针数组表示参数的内容。我们可以通过一个简单的例子来具体看看main函数的参数:
#include <stdio.h>
int main(int argc, char *argv[])
{
for (int i = 0; i < argc; i++)
{
printf("%s\n", argv[i]);
}
return 0;
}
对以上程序编译并执行下面命令
./cp aaa bbb ccc ddd
运行结果如下:
./cp
aaa
bbb
ccc
ddd
我们可以清楚的看到这个执行过程中main函数的参数argc中存放了接收到的参数个数即5,而argv中存放了所有的参数内容。
二、实现复制命令
结合main函数的参数表功能及上两节中我们学习到文件读写的相关知识,我们就可以自己实现一个文件复制的程序。程序的实现方式很简单:
1.通过main函数的参数接收需要复制的源文件目录和目标目录。
2.打开源文件和目标文件。
3.从源文件中读取内容,并将这些内容写入到源文件中
4.关闭目标文件。
接下来我们就来动手实现这个文件复制的程序:
#include <stdio.h>
#define SIZE 0x200
int main(int argc, char *argv[])
{
FILE *fp_src = fopen(argv[1], "r");
FILE *fp_tar = fopen(argv[2], "w+");
char buff[SIZE];
while (1)
{
int len = fread(buff, sizeof(char), SIZE, fp_src);
if (len > 0)
{
fwrite(buff, sizeof(char), len, fp_tar);
}
if (len < SIZE)
{
break;
}
}
fclose(fp_src);
fclose(fp_tar);
return 0;
}
程序运行测试:
./cp /data/temp/a /data/temp/b
请注意,在对main函数参数处理时还可以使用getopt系统接口函数来实现;另外,这个cp命令只能复制普通文件,而不能复制文件夹,想要复制文件夹可以使用opendir等系统调用来实现,准确的来说,这些内容是系统调用接口函数而不是标准c语言函数库,我们不再赘述,请有兴趣的读者自己查阅相关资料并实现文件夹的复制功能。
Copyright © 2015-2023 问渠网 辽ICP备15013245号