如何使用C按字典顺序比较两个文件
嘿,伙计们,我目前正在尝试使用C实现一个函数,它将两个文件名作为命令行参数,并按字典顺序进行比较 如果第一个文件的内容小于第二个文件的内容,函数将返回-1;如果第二个文件的内容小于第一个文件的内容,函数将返回1;如果文件相同,函数将返回0 请给我一些建议,我应该如何开始这个 [编辑] 嘿,伙计们,如果问题中有任何不清楚的地方,我很抱歉,所以我将在这里发布问题的链接:。问题是它是一个uni赋值,所以我们希望只使用基本的C属性,可能只包括stdio.h、stdlib.h和string.h。很抱歉给您带来麻烦。这是我已经拥有的代码,我现在的主要问题是函数不知道file1.txt(参考链接)的第一行比file2.txt长,但实际上在字典上更少:如何使用C按字典顺序比较两个文件,c,C,嘿,伙计们,我目前正在尝试使用C实现一个函数,它将两个文件名作为命令行参数,并按字典顺序进行比较 如果第一个文件的内容小于第二个文件的内容,函数将返回-1;如果第二个文件的内容小于第一个文件的内容,函数将返回1;如果文件相同,函数将返回0 请给我一些建议,我应该如何开始这个 [编辑] 嘿,伙计们,如果问题中有任何不清楚的地方,我很抱歉,所以我将在这里发布问题的链接:。问题是它是一个uni赋值,所以我们希望只使用基本的C属性,可能只包括stdio.h、stdlib.h和string.h。很抱歉给您
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;