簡體   English   中英

如何逐個字符比較兩個文件

[英]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))

cd從某個時刻開始永遠等於EOF 更改為

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

一切都很好。

當兩者同時達到EOF時,while條件成立,並且由於EOF == EOF,您開始一遍又一遍地循環。

我建議您在開始時盡量不要“空頭”。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM