Hirdetés

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

  • Fire/SOUL/CD

    félisten

    válasz kiskatus #698 üzenetére

    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;
    }

    Mindenki tudja, hogy bizonyos dolgokat nem lehet megvalósítani, mígnem jön valaki, aki erről nem tud, és megvalósítja. (Albert Einstein)

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