逐行比较文本文件中的内容

时间:2013-11-04 04:20:59

标签: c

我的C练习需要逐行比较2个文本文件 -意思是 enter image description here

enter image description here

enter image description here

我的计划是:

首先,使用fgets()函数在字符串

时读取一行

其次,使用sscanf()函数解析(忽略空格)字符串,然后比较它们。

然而,我遇到的问题是代码只读了字符串的第一个字(行) 所以我的结果不正确但是现在当我改变我的代码时,它总是给我“不同的文件”。请帮我。我的逻辑错了>< 这是我的代码

int comp_line(FILE *fp1, FILE *fp2){
char l1[1024];
char l2[1024];
char w1[1024];
char w2[1024];
char *c1;
char *c2;

/*initialize*/
c1 = fgets(l1,1024,fp1);
c2 = fgets(l2,1024,fp2);

sscanf(w1,"%1023s",l1);
sscanf(w2,"%1023s",l2);

while (c1 != NULL && c2 != NULL && strcmp(w1,w2) == 0)
{   
    c1 = fgets(l1,1024,fp1);
    c2 = fgets(l2,1024,fp2);
    sscanf(w1,"%1023s",l1);
    sscanf(w1,"%1023s",l1);
    if(c1 != NULL && c2 == NULL)
    {
        printf("EOF 2");
        return 0;
    }
    if(c1 == NULL && c2 != NULL)
    {
        printf("EOF 1");
        return 0;
    }

}
if(strcmp(w1,w2) == 0)
{
    printf("\nfiles are equal");
    return 0;
}
else
{
    printf("\nfiles different");
    return 1;
}
return 0;

}

非常感谢!

1 个答案:

答案 0 :(得分:0)

一个问题是你的sscanf()论证已经回到了前面;您需要扫描(某些偏移到)l1l2,然后分配到w1w2,而在您扫描w1或{ {1}}并将结果存储到w2l1

要遍历该行,您应该使用鲜为人知的l2格式,该格式会报告缓冲区(输入)中出现的偏移量。

%n

我从来没有理由使用逗号运算符,就像两个循环条件使用它一样,但它似乎适合这种情况。我希望即使第一个操作失败,也要执行char *c1; char *c2; while ((c1 = fgets(l1, 1024, fp1)), (c2 = fgets(l2, 1024, fp2)), c1 != NULL && c2 != NULL) { int n1; int n2; char *line1 = l1; char *line2 = l2; int r1; int r2; while ((r1 = sscanf(line1, "%1023s%n", w1, &n1)), (r2 = sscanf(line2, "%1023s%n", w2, &n2)), r1 == 1 && r2 == 1) { if (strcmp(w1, w2) != 0) ...lines differ... line1 += n1; line2 += n2; } ...deal with r1 or r2 is zero while the other isn't... } ...deal with c1 or c2 is null while the other isn't... 个操作;同样,我希望即使第一个操作失败也要执行fgets()个操作。此代码实现了不重复函数调用。

从单行读取多个单词的关键点是sscanf()构造,将字符串转换完成的偏移量添加到下一次扫描的起始位置。