《C语言课程设计》一3.1 文件复制

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);           
}
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值