我目前正在尝试制作一个比较2个文件并显示所有差异的程序。
我遇到的问题是:
结果的第一行没有显示第一个字符。
差异没有正确的结果。
我有两个输入文件。
file.txt的
AAA
BBB
CCC
DDD
EEE
FILE2.TXT
AAA
111
BBB
222
333
CCC
DDD
EEE
444
输出(第1行被窃听)我得到的是:
11
BBB
222
333
CCC
我希望获得的输出(没有第一行错误)必须是:
111
222
333
444
这是我目前的代码:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
int compare(char *fname1, char *fname2)
{
FILE *fp1 = fopen(fname1, "r");
FILE *fp2 = fopen(fname2, "r");
int ch1, ch2;
if (fp1 == NULL)
{
printf("Can't open %s", fname1);
exit(1);
}
else if (fp2 == NULL)
{
printf("Can't open %s", fname2);
exit(1);
}
else
{
ch1 = getc(fp1);
ch2 = getc(fp2);
while ((ch1 != EOF) && (ch2 != EOF) && (ch1 == ch2))
{
ch1 = getc(fp1);
ch2 = getc(fp2);
}
if (ch1 == ch2)
{
printf("Same. \n");
}
else if (ch1 != ch2)
{
printf("Different strings:\n");
while(!feof(fp1) && !feof(fp2))
{
fgets(fname1, ch1, fp1);
fgets(fname2, ch2, fp2);
if(strcmp(fname1, fname2) != 0)
{
printf("%s", fname2);
}
}
}
}
fclose(fp1);
fclose(fp2);
return 0;
}
主要功能:
int main(int argc, char *argv[])
{
if (argc == 3){
compare(argv[1], argv[2]);
}else{
printf("Usage: ./what file.txt file2.txt \n");
}
return 0;
}
比较file.txt和file2.txt或file2.txt和file.txt会得到相同的结果。
答案 0 :(得分:0)
你缺少的第一个字符在第一个循环中被getc()消化。要解决这个问题,请尝试仅使用第二个while()或在开始下一个while()循环之前找回一个char
答案 1 :(得分:0)
您对fgets()
的两次通话都是错误的。根据{{3}}:
char * fgets(char * str,int num,FILE * stream);
str :指向复制字符串读取的字符数组的指针。
num :要复制到str的最大字符数(包括 终止空字符)。
stream :指向FILE对象的指针 标识输入流。 stdin可以用作参数来读取 标准输入。
尝试写入你的程序argv[]
可能不会很好。至少你想要做的事情是:
char string1[100];
char string2[100];
fgets(string1, 99, fp1);
fgets(string2, 99, fp2);
使用feof()
这样的fgets()
documentation可能是错误的。
至于你的比较问题...尝试进行文件比较并检查添加/删除的字符串不是一个简单的问题。您可以从be aware开始获取某些背景信息。