我正在编写一个程序,逐个字符地比较两个文件。比较每个文件的函数返回一个值,该值取决于文件的条件。
当两个文件相同时,函数返回0,如果两个文件匹配但是第一个文件在第二个文件之前结束,则返回-1;如果两个文件匹配但是第二个文件在第一个文件之前结束,则返回-2,并且正int指示哪个文件文件不同的字符。
#include <stdio.h>
#include <string.h>
#define CMP_EQUAL 0
#define CMP_EOF_FIRST -1
#define CMP_EOF_SECOND -2
int char_cmp(FILE *fp1, FILE *fp2);
int main(void)
{
FILE *fp1;
FILE *fp2;
fp1 = fopen("input1.txt", "rb+");
fp2 = fopen("input2.txt", "rb+");
switch(char_cmp(fp1, fp2))
{
case CMP_EQUAL:
printf("The Files are equal");
break;
case CMP_EOF_FIRST:
printf("EOF on a.txt");
break;
case CMP_EOF_SECOND:
printf("EOF on t.txt");
break;
default:
printf("files differ: char %d\n", char_cmp(fp1, fp2));
break;
}
if(fclose(fp1) != 0)
{
perror("fclose");
/*other error handling*/
}
if(fclose(fp2) != 0)
{
perror("fclose");
/*other error handling*/
}
return 0;
}
int char_cmp(FILE *fp1, FILE *fp2)
{
int c, d;
size_t byte = 0;
int same = 1;
do
{
byte++;
}while((c = fgetc(fp1)) == (d = fgetc(fp2)));
if(c == EOF && d != EOF)
{
return CMP_EOF_FIRST;
}
if(d == EOF && c != EOF)
{
return CMP_EOF_SECOND;
}
if(c != d)
{
return byte;
}
return CMP_EQUAL;
}
我想知道在检查每个文件中的所有字符是否匹配之后我将如何突破do循环。因为当我尝试过时,它会在发现一个相同的字符并且不检查剩下的字符时打破它。
此外,我也鼓励这个奇怪的错误,如果一个文件包含:
dee
,第二个包含
ae
它给了我一个奇怪的回报值,并想知道为什么会这样呢?
感谢您提前提供任何帮助
答案 0 :(得分:3)
您多次致电char_cmp()
。第二轮,在printf()
调用中,返回与第一次调用不同的值,因为已经使用了文件指针。
调用char_cmp()
一次,并将返回的值存储在本地。
cmp = char_cmp(fp1, fp2);
switch(cmp)
{
case CMP_EQUAL:
printf("The Files are equal");
break;
case CMP_EOF_FIRST:
printf("EOF on a.txt");
break;
case CMP_EOF_SECOND:
printf("EOF on t.txt");
break;
default:
printf("files differ: char %d\n", cmp);
break;
}
我不知道你的逻辑的其余部分是否正确。
实际上,你的逻辑不正确。当呈现相同的文件时,它进入无限循环。我相信你能够找到问题所在!
答案 1 :(得分:3)
您调用char_cmp(fp1, fp2))
两次 - 一次在switch语句中,第二次在默认情况下。第二次它返回它们不同的第二个char位置(或另一个,非常意外:)
将其更改为
int k = char_cmp(fp1, fp2));
并在这两个地方使用k:
switch( k )
...
printf("files differ: char %d\n", k);
编辑:在发生相同文件的情况下发生无限循环,因为在这种情况下:
(c = fgetc(fp1)) == (d = fgetc(fp2))
从某个时刻开始, c
和d
永远等于EOF
。将其更改为
(c = fgetc(fp1)) == (d = fgetc(fp2) && c != EOF
一切都很好。
答案 2 :(得分:2)
当两者同时达到EOF时,while条件为真,你开始反复循环,因为EOF == EOF。
我建议你尽量减少“短暂”。