【发布时间】:2016-06-25 20:07:20
【问题描述】:
我正在尝试比较 2 个文本文件并打印它们不同的第一行,但我在 fgets() 命令中使用了 500 的缓冲区,我认为我在浪费空间。 不知道行长怎么做同样的程序?
这是我的代码:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
int main(int argc, char const *argv[])
{
FILE *fp1, *fp2;
int nLine = 1;
char l1[500], l2[500];
system("clear");
if (argc < 3)
{
printf("Usage: %s <file1.txt> <file2.txt>\n",argv[0]);
exit(1);
}
if ((fp1 = fopen(argv[1],"r")) == NULL){
printf("Can't open file: %s\n", argv[1]);
exit(1);
}
if ((fp2 = fopen(argv[2],"r")) == NULL){
printf("Can't open file: %s\n", argv[2]);
exit(1);
}
fgets(l1,500,fp1);
fgets(l2,500,fp2);
while ((l1 != 0) && (l2 != 0)){
if(strcmp(l1,l2) != 0){
printf("Line number: %d\n", nLine);
printf("%s", l1);
printf("%s\n", l2);
exit(1);
} else {
fgets(l1,500,fp1);
fgets(l2,500,fp2);
nLine++;
}
}
return 0;
}
【问题讨论】:
-
如果文件没有区别,你有一个无限循环。检查
fgets()的返回值。 -
您可以比较两个文件中的字符,如果字符不同,则调用函数来打印该行。这可能很棘手,因为我们没有遵循这条线。你可以反向遍历,直到你得到一个换行符;然后打印该行。
-
您不需要缓冲区来实现您的目标。我会简单地比较对应的字符并记住您在此过程中遇到的最新换行符。
-
如果文件相同,则缓冲区长度无关紧要。如果缓冲区的末尾包含
newline,只需增加行数。 -
即使在这种情况下它不应该有任何区别,但当您不再需要每个文件时,请记住
fclose。