《C语言课程设计》一3.2 文件比较

3.2 文件比较

【例3.2】打印出两个文本文件第一个不相同的行(每行字符数不多于80),命令行格式为:filecmp filename1 filename2。
题目分析
文件的按行读取可调用fgets标准库函数。比较字符串可调用strcmp或strncmp标准库函数。
自定义函数filecomp用来比较不同行。当找到第一个不同行时filecomp函数返回到main()函数。lp1和lp2的作用为:当filename1和 filename2出现第一个不相同行时,控制循环结束;当filename1或 filename2未出现不相同行但已读到文件结束符或发生读取错误时,控制循环结束。
参考程序

/*
 * 文件名: filecmp.c 
 * 描述: 打印出两个文本文件第一个不相同的行。
 *      命令行格式为:filecmp filename1 filename2 
 * 作者: 刘博
 */

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

#define MAXLINE 80 /* 每行字符数不多于80 */

void filecomp(FILE *fp1, FILE *fp2);

int main(int argc, char *argv[]) 
{
    FILE *fp1, *fp2;
    
    /* 检查命令行参数个数 */
    if (argc != 3) {
        printf("Usage: filecmp File1 File2\n");
        exit(1);    /* 异常退出 */ 
    }
    
    /* 打开文件 */ 
    if ((fp1 = fopen(argv[1], "r")) == NULL) {
        printf("can't open %s\n", argv[1]);
        exit(1);    /* 异常退出 */ 
    }
    if ((fp2 = fopen(argv[2], "r")) == NULL) {
        printf("can't open %s\n", argv[2]);
        exit(1);    /* 异常退出 */ 
    }
    
    filecomp(fp1, fp2);
    
    /* 关闭文件 */
    fclose(fp1);
    fclose(fp2);
}

/* 比较两个文件第一个不同行 */
void filecomp(FILE *fp1, FILE *fp2)
{
    char line1[MAXLINE], line2[MAXLINE];
    char *lp1, *lp2;
    
    do {
        lp1 = fgets(line1, sizeof(line1), fp1);
        lp2 = fgets(line2, sizeof(line2), fp2);
        
        if (lp1 == line1 && lp2 == line2) {
            if (strncmp(line1, line2, MAXLINE) != 0) {    
                printf("first difference line:\nfile1: %sfile2: %s", 
                        line1, line2);
                lp1 = lp2 = NULL;    /* 找到不同行,循环结束 */
            }
        } else if (lp1 != line1 && lp2 == line2) {
            printf("end of file1.");
        } else if (lp1 == line1 && lp2 != line2) {
            printf("end of second file2.");
        }
    } while (lp1 == line1 && lp2 == line2);
}
  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值