Keresés

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

  • Fire/SOUL/CD

    félisten

    válasz kiskatus #692 üzenetére

    Hali!

    Azt írtad, hogy Angol szöveg. Ezt azt jelenti, hogy soronként kell összehasonlítanod?
    Tehát pl mindkét fájlban email címek vannak.

    1.fájl
    a@b.cc
    b@c.dd
    c@d.ee

    2.fájl
    a@b.cc
    b@c.XX
    c@d.ee

    3.fájl(kimeneti fájl)
    különbség -> b@c.dd <> b@c.XX

    vagy esetleg byte-onként(binary compare)? Ez esetben teljesen mindegy milyen fájlról van szó, lényegtelen hogy szöveg, kép, hang stb.

    Fire.

    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)

  • Fire/SOUL/CD

    félisten

    válasz kiskatus #694 üzenetére

    Hali!

    Köszi a választ, na így egyértelmű, mivel KARAKTERENKÉNT kell összehasonlítani, azaz bináris összehasonlítást kell írni.

    Délutánra meglesz.

    Fire.

    [ Szerkesztve ]

    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)

  • 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)

  • Fire/SOUL/CD

    félisten

    válasz kiskatus #702 üzenetére

    Hali!

    Miben is írsz?

    Fire.

    UI: remélem a "bemásolás" alatt azt érted, hogy kijelölöd a kódót a HSZ-ben, jobb egér/másol
    aztán a fejlesztőkörnyezetben meg egy üres xxxxxx.C fájlba beilleszted(jobb egér/beillesztés? :U

    [ Szerkesztve ]

    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)

  • Fire/SOUL/CD

    félisten

    válasz kiskatus #702 üzenetére

    Hali!

    Minden olyan sor elé, ahol az exit(-1) van, tegyél be egy getchar() -t.
    Bocsi, az én hibám, csak mindig elfeledkezem, hogy a CodeBlocks nem csukja be az ablakot automatikusan, más fejlesztőkörnyezet meg esetleg igen.... :W

    Fire.

    [ Szerkesztve ]

    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)

  • Fire/SOUL/CD

    félisten

    válasz kiskatus #705 üzenetére

    Hali!

    #704 HSZ

    Fire.

    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)

  • Fire/SOUL/CD

    félisten

    válasz kiskatus #707 üzenetére

    Hali!

    Na akkor már sínen vagyunk! :DDD
    Létre kell hoznod egy first.txt nevű fájlt, abban a könyvtárban ahol a forrásfájl(C) van vagy oda ahova az exe generálódik.(esetenként ez ugyanaz a könyvtár)
    Ha ez megvan és megint elindítod, akkor keresni fogja a second.txt fájlt, azt is hozd létre.
    Ez a két fájl amit a progi összehasonlít. Írjál beléjük valamit, mondjuk az egyikbe egy 'a' a másikba egy 'b' betűt. Ha most futtatod, akkor kiírja a végén, hogy egy eltérés van, létrehoz egy error.txt nevű fájlt, amibe ha belekukkantasz akkor bent lesz, hogy hol van eltérés és mi

    Fire.

    [ Szerkesztve ]

    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)

  • Fire/SOUL/CD

    félisten

    válasz kiskatus #709 üzenetére

    Hali!

    Na, akkor elöször kiderítjük, hogy hol jön létre az exe fájl.
    Hova mented a forrásfájl-t? Milyen könyvtárba?
    Na ebbe a könyvtárba kell létrehozni a first.txt meg a second.txt fájlokat

    Fire.

    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)

  • Fire/SOUL/CD

    félisten

    válasz kiskatus #711 üzenetére

    Hali!

    Egy kis türelmet, mert így nem jutunk előrébb. Letöltöm a Borland Turbo C-t, telepítem, aztán akkor látom hogy mit is kell csinálni, hogy menjen a progi.

    Fire.

    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)

  • Fire/SOUL/CD

    félisten

    válasz kiskatus #711 üzenetére

    Hali!

    Hát sajna, nem tudom x64 Vista alá "felerőszakolni" a Turbo C++ 4-et, úgy hogy vakon adok tanácsot.
    hozz létre egy könyvtárat c:\kiskatus
    indítsd el a Turbo c++-t
    töltsd be a projectet vagy fájlt
    aztán (gondolom) file menü save as vagy save project as vagy valami menüpont segítségével ments ki a c:\kiskatus könyvtárba
    csukd be ezt a projectet vagy fájlt
    file menü open project vagy hasonlóval nyisd meg a c:\kiskatus -ból
    és most próbáld meg a c:\kiskatus könyvtárba létrehozni a first.txt ill second.txt fájlokat

    Lássuk mi törpénik.... :U

    Fire.

    [ Szerkesztve ]

    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)

  • Fire/SOUL/CD

    félisten

    válasz kiskatus #757 üzenetére

    Hali!

    Egy keresztkérdés: a dinamikus memóriafoglalást tanultátok? (MALLOC például)

    Fire.

    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)

  • Fire/SOUL/CD

    félisten

    válasz kiskatus #757 üzenetére

    Hali!

    Először is szívesen segítek Neked, a most következő rész az csak úgy kikívánkozott belőlem, NEM NEKED SZÓL!
    "Elvittem az általad megírt programot és nem fogadta el, mert az fseek pozicionálást és az ftell-t még nem tanultuk."
    Amikor ezt elolvastam, két idézet suhant át az agyamon, az első Hofi Géza kabaréból, míg a másik egy PH tag aláírásából származik(bár ezt nem szó szerint idézem)
    "Szűz Mária idesanyám, aki a mennyekben lakozol titokban..." illetve
    "nem az a baj, hogy nagy az Isten állatkertje, hanem az, hogy alacsony a kerítés"
    Az aki ezt a feladatot feladta(alapszintű fájlkezelés kategória) és nem tanítja meg az alapszintű fájlkezelést Nektek(fseek, ftell stb), annak jobb lenne ha visszamászna a kerítésen belülre. :DDD
    Ugyanis oly módon kellett megírni a programot(fseek, ftell nélkül), hogy nyugodtan rá lehetne ragasztani azt a címkét, hogy "A világ leglassabbra optimalizált fájl-összehasonlító alkalmazása avagy hogy ne írjunk C-ben ilyen programot" :W

    Na mindegy...imhol a kód...

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

    int main()
    {
    unsigned long ErrorCounter,FSize1,FSize2;
    unsigned char chFirst, chSecond;
    FILE * Szoveg1;
    FILE * Szoveg2;
    FILE * Kimenet;

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

    if (!(Szoveg1 = fopen("first.txt","rb"))) {
    fprintf(stderr,"Nem lehet megnyitni a 'first.txt' fajlt...\n");
    getchar();
    exit(-1);
    }

    if (!(Szoveg2 = fopen("second.txt","rb"))) {
    fprintf(stderr,"Nem lehet megnyitni a 'second.txt' fajlt...\n");
    fclose(Szoveg1);
    getchar();
    exit(-1);
    }
    //itt változik némileg a kód, csak úgy lehet meghatározni a fájlok hosszát
    //ha végig olvasom
    FSize1=0;
    while (fread(&chFirst,1,1,Szoveg1)==1) FSize1++;
    FSize2=0;
    while (fread(&chFirst,1,1,Szoveg2)==1) FSize2++;

    if (!FSize1 || !FSize2) {
    printf("A fajlok merete nem lehet 0 byte...");
    fclose(Szoveg1);
    fclose(Szoveg2);
    getchar();
    exit(-1);
    }
    if (FSize1!=FSize2) {
    printf("A ket fajl merete nem azonos...\n");
    fclose(Szoveg1);
    fclose(Szoveg2);
    getchar();
    exit(-1);
    }

    rewind(Szoveg1);
    rewind(Szoveg2);
    //innentől változatlan
    if (!(Kimenet = fopen("error.txt","wt"))) {
    fprintf(stderr,"Nem lehet megnyitni az 'error.txt' fajlt...\n");
    fclose(Szoveg1);
    fclose(Szoveg2);
    getchar();
    exit(-1);
    }
    ErrorCounter=0;
    while (fread(&chFirst,1,1,Szoveg1)==1) {
    fread(&chSecond,1,1,Szoveg2);
    if (chFirst!=chSecond) {
    fprintf(Kimenet,"File-pozicio: %#.8lx %#.2x <> %#.2x\n",ftell(Szoveg1),chFirst,chSecond);
    ErrorCounter++;
    }
    }
    if (ErrorCounter) printf("%lu elteres talalhato a ket fajl kozt.\nNezze meg az 'error.txt' fajl tartalmat...\n",ErrorCounter);
    else printf("A ket fajl azonos...\n");

    fclose(Szoveg1);
    fclose(Szoveg2);
    fclose(Kimenet);

    system("pause");

    return 0;
    }

    Fire.

    UI: ha legközelebb is kódot illesztesz be a HSZ-be, akkor légyszíves használd az erre a célra "kifejlesztett" :DDD KÓD feliratú gombot.

    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