3.1 文件复制
【例3.1】编写文本文件复制程序,命令行格式为:mycopy filename1 filename2。
题目分析
每个C语言程序必须定义一个main函数作为程序的入口。程序启动从main函数开始执行,main函数返回时程序终止,若main函数末尾没有返回语句,则默认执行return 0语句。
标准C语言的main函数有两种形式:接受0个参数的int main(void),即int main();接受2个参数的int main(int argc, char *argv[])。对于后者,形参argc表示传递给程序的参数个数;形参argv是指针数组,其每个指针分别指向传递给程序的字符串参数,第一个字符串argv[0]是程序的名称。
文件的打开和关闭可调用fopen和fclose函数。文件的读取和写入可通过三种方式实现:1)fgetc和fputc函数配合,每次读写一个字符,见参考程序mycopyV1.c;2)fscanf和fprintf函数配合,每次读写一个字符,见参考程序mycopyV2.c;3)fread和fwrite函数配合,每次读写BUFSIZE个字符,见参考程序mycopyV3.c。方式3)通过增设缓冲区buffer[BUFSIZE],减少I/O操作的次数,提高程序运行速度,可用于读写量较大的程序。
检测到异常时,用exit标准库函数退出。void exit(int status) 函数可正常终止一个程序并执行清理操作,形参status值为0表示程序成功退出,非零值可表示各类异常终止。从main函数通过return语句返回一个整数值相当于用这个整数值调用exit函数。exit函数在头文件stdlib.h中声明。
参考程序
/*
* 文件名: mycopyV1.c
* 描述: 编写文件复制命令行程序,命令行格式为:mycopy filename1 filename2
* 作者: 刘博
*/
#include <stdio.h>
#include <stdlib.h>
int main(int argc, char *argv[])
{
FILE *fpSrc, *fpDes;
char ch;
/* 检查命令行参数个数 */
if (argc != 3) {
printf("Usage: mycopy SourceFile DestinationFile\n");
exit(1);
}
/* 打开文件 */
if ((fpSrc = fopen(argv[1], "r")) == NULL) {
printf("open file error!\n");
exit(1);
}
if ((fpDes = fopen(argv[2], "w")) == NULL) {
printf("creat file error!\n");
exit(1);
}
/* 复制文件 */
while ((ch = fgetc(fpSrc)) != EOF) {
fputc(ch, fpDes);
}
/* 关闭文件 */
fclose(fpSrc);
fclose(fpDes);
}
/*
* 文件名: mycopyV2.c
* 描述: 编写文件复制命令行程序,命令行格式为:mycopy filename1 filename2
* 作者: 刘博
*/
#include <stdio.h>
#include <stdlib.h>
int main(int argc, char *argv[])
{
FILE *fpSrc, *fpDes;
char ch;
/* 检查命令行参数个数 */
if (argc != 3) {
printf("Usage: mycopy SourceFile DestinationFile\n");
exit(1);
}
/* 打开文件 */
if ((fpSrc = fopen(argv[1], "r")) == NULL) {
printf("open file error!\n");
exit(1);
}
if ((fpDes = fopen(argv[2], "w")) == NULL) {
printf("creat file error!\n");
exit(1);
}
/* 复制文件 */
while (fscanf(fpSrc, "%c", &ch) != EOF) {
fprintf(fpDes, "%c", ch);
}
/* 关闭文件 */
fclose(fpSrc);
fclose(fpDes);
}
/*
* 文件名: mycopyV3.c
* 描述: 编写文件复制命令行程序,命令行格式为:mycopy filename1 filename2
* 作者: 刘博
*/
#include <stdio.h>
#include <stdlib.h>
#define BUFSIZE 1024
int main(int argc, char *argv[])
{
FILE *fpSrc, *fpDes;
char buffer[BUFSIZE];
int in, out;
/* 检查命令行参数个数 */
if (argc != 3) {
printf("Usage: mycopy SourceFile DestinationFile\n");
exit(1);
}
/* 打开文件 */
if ((fpSrc = fopen(argv[1], "r")) == NULL) {
printf("open file error!\n");
exit(1);
}
if ((fpDes = fopen(argv[2], "w")) == NULL) {
printf("creat file error!\n");
exit(1);
}
/* 复制文件 */
while ((in = fread(buffer, 1, BUFSIZE, fpSrc)) > 0) {
out = fwrite(buffer, 1, in, fpDes);
/* 判断读出和写入元素个数是否一致 */
if (in != out) {
printf("copy error!\n");
exit(1);
}
}
/* 关闭文件 */
fclose(fpSrc);
fclose(fpDes);
}