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

简介: 本节书摘来自华章出版社《C语言课程设计》一书中的第3章,第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);
}
相关文章
|
15天前
|
Linux C语言
C语言 文件IO (系统调用)
本文介绍了Linux系统调用中的文件I/O操作,包括文件描述符、`open`、`read`、`write`、`lseek`、`close`、`dup`、`dup2`等函数,以及如何获取文件属性信息(`stat`)、用户信息(`getpwuid`)和组信息(`getgrgid`)。此外还介绍了目录操作函数如`opendir`、`readdir`、`rewinddir`和`closedir`,并提供了相关示例代码。系统调用直接与内核交互,没有缓冲机制,效率相对较低,但实时性更高。
|
1月前
|
存储 C语言
【C语言】C语言-学生成绩管理系统(源码+数据文件+课程论文)【独一无二】
【C语言】C语言-学生成绩管理系统(源码+数据文件+课程论文)【独一无二】
37 15
|
1月前
|
存储 C语言
【c语言】职工信息管理系统 包含读取写入txt文件,职工信息的增删改查
【c语言】职工信息管理系统 包含读取写入txt文件,职工信息的增删改查
|
1月前
|
存储 自然语言处理 程序员
【C语言】文件的编译链接和预处理
【C语言】文件的编译链接和预处理
|
1月前
|
存储 C语言
【C语言】C语言-设备管理系统(源码+数据文件)【独一无二】
【C语言】C语言-设备管理系统(源码+数据文件)【独一无二】
|
2月前
|
Linux C语言 Windows
C语言文件编程-Linux环境下运行
本文介绍了在Linux环境下使用C语言进行文件编程时的两种主要接口:C标准库函数与Linux系统调用。C标准库提供了`fopen`, `fread`, `fwrite`, 和 `fclose`等函数,适用于普通文件操作;而Linux系统调用如`open`, `read`, `write`, 和 `close`则更适合处理设备文件,同时也可用于普通文件。这两种方法的主要区别在于前者使用文件指针,后者使用文件描述符。文章还给出了两个示例程序:一个使用C标准库函数实现文件复制,另一个则使用Linux系统调用完成相同任务。
33 2
|
3月前
|
编译器 C语言
C语言编译详解:GCC分步编译与一次编译多个文件
C语言编译详解:GCC分步编译与一次编译多个文件
237 2
|
3月前
|
存储 C语言
C语言文件读写详解
C语言文件读写详解
|
3月前
|
存储 编译器 数据库
【再识C进阶5(上)】详细介绍C语言文件操作——文件是用于存储数据
【再识C进阶5(上)】详细介绍C语言文件操作——文件是用于存储数据
|
3月前
|
Java 程序员 Linux
探索C语言宝库:从基础到进阶的干货知识(类型变量+条件循环+函数模块+指针+内存+文件)
探索C语言宝库:从基础到进阶的干货知识(类型变量+条件循环+函数模块+指针+内存+文件)
36 0