Új hozzászólás Aktív témák
-
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.ee2.fájl
a@b.cc
b@c.XX
c@d.ee3.fájl(kimeneti fájl)
különbség -> b@c.dd <> b@c.XXvagy 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)
-
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)
-
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)
-
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?[ 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)
-
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....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)
-
félisten
-
félisten
válasz kiskatus #707 üzenetére
Hali!
Na akkor már sínen vagyunk!
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 miFire.
[ 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)
-
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ájlokatFire.
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)
-
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)
-
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ájlokatLássuk mi törpénik....
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)
-
félisten
-
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.
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"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" 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
● olvasd el a téma összefoglalót!
● ha kódot szúrsz be, használd a PROGRAMKÓD formázási funkciót!