我的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;
}
非常感谢!
答案 0 :(得分:0)
一个问题是你的sscanf()
论证已经回到了前面;您需要扫描(某些偏移到)l1
或l2
,然后分配到w1
或w2
,而在您扫描w1
或{ {1}}并将结果存储到w2
或l1
。
要遍历该行,您应该使用鲜为人知的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()
构造,将字符串转换完成的偏移量添加到下一次扫描的起始位置。