gpt4 book ai didi

c - 我如何逐个字符地比较两个文件

转载 作者:太空宇宙 更新时间:2023-11-04 00:32:48 26 4
gpt4 key购买 nike

我正在编写一个程序,逐个字符地比较两个文件。比较每个文件的函数根据文件的条件返回一个值。

当两个文件相同时函数返回 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))

cd 从某个时刻开始永远等于 EOF。将其更改为

(c = fgetc(fp1)) == (d = fgetc(fp2) && c != EOF

一切正常

关于c - 我如何逐个字符地比较两个文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6486658/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com