C文件比较

C文件比较,c,string,comparison,C,String,Comparison,我正在尝试比较C中的两个文件。我正在比较每个字符,直到它到达一个(.a)之后(我不关心文件的其余部分,直到它到达一个新行。到达新行后,我再次比较每个字符,直到它到达(.a)。如果在(我希望程序让我知道文件是不同的。如果它们相同,我希望它在文件中迭代,直到达到EOF。当文件完全匹配时,程序让我知道一切都很好,但getchar在最后似乎抓住了一些奇怪的字符(Ÿ),导致它告诉我没有最终匹配 另外。当我识别(循环似乎没有执行,并且它仍然在后面标记字符)时,它告诉我匹配不好,尽管我认为应该忽略它。我希望这

我正在尝试比较C中的两个文件。我正在比较每个字符,直到它到达一个(.a)之后(我不关心文件的其余部分,直到它到达一个新行。到达新行后,我再次比较每个字符,直到它到达(.a)。如果在(我希望程序让我知道文件是不同的。如果它们相同,我希望它在文件中迭代,直到达到EOF。当文件完全匹配时,程序让我知道一切都很好,但getchar在最后似乎抓住了一些奇怪的字符(Ÿ),导致它告诉我没有最终匹配

另外。当我识别(循环似乎没有执行,并且它仍然在后面标记字符)时,它告诉我匹配不好,尽管我认为应该忽略它。我希望这是清楚的,我期待着你的任何见解。谢谢

#include <stdio.h>
#include <string.h>
#include <stdlib.h>

int main(void)
{

FILE *masterlist;
FILE *test;
char masterprc[12];
char testprc[12];
int i;
int j;

int n = 0;

//open authritative DB for proc calls
masterlist = fopen("masterlist","r");
//open strace of Shellcode
test = fopen("testprc","r");

//insures file properly opens
if (masterlist == NULL || test == NULL)
{
    printf("A file did not open\n");
    exit(0);
}else {         //if files both open then begin check

    do {        //loop iterates through the files comparing 
            //values

        j = getc(test);
        i = getc(masterlist);

        if (j == i) {
            printf("good\n");
            //putchar (j);
        } else if (j == '(') {
                while (j != '\n'){
                    //putchar (j);
                j = getc(test);
                    i = getc(masterlist);
                } 
        } else if (j != i) {
            printf("no good\n");

        }       
    } while (j != EOF);
}

fclose (masterlist);
fclose (test);  
} 
#包括
#包括
#包括
内部主(空)
{
文件*主列表;
文件*测试;
中华人民共和国[12];
char testprc[12];
int i;
int j;
int n=0;
//为proc调用打开授权数据库
主列表=fopen(“主列表”,“r”);
//外壳代码的开放策略
测试=fopen(“测试PRC”、“r”);
//确保文件正确打开
如果(主列表==NULL | |测试==NULL)
{
printf(“文件未打开\n”);
出口(0);
}否则{//如果文件都打开,则开始检查
do{//循环遍历文件比较
//价值观
j=getc(试验);
i=getc(主列表);
如果(j==i){
printf(“良好”);
//普查尔(j);
}else如果(j=='('){
而(j!='\n'){
//普查尔(j);
j=getc(试验);
i=getc(主列表);
} 
}否则如果(j!=i){
printf(“不好”\n);
}       
}而(j!=EOF);
}
fclose(主列表);
fclose(测试);
} 

不需要为此编写C,只需在shell中执行即可:

rpl="cut -d '(' -f 1"
diff --brief <($rpl masterlist) <($rpl testprc)
rpl=“切割-d”('-f1“

diff--brief如果两行在
之前相同(
之后不同,则仍在运行检查。 主要是因为
}else if(j=='('){

一旦你在
j
上到达一个
),如果
i
等于
),你应该一直运行到行尾

你的代码没有这样做


让我们稍微调试一下您的代码。我添加了以下情况:

   // -------- CASE 1 ---------------
    if (j == i) {
        printf("good\n");
        //putchar (j);

    // -------- CASE 2 ---------------
    } else if (j == '(') {
            while (j != '\n'){
                //putchar (j);
            j = getc(test);
                i = getc(masterlist);
            } 

    // -------- CASE 3 ---------------
    } else if (j != i) {
        printf("no good\n");

    }       
} while (j != EOF);
输入:

master->
123(45

测试->
123(54

j=
1
,i=
1
->案例1->ok
j=
2
,i=
2
->案例1->ok
j=
3
,i=
3
->案例1->正常

在下一次跑步中,你的罪魁祸首是:
j=
,i=
->)您想要案例2,但案例1已执行


您希望这里的案例2继续阅读,但这不会发生,因为案例1被调用,因为它在检查条件中位于案例2之前。

奇怪的字符是作为字符打印的
EOF
。您应该检查两个文件的
EOF
,也可能检查两个文件的左偏执。

谢谢。很遗憾,这是just是我的代码的第一个方面。它必须在C中。在识别之后while循环不应该这样做吗?否则如果(j='('){while(j!='\n'){//putchar(j);j=getc(test);i=getc(masterlist);}