Keresés

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

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

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

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

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

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

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

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

  • 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

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

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

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

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

Hirdetés