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

如何使用C按字典顺序比较两个文件,c,C,嘿,伙计们,我目前正在尝试使用C实现一个函数,它将两个文件名作为命令行参数,并按字典顺序进行比较 如果第一个文件的内容小于第二个文件的内容,函数将返回-1;如果第二个文件的内容小于第一个文件的内容,函数将返回1;如果文件相同,函数将返回0 请给我一些建议,我应该如何开始这个 [编辑] 嘿,伙计们,如果问题中有任何不清楚的地方,我很抱歉,所以我将在这里发布问题的链接:。问题是它是一个uni赋值,所以我们希望只使用基本的C属性,可能只包括stdio.h、stdlib.h和string.h。很抱歉给您

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

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

请给我一些建议,我应该如何开始这个

[编辑]

嘿,伙计们,如果问题中有任何不清楚的地方,我很抱歉,所以我将在这里发布问题的链接:。问题是它是一个uni赋值,所以我们希望只使用基本的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;
}
int-filecmp(char-firstFile[],char-secondFile[]
{
int相似性=0;
文件*file1=fopen(第一个文件,“r”);
文件*file2=fopen(第二个文件,“r”);
字符行1[BUFSIZ];
char line2[BUFSIZ];
而(相似性==0)
{
if(fgets(第1行,第1行的大小,文件1)!=NULL)
{
if(fgets(第2行,第2行的大小,文件2)!=NULL)
{
整数长度;
如果(strlen(第1行)>strlen(第2行))
{
长度=strlen(第1行);
}
其他的
{
长度=strlen(第2行);
}
for(int i=0;iline2[i])相似性=1;
}
}
其他的
{
相似性=1;//因为文件2为空
}
}
其他的
{
if(fgets(第2行,第2行的大小,文件2)!=NULL)
{
相似性=-1;//因为文件1为空
}
否则就断了;
}
}
fclose(文件1);
fclose(文件2);
返回相似性;
}
[结束编辑]

非常感谢,

Jonathan Chua

您可以使用strcmp吗

如果是(未经测试):


查看UNIX
cmp
实用程序的源代码,例如。相关文件是
regular.c
。如果不能使用
mmap
,则通过
fgetc()
实现的原则是相同的:只要两个文件比较相同,就从每个文件中读取单个字符。当(如果!)发现差异时,返回比较结果。一个文件作为另一个文件的适当前缀(例如“ABC”“ABCCC”)的临界情况可以通过将EOF视为一个无穷小的值来解决。这在C中已经很好地解决了,因为
fgetc()
保证只在EOF上返回负值;正确的字符是
=0

对不起,这么无知,你所说的词典编纂是什么意思?(在你的上下文中,“少”或“多”是什么意思)我想他指的是字节对字节的比较。我现在已经测试过了,它确实适用于我尝试过的测试用例。@zvrba:如果一个文件没有在另一个文件之前终止,strcmp行就是这样做的。你就快到了;用
fread(buf,1,LEN,file)
替换
fgets(line,LEN,file)
,并使用
memcmp(buf1,buf2,LEN)
代替
strcmp()
。啊,在读取之前不要忘了将填充缓冲区归零,或者至少在
fread()
返回的位置加一个零。使用基于行的缓冲区,意味着短行将比长行“少”,即使它有一个0x03,而另一行有新行。您的方法仅适用于纯ASCII文件。抱歉,我不认为我完全理解您的解释。但从我所能收集到的信息来看,你说的是一步一个字符地对每个文件进行比较,而不用担心EOF,因为它已经由fgetc处理过了,当它发生时会返回负值,对吗?如果是这样的话,它与我所做的非常相似,只是它不能解决当一个文件在字典上较小,但有较长的第一行时的问题。对不起,如果我把你的解释理解错了。
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;