我正在编写一个程序,逐个字符地比较两个文件。比较每个文件的函数根据文件的条件返回一个值。
当两个文件相同时函数返回 0,如果两个文件匹配但第一个文件在第二个文件之前结束则返回 -1,如果两个文件匹配但第二个文件在第一个文件之前结束则返回 -2,以及一个正整数表示哪个文件不同的字符。
#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
它给了我一个奇怪的返回值,我想知道为什么会这样?
提前感谢您的帮助
最佳答案
您调用 char_cmp(fp1, fp2))
两次 - 一次在 switch 语句中,第二次在默认条件下。第二次它会返回它们不同的第二个字符位置(或其他,真的出乎意料:)
将其更改为
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
一切正常
关于c - 我如何逐个字符地比较两个文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6486658/