- Felpúposodott egy Galaxy Ring, a Samsung besegített
- Xiaomi 15 - kicsi telefon nagy energiával
- iOS alkalmazások
- Samsung Galaxy Watch8 és Watch8 Classic – lelkes hiperaktivitás
- Apple iPhone 17 - alap
- iPhone topik
- Itt a Xiaomi Android 16-os frissítési ütemterve a kompatibilis készülékekre
- Apple iPhone 17 Pro Max – fennsík
- Samsung Galaxy S25 Ultra - titán keret, acélos teljesítmény
- Így néz ki az újratervezett S Pen
Új hozzászólás Aktív témák
-
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;
}
Ú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!
- NVIDIA GeForce RTX 5080 / 5090 (GB203 / 202)
- Brogyi: CTEK akkumulátor töltő és másolatai
- NVIDIA GeForce RTX 5070 / 5070 Ti (GB205 / 203)
- Kerékpárosok, bringások ide!
- Mibe tegyem a megtakarításaimat?
- Uplay
- Samsung LCD és LED TV-k
- Szeged és környéke adok-veszek-beszélgetek
- AMD Ryzen 9 / 7 / 5 9***(X) "Zen 5" (AM5)
- 5.1, 7.1 és gamer fejhallgatók
- További aktív témák...
- Dobozos , garanciális 27"-os Acer Nitro ívelt monitor leárazás
- Apple Macbook Air 13,6 M4 16GB/256GB - 7 Ciklus - 100% Akkumulátor - MAGYAR - Ezüst - 3 év garancia
- Apple iMac 19.2 i5-8500 Radeon Pro 560X 4GB 16GB 256GB SSD 21.5" 4K Retina
- Apple iMac 19.2 i5-8500 Radeon Pro 560X 4GB 16GB 256GB SSD 21.5" 4K Retina
- Nagyakkus, mobilnetes - Dell Latitude 5330 i3-1215U 6mag! 16GB 1000GB 13.3" FHD 1 év gar
- Bomba ár! Lenovo ThinkPad X395 - AMD Ryzen PRO 5 I 8GB I 512GB SSD I 13,3" FHD I Cam I W11 I Gari!
- HIBÁTLAN iPhone 13 256GB Red -1 ÉV GARANCIA - Kártyafüggetlen, MS3428
- ÁRGARANCIA!Épített KomPhone i5 14600KF 32/64GB RAM RTX 5070 12GB GAMER PC termékbeszámítással
- HIBÁTLAN iPhone 11 Pro 256GB Midnight Green -1 ÉV GARANCIA - Kártyafüggetlen, MS3546
- ASUS TUF F15 FX506 - 15,6"FHD IPS 144Hz - i5-11400H - 32GB - 1TB - RTX 3050 Ti - Win11 - MAGYAR
Állásajánlatok
Cég: Laptopműhely Bt.
Város: Budapest
Cég: PCMENTOR SZERVIZ KFT.
Város: Budapest