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