嘿伙计们,我目前正在尝试使用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
答案 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;