如何使用C按字典顺序比较2个文件

时间:2010-09-28 09:54:15

标签: c

嘿伙计们,我目前正在尝试使用C实现一个函数,它接受两个文件名作为命令行参数,并按字典顺序对它们进行比较。

如果第一个文件的内容小于第二个文件的内容,则该函数将返回-1;如果第二个文件的内容小于第一个文件的内容,则返回1,如果文件的内容小于0,则返回0相同。

请给我一些关于如何从此开始的建议。

[编辑]

嘿大家好抱歉,如果问题中有任何不清楚的部分,那么我只会在这里发布问题的链接:Original question。事情是它是一个单一的赋值所以我们期望只使用基本的C属性,可能只包括stdio.h,stdlib.h和string.h。对不起造成的麻烦。另外这里是我已经拥有的代码,我现在的主要问题是函数不知道file1.txt(参考链接)它的第一行比file2.txt长,但实际上是字典缩写:

int filecmp(char firstFile[], char secondFile[])
{
    int similarity = 0;
    FILE *file1 = fopen(firstFile, "r");
    FILE *file2 = fopen(secondFile, "r");
    char line1[BUFSIZ];
    char line2[BUFSIZ];

    while (similarity == 0)
    {
        if (fgets(line1, sizeof line1, file1) != NULL)
        {
            if (fgets(line2, sizeof line2, file2) != NULL)
            {
                int length;

                if (strlen(line1) > strlen(line2))
                {
                    length = strlen(line1);
                }
                else
                {
                    length = strlen(line2);
                }

                for (int i = 0; i < length; i++)
                {
                    if (line1[i] < line2[i]) similarity = -1;
                    if (line1[i] > line2[i]) similarity = 1;
                }
            }
            else
            {
                similarity = 1; //As file2 is empty
            }
        }
        else
        {
            if (fgets(line2, sizeof line2, file2) != NULL)
            {
                similarity = -1; // As file1 is empty
            }
            else break;
        }
    }

    fclose(file1);
    fclose(file2);

    return similarity;
}

[结束编辑]

非常感谢,
Jonathan Chua

2 个答案:

答案 0 :(得分:2)

查看UNIX cmp实用程序的源代码,例如: here。相关文件为regular.c。如果你不能使用mmap,那么通过fgetc()实现的原则是相同的:只要他们比较两个文件,就继续从两个文件中读取一个字符。当(如果!)找到差异时,返回比较结果。可以通过将EOF视为无限小的值来解决一个文件是另一个文件的正确前缀(例如“ABC”“ABCCC”)的边界情况。这已在C中巧妙地解决,因为fgetc()保证仅在EOF上返回负值;正确的字符是>= 0

答案 1 :(得分:1)

你被允许使用strcmp吗?

如果是这样(未经测试):

int ret = 0;
while (ret == 0)
{ 
    char line1 [ MAX_LINE_LEN ]; 
    char line2 [ MAX_LINE_LEN ]; 
    if (fgets(line1, MAX_LINE_LEN, file1) != NULL )
    {
        if (fgets(line2, MAX_LINE_LEN, file2) != NULL )
        {
            ret = strcmp(line1, line2);
        }
        else
        {
            ret = 1;
        }
    }
    else
    {
        if (fgets(line2, MAX_LINE_LEN, file2) != NULL )
        {
            ret = -1;
        }
        else
        {
            break;
        }
    }
}
return ret;