0

我的 C 练习需要逐行比较 2 个文本文件 - 这意味着 在此处输入图像描述

在此处输入图像描述

在此处输入图像描述

我的计划是:

一、使用 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;

}

非常感谢!

4

1 回答 1

1

一个问题是你的sscanf()论点又回到了前面。您需要从(一些偏移量)扫描l1or l2,并分配给w1or w2,而此时您扫描w1orw2并将结果存储到l1or 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()即使第一个操作失败也能执行这两个操作。此代码无需重复函数调用即可实现这一目标。

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

于 2013-11-04T06:51:23.827 回答