[英]How do i compare two files character by character
我正在寫一個程序,一個字符一個字符地比較兩個文件。 比較每個文件的函數將根據文件的條件返回一個值。
當兩個文件相同時,該函數返回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()
。 由於已使用了文件指針,因此第二輪回合在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;
}
我不知道您其余的邏輯是否正確。
實際上,您的邏輯不正確。 當呈現相同文件時,它將進入無限循環。 我相信您將能夠找到問題所在!
您兩次調用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
一切都很好。
當兩者同時達到EOF時,while條件成立,並且由於EOF == EOF,您開始一遍又一遍地循環。
我建議您在開始時盡量不要“空頭”。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.