Hirdetés

Új hozzászólás Aktív témák

  • Fire/SOUL/CD
    félisten

    Nagyon szépen köszönöm!!!
    Annyit kérhetnék, hogy megjegyzésben nagyjából írd oda, hogy mit miért.
    Hátha megértem úgy énis. Mégegyszer nagyon köszönöm!

    Hali!

    Na, elkészültem, az elején azonban pár szó...
    Ezt úgy írtam ahogy kérted, tehát karakterenként olvas, azonban az ilyen jellegű progikat nem így írják. Ez a progi pár ezer byte-os fájlokon gyorsnak tűnhet, de ha pl 2 darab 50 megás fájl-t kellene összehasonlítania, akkor elidőzhet előtte az ember, a karakteres olvasásnak köszönhetően. A gyors FileComparer progikban dinamikusan lefoglalnak memóriából 2 nagyobb "darabot" a un bufferek számára. Ezekbe a bufferekbe olvassák be az adatokat a fájlokból(nem egyesével, hanem amekkora buffer, mondjuk 4mega) és a két buffert hasonlítják össze, ami nagyon gyors hisz a memóriában van.
    Természetesen ezt csak plusz INFO-nak szántam.
    Felkommenteztem, remélem érthető is lesz. Persze ha van kérdésed akkor írj nyugodtan.

    Fire.

    #include <stdio.h>
    #include <stdlib.h>

    int main()
    {
    unsigned long ErrorCounter;
    unsigned char chFirst, chSecond;
    FILE * FirstFileAsBinary;
    FILE * SecondFileAsBinary;
    FILE * ErrorFileAsText;

    printf("Binaris osszehasonlitas\n\n");

    //első fájl megnyitása binárisan
    //minden fájl megnyitásakor kötelező a hibaellenőrzés!
    if (!(FirstFileAsBinary = fopen("first.txt","rb"))) {
    //nem sikerült megnyitni az első fájlt, ezért hibakiírás, kilépés
    fprintf(stderr,"Nem lehet megnyitni a 'first.txt' fajlt...");
    exit(-1);
    }
    //második fájl megnyitása binárisan
    //minden fájl megnyitásakor kötelező a hibaellenőrzés!
    if (!(SecondFileAsBinary = fopen("second.txt","rb"))) {
    fprintf(stderr,"Nem lehet megnyitni a 'second.txt' fajlt...");
    //nem sikerült megnyitni a második fájlt, ezért hibakiírás, kilépés
    //de elötte a korábban sikeresen megnyitott első fájlt le kell zárni
    fclose(FirstFileAsBinary);
    exit(-1);
    }
    //a fseek a fájlban pozicionál, meg kell adni
    //hogy melyik fájlban, egy relatív távolságot, és hogy honnan
    //alábbi esetben a FirstFileAsBinary fájlban, a végétől(SEEK_END), 0 bytera
    //azaz magyarul a fájl végére pozícionálunk, amit azért teszünk, hogy a továbbiakban
    //az ftell függvénnyel(ami az épp aktuális fájlpoziciót adja vissza) meg tudjuk
    //határozni a fájl hosszát
    fseek(FirstFileAsBinary,0,SEEK_END);
    fseek(SecondFileAsBinary,0,SEEK_END);
    //megnézzük, hogy a két fájl mérete azonos-e, mivel ha nem
    //akkor nincs értelme összehasonlítani őket
    if (ftell(FirstFileAsBinary)!=ftell(SecondFileAsBinary)) {
    printf("A két fájl mérete nem azonos...");
    //nem azonos méretű a két fájl, ezért hibakiírás, kilépés
    //de elötte a korábban sikeresen megnyitott első és második fájlt le kell zárni
    fclose(FirstFileAsBinary);
    fclose(SecondFileAsBinary);
    exit(-1);
    }
    //itt azt ellenőrizzük, hogy ne legyen 0 byte hosszú a fájl, hisz akkor megint csak
    //nincs értelme az összehasonlításnak
    //azért csak az egyik fájlt ellenőrzöm, mert az előzőekben már kiderült, hogy
    //a két fájl egyenlő méretű, és ha az első fájl netalántán 0 byte hosszú
    //akkor a második is
    if (!ftell(FirstFileAsBinary)) {
    printf("A fajlok merete nem lehet 0 byte...");
    //0 byte méretű mindkét fájl, ezért hibakiírás, kilépés
    //de elötte a korábban sikeresen megnyitott első és második fájlt le kell zárni
    fclose(FirstFileAsBinary);
    fclose(SecondFileAsBinary);
    exit(-1);
    }
    //most a fájlpoziciót visszaállítom a fájl elejére, azaz 0 byte-ra a fájl elejétől(SEEK_SET)
    //azért kell megtenni, mert korábban a fájl végére pozicionáltam
    fseek(FirstFileAsBinary,0,SEEK_SET);
    fseek(SecondFileAsBinary,0,SEEK_SET);
    //létrehozom azt a fájlt szövegesként, amibe az esetleges eltéréseket letároljuk
    if (!(ErrorFileAsText = fopen("error.txt","wt"))) {
    fprintf(stderr,"Nem lehet megnyitni az 'error.txt' fajlt...");
    //nem sikerült létrehozni a fájlt, ezért hibakiírás, kilépés
    //de elötte a korábban sikeresen megnyitott első és második fájlt le kell zárni
    fclose(FirstFileAsBinary);
    fclose(SecondFileAsBinary);
    exit(-1);
    }
    //hibaszámláló nullázása, a későbbiekben használom
    ErrorCounter=0;
    //az fread függvény (jelen esetben) 1 darab, 1 byte hosszú adatot olvas be
    //jelen esetben a chFirst, chSecond változóba, az első ill második fájlból
    //a visszatérő értéke olvasás esetén mindig annyi, amennyit megadtunk neki
    //jelen esetben 1. Ha nem ennyivel tér vissza, az azt jelenti, hogy a fájl végére értünk
    //vagy valamilyen fájlolvasási hiba lépett fel
    while (fread(&chFirst,1,1,FirstFileAsBinary)==1) {
    fread(&chSecond,1,1,SecondFileAsBinary);
    //összehasonlítjuk a két byte-ot
    if (chFirst!=chSecond) {
    //ha nem egyenlő, akkor kiírjuk az error.txt fájlba, méghozzá a következő módon
    //filepozició,chFirst,chSecond
    //a filepoziciót 0x-el kezdődő 8 számjegyes hexadecimális számként
    //a chFisrt, chSecond pedig 0x-el kezdődő 2 számjegyes hexadecimális számként
    fprintf(ErrorFileAsText,"File-pozicio: %#.8lx %#.2x <> %#.2x\n",ftell(FirstFileAsBinary),chFirst,chSecond);
    //hibaszámláló növelése
    ErrorCounter++;
    }
    }
    //ha a hibaszámláló nem 0, akkor kiírjuk hány eltérés van a két fájl közt
    if (ErrorCounter) printf("%lu elteres talalhato a ket fajl kozt.\nNezze meg az 'error.txt' fajl tartalmat...",ErrorCounter);
    //ha a hibaszámláló 0, akkor nincs különbség a két fájl tartalma közt
    else printf("A ket fajl azonos...");

    //mindhárom korábban sikeresen megnyitott fájl lezárása
    fclose(FirstFileAsBinary);
    fclose(SecondFileAsBinary);
    fclose(ErrorFileAsText);

    //várakozás ENTER-re
    printf("\n\nUsson ENTER-t a kilepeshez...");
    getchar();

    return 0;
    }

Új hozzászólás Aktív témák