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);
}