Hirdetés

2024. április 16., kedd

Gyorskeresés

Hozzászólások

(#651) Fire/SOUL/CD válasza kékfej (#650) üzenetére


Fire/SOUL/CD
félisten

Hali!

Ezt javasolnám: [codeblocks-8.02mingw-setup.exe]
Free C/C++ IDE fejlesztőkörnyezet, ebben az installerben bent van a Compiler illetve linker, automatikusan telepedik, nem kell semmit állítani.
Ha csak HTML és CSS, ahogy írtad, ahhoz nem kell C programozási ismeret, azonban a PHP, JavaScript, Flash ActionScript stb nyelvek esetén nagy előny.

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)

(#652) PazsitZ válasza kékfej (#650) üzenetére


PazsitZ
addikt

fordítók az első hsz-ben a Fordítóprogramok, fejlesztőkörnyezetek: után

Weboldalakhoz, főként ha pusztán HTML általi, statikus tartalmú oldalakat akarsz akkor egyáltalán nem szükséges programozási nyelv ismerete.
Ha pl. PHP alapú dinamikus oldalakat szeretnél gyártani, ahhoz már kell programozói tudás.

- http://pazsitz.hu -

(#653) kékfej


kékfej
csendes tag

nagyon köszi! majd próbálkozok! ;)
mert igazából nekem inkább grafikai ismereteim vannak..ehhez sztnék vmilyen alkalmazott inf tudást..h pl az általam kitalált weboldalt megtudjam valósítani..
v szerintetek magasabb szinten ez inkább 2 külön ember feladata??
köszi!

(#654) cellpeti


cellpeti
veterán

Sziasztok!

Nekem van egy feladatom:

a program árucikkek kódjait kezelik. kérje be a felhasználótól az árucikk azonozító kódját, az azonosító kód csak akkor érvényes ha megfelel a következő követelményeknek:

- pontosan 6 számjegy karakterből áll
- ha az első 5 számjegy összegét 6-tal elosztva a maradék megegyezik a 6. számjeggyel
egy érvényes azonosító 123453
ha az azonosító nem érvényes ezt hibaüzenettel jelezze!
a kódok bevitelét és ellenőrzését addig ismétleje amíg az árucikk kódja helyett üres karakterlánc nem érkezik.

a progit sejtem,hogy kell elkezdeni:

*******************************************************
#include<stdlib.h>
#include<conio.h>

int getline(char s[],int lim) {
int i,c;

for (i=0;i<lim && (c=getchar())!=EOF && c!='\n';++i) s[i]=c;
s[i]='\0';
while (c!=EOF && c!='\n') c=getchar();
return i;
}

void main(void){
int kod[6];
int a;
getline(kod,6);

}

*******************************************************
Azt nem vágopm,hogy a tömb 5 első elemét,hogy adom össze?
Össze kell adni az első 5 bekért karaktert,majd egy tömbbe le kell tárolni őket? :U
Bocs,hogy hosszúra sikerült a dolog!:S

[ Szerkesztve ]

Tigris, tigris, csóvafény...

(#655) doc válasza cellpeti (#654) üzenetére


doc
nagyúr

pl:

int osszeg=0;
for (i=0; i<5; i++)
osszeg+=kod[i]-'0';
if (osszeg%6 != kod[5]-'0')
printf("nem jo\n");
else
printf("jo\n");

(#656) cellpeti válasza doc (#655) üzenetére


cellpeti
veterán

int osszeg=0;
for (i=0; i<5; i++)
osszeg+=kod[i]-'0';
if (osszeg%6 != kod[5]-'0')
printf("nem jo\n");
else
printf("jo\n");

Ha jól értrem akkor a for ciklus végignézi a láncot 5ig,ugye?
De hogy adja össze? :U :B

osszeg+=kod[i]-'0';
if (osszeg%6 != kod[5]-'0')

Mik ezek a '0'-k benne,azok mi célt szolgálnak?

[ Szerkesztve ]

Tigris, tigris, csóvafény...

(#657) Jester01 válasza cellpeti (#656) üzenetére


Jester01
veterán

Azok azért vannak, hogy megkapd a számjegyek értékét. A 0 ascii kódja (ahogy a stringben van) ugyanis 48 (másnéven '0'). Szerencsére innen sorban jön a többi 9 számjegy, tehát sima kivonással meg lehet kapni a számértéket.

Egyébként a string hosszának ellenőrzése még nincs meg.

Jester

(#658) cellpeti válasza Jester01 (#657) üzenetére


cellpeti
veterán

Kapizsgálom,de hol adja össze az 5 számot és milyen tömbön megy végig?
A bekért számok többjén megy 5ig és összeadja?
Az i++ az növeli az i értékét,akkor nem inkább i<=5 -nek kéne lennie?

Tigris, tigris, csóvafény...

(#659) cellpeti válasza Jester01 (#657) üzenetére


cellpeti
veterán

Sztring hosszát az strlen-vel kapom meg nem?Oda egy változót kell beírni,igaz?

Az input ellenőrzést,meg egy
do{}while-val kell,vagy nem?

[ Szerkesztve ]

Tigris, tigris, csóvafény...

(#660) Benmartin válasza cellpeti (#658) üzenetére


Benmartin
senior tag

nem, mert: 0,1,2,3,4 ez 5 elem.

(#661) Jester01 válasza cellpeti (#658) üzenetére


Jester01
veterán

Igen, a bekért számjegyek tömbjén megy végig, összedva őket. Azért nem <= kell mert a tömbök indexelése 0-val kezdődik. Tehát az első 5 számjegy a 0,1,2,3,4 indexeken van.

A string hosszát valóban az strlen adja meg, de mivel a te beolvasó függvényed eleve nem ad vissza csak 6 karaktert, ezért ezzel azt nem tudod kiszűrni ha többet írnak be. Ehhez a beolvasásnál kellene ellenőrizni, hogy pontosan 6 karaktert írtak-e be.
MOD: sőt, mivel egy lezáró 0 byteot is tesz, rögtön túl is címzi a 6 elemű tömböt. Uppsz.

[ Szerkesztve ]

Jester

(#662) cellpeti válasza Jester01 (#661) üzenetére


cellpeti
veterán

És akkor,ha megadok egy feltételt,hogy max ennyi meg ennyi karaktert lehessen bekérni,akkor se jó az strlen? AZ strlen tesz egy lezáró 0-t?
Akkor az elején 6 elemű tömb kell,mert ugye a 6. a program generálja,vagy elég az 5 karakterű tömb is? :U

Tigris, tigris, csóvafény...

(#663) Jester01 válasza cellpeti (#662) üzenetére


Jester01
veterán

Igen, ha csak annyit kérsz be az jó. Csak nem felel meg a feladatkiírásnak :)
strlen nem tesz nullát, kifejezetten azt keresi meg.
7 elemű tömb kell, mert a 6 bekért karakter plusz a lezáró nulla. Már ha akarsz nullát a végére.

Jester

(#664) cellpeti válasza Jester01 (#663) üzenetére


cellpeti
veterán

Akkor,hogy néz ki ez a program,mert most belekevertél elég rendesen! :U

Tigris, tigris, csóvafény...

(#665) Jester01 válasza cellpeti (#664) üzenetére


Jester01
veterán

Pl. kiveszed a 0 lezárást a getline függvényből, mert úgysem kell. Ugyanakkor az i növelését beleteszed a while ciklusba is. Így tehát a függvény legfeljebb 6 karaktert ír a tömbbe (ezzel a túlcsordulás megoldva) és a visszatérési érték alapján pedig a main-ben ellenőrizheted a hosszt (nem kell strlen).

Jester

(#666) Benmartin válasza cellpeti (#664) üzenetére


Benmartin
senior tag

amúgy tömbbe is fölösleges beolvasnod, ha külön nem kéri feladat, összeadni az értékeket tömb nélkül is megteheted már a beolvasás pillanatában.

(#667) cellpeti válasza Benmartin (#666) üzenetére


cellpeti
veterán

Igen valami ilyesmire gondoltam én is,de azt hogyan csináljam,hogy a beolvasáskor összeadja nekem a számokat?

Tigris, tigris, csóvafény...

(#668) Benmartin válasza cellpeti (#667) üzenetére


Benmartin
senior tag

valami ilyesmi:

#include <stdio.h>
int getline()
{
int sum = 0, i = 0, c, hatodik;
while((c = getchar()) && isalnum(c))
{
sum += c - '0';
hatodik = c - '0';
i++;
}
sum -= hatodik;
if(i != 6 || sum % 6 != hatodik) return 0;
return 1;
}
int main()
{
if(getline())
{
puts("Helyes!");
} else puts("Hibas");
getchar();
return 0;
}

[ Szerkesztve ]

(#669) Benmartin válasza Benmartin (#668) üzenetére


Benmartin
senior tag

plusz még hozzáírhatod a while feltételben, hogy 6-nál többet ne is olvasson, ezzel gyorsíthatod (nem tudom, hogy ez most szempont-e).

(#670) cellpeti válasza Benmartin (#668) üzenetére


cellpeti
veterán

Ebből kb a felét nem is értem,meg nem is használhatom prog I. vizsgán! :U :O

Tigris, tigris, csóvafény...

(#671) Benmartin válasza cellpeti (#670) üzenetére


Benmartin
senior tag

ebből mit nem szabad használni prog1-en? (isalnumra gondolok max, de az könnyen helyettesíthető).

(#672) cellpeti válasza Benmartin (#671) üzenetére


cellpeti
veterán

és mivel helyettesíthetném azt? :U

Tigris, tigris, csóvafény...

(#673) Benmartin válasza cellpeti (#672) üzenetére


Benmartin
senior tag

int isnum(char c)
{
if(c >= '0' && c <= '9') return 1;
return 0;
}

értelemszerűen kiegészítheted a while-t ezzel: c >= '0' && c <= '9'

[ Szerkesztve ]

(#674) wiggen123 válasza cellpeti (#672) üzenetére


wiggen123
aktív tag

az isalnum a ctype.h ansi c könyvtárban van, ez része minden c implementációnak, szóval nyugodtan használhatod. Itt egy jó referencia: [link]

A feladatodhoz az én verzióm: beolvasni használd a gets() függvényt, az char*-ot ad vissza. menj végig a karaktertömbön amíg össze kell adni őket, vedd ki őket egy 2 hosszú sztringbe, 0. karakter a számjegy 2. a \0, használd az atoi konverziós függvényt hogy számmá alakítsd, így már össze tudod adni őket. A ciklusból kilépve az utolsó számjegyet ugyanígy számmá alakíthatod és ellenőrizheted.

ZH-n érdemes megkérdezni, hogy feltételezheted e, hogy helyesek az input adatok. Tipikusan nem arra kíváncsiak még akkor, hogy ki tudod e szűrni az összes kivételes helyzetet, hanem, hogy az alapokkal tisztába vagy e.

Sometimes you win, sometimes you learn.

(#675) Benmartin válasza wiggen123 (#674) üzenetére


Benmartin
senior tag

lehet, hogy neki kell megírni minden függvényt, nem ismerjük a pontos feladatot.

(#676) cellpeti válasza Benmartin (#675) üzenetére


cellpeti
veterán

igen,nekem kell megírni a függvényeket is.
Csak azokat a függvényeket és dolgokat lehet használni,amit tanítottak az első félévben! :U

Tigris, tigris, csóvafény...

(#677) Steve-S válasza cellpeti (#676) üzenetére


Steve-S
tag

Hi! Itt az én verzióm, bár lehet nem a legtökéletesebb, nem vagyok valami nagy prof C-ből, de működik! Bár lehet már kicsit későn postolom. :B Azért remélem segítettem valamit.

#include <stdio.h>

int getline(char t[],int lim)
{
int i;
char c;
for(i=0; i<lim && (c=getchar())!=EOF && c!='\n'; i++)
t[i]=c;

return i;
}

main()
{
int s, i, osszeg, szamok;
char tomb[20];

printf("Adj meg egy 6 szamjegyu kodot: ");

while((s=getline(tomb,20))!=0)
{
osszeg=0;
szamok=0;

if(s>0 && s!=6)
{
printf("A kod nem 6 szambol all!\n");
printf("Adj meg egy 6 szamjegyu kodot: ");
continue;
}

if(s==6)
{
for(i=0; i<6; i++)
if(tomb[i]>='0' && tomb[i]<='9')
szamok++;
}

if(s==6 && szamok!=6)
{
printf("Nem jo a kod, csak szamokat tartalmazhat!\n");
printf("Adj meg egy 6 szamjegyu kodot: ");
continue;
}

if(szamok==6)
{
for(i=0; i<5; i++)
osszeg+=tomb[i]-'0';
}

if((osszeg%6)==(tomb[5]-'0'))
{
printf("Jo a kod!\n");
fflush(stdin);
printf("Adj meg egy 6 szamjegyu kodot: ");
}
else
{
printf("Nem jo a kod!\n");
fflush(stdin);
printf("Adj meg egy 6 szamjegyu kodot: ");
}
}
}

Set The World On Fire!!!

(#678) cellpeti


cellpeti
veterán

Sziasztok!

Mi az a parancs,amivel újra tudom indítani a programot??? :U

Tigris, tigris, csóvafény...

(#679) mmarta


mmarta
senior tag

Sziasztok!
C-ben:
Sakkos feladatoknál felrakunk fehér bábukat és egy fekete pl bástyát, akkor hogyan adjuk meg, íratjuk ki, hogy melyik fehér bábut üti pl a bástya?
Uez van lóra és futóra is.
A táblát ki tudom rajzolni, a bábuk is szépen felkerülnek, de az ütési irányokat nem tudom megadni lóra, bástyára, futóra, s a tetejébe még írja is ki -legalább egyet-, hogy melyiknél mit üt.

Köszönöm!

(#680) babyanigirl


babyanigirl
csendes tag

Én fél éve tanulok progrmaozást és most kaptam egy olyan házit amit nem nagyon tudok megoldani, és hát szeretnék tőletek egy kis segítséget kérni abban hogy hogy is kezdjem el és hogy kellene megcsinálnom a feladatomat! Bármilyen ötletet, segítséget szívesen fogadok!
Feladat: Írjon programot ami meghatározza egy szöveges állományban szereplő betűk gyakoriságát! Az eredményt írja ki az OUT.txt nevű állományba!

#include <stdio.h>
#pragma hdrstop
//---------------------------------------------------------------------------
#pragma argsused
int main(int argc, char* argv[])
{
FILE *fp=fopen("olvas.txt","r+" );
FILE *f=fopen("ir.txt", "w");
int szam;
char ch,kar;
printf("Az eredeti szoveg: ");
while (!feof(fp)){
ch=fgetc(fp);
printf("%c", ch);
}
printf("\nBetuszamolas vegrehajtasa: i=igen n=nem: ");
scanf("%c",&szam);
if (szam==105) {
fp=fopen("olvas.txt","r+" );
}
}
printf("\n") ;
system("pause");
fclose(fp);
fclose(f);
return 0;
sajnos csak eddig jutottam bekérem a szöveget kiíratom, de hogy utána az" if "után mit kéne írni azt nem tudom, mondjuk gondoltam vmi "sizeof" tömbös karakter számlálásra de vhogy az sem jött össze, mert nem tudtam tömbbe rakni. Látszik, sajnos nagyon amatőr vagyok benne.

Előre is köszi minden segítséget!
BabyAniGirl

(#681) Benmartin válasza babyanigirl (#680) üzenetére


Benmartin
senior tag

szia!

először is deklarálj egy darab tömböt, mondjuk úgy 100 elemet, de még annyi sem kell, ezután olvasd be soronként az inputot (fgets), mert így kevesebb a függvényhívás, majd iterálj végig a sor minden karakterén, vond le belőlük a nullás karaktert és növeld a darab tömb ezen indexét (darab[sor[i]-'0']++).

majd kiírásnál, ahol nem nulla a tömb értéke hozzáadod az indexhez a nullás karaktert és kiíratod a tömb értékét.

valahogy így.

(#682) Horgi


Horgi
csendes tag

Sziasztok!
Segítséget szeretnék kérni. A feladatom a következő:
Írjon egy ellenőrző programot, e-mail címek helyességének vizsgálatához

Tipp:a string végigolvasása, majd a talált speciális karakterek ('@' '.') drabszámának feljegyzése. A jó email-címben pontosan egy '@' és legalább egy '.' karakter van.
További ellenőrzés: a '@' nem lehet az első karakter, a '@' előtt és után nem állhat '.', '@' és '.' -ból egymás után nem lehet egynél több.

Szükséges libc függvények: printf()

A program a kapott paramétereket kizárólg a main függvény argc, argv[] változóin keresztül veheti át. Semmiféle getchar, scanf és egyéb felhasználói input nem elfogadható!

Előre is köszönöm a segítséget.

(#683) cellpeti válasza Horgi (#682) üzenetére


cellpeti
veterán

Szia!

Nem vagyok nagy programozó,de a @ előtt valahol a karakterláncba állhat "."
Mivel igen sok emilcím van,hogy xxx.XXX@xxx.com

[ Szerkesztve ]

Tigris, tigris, csóvafény...

(#684) Horgi válasza cellpeti (#683) üzenetére


Horgi
csendes tag

Talán úgy gondolta a tanár h közvetlenül előtte és utána

(#685) Jester01 válasza Horgi (#684) üzenetére


Jester01
veterán

Minden bizonnyal.
De milyen segítséget is szeretnél?

Jester

(#686) cellpeti


cellpeti
veterán

CS!

Mondja már el nekem valaki mit jelent ez pl:

if(!getline(szam1,30)) printf("Üres sort adtál be");

ha nem 0ad meg miért mégis üres sor lesz?

A getline 0-t ad vissza!

Akkor ha nem 0-at ad vissza getline(tehát nem üres sort) a szam1,30-re? :U
Mondom segg hülye vagyok hozzá és jövő kedden vizsgázok :O

A do{ - }while();

magyarul:

csináld{

utasítás

}amíg(feltétel);

A while-ba ugyanazt a feltélet adom meg,mint az elején? :U

[ Szerkesztve ]

Tigris, tigris, csóvafény...

(#687) Jester01 válasza cellpeti (#686) üzenetére


Jester01
veterán

Az mégis milyen getline függvény?

Jester

(#688) cellpeti válasza Jester01 (#687) üzenetére


cellpeti
veterán

int getline(char s[],int lim) {
int i,c;

for (i=0;i<lim && (c=getchar())!=EOF && c!='\n';++i) s[i]=c;
s[i]='\0';
while (c!=EOF && c!='\n') c=getchar();
return i;
}

Tigris, tigris, csóvafény...

(#689) babyanigirl


babyanigirl
csendes tag

#include <stdio.h>
#pragma hdrstop

//---------------------------------------------------------------------------

#pragma argsused
int main( int argc, char* argv[] )
{
int i;
FILE* f;
FILE *fp;
int count[256];

for(i=0; i<256; i++)
{
count[i] = 0;
}

f = fopen("input.txt", "rt");

while(1)
{
int c = fgetc(f);
if( c==EOF )
break;
if( c<0 || c>255 ) {
printf("hiba: nem vart betu");
return 3;
}

count[c] += 1;
}

fclose(f);

printf("gyakorisagok:\n");
for(i=0; i<256; i++)
{
if( count[i] < 1 )
continue;

printf("'%c': %d-szer\n", i, count[i]);
fp=fopen("output.txt", "a+");
fprintf(fp,"Gyakorisága az");
fprintf(fp,"%c betunek %d\n", i, count[i]);
fclose(fp);
}
system("pause");
return 0;
}

Mit gondoltok ez így jó?
Nem lehetne vhogy egyszerűbben megcsinálni?
BabyAniGirl

(#690) Fire/SOUL/CD válasza babyanigirl (#689) üzenetére


Fire/SOUL/CD
félisten

Hali!

Jó pár hozzáfűzni valóm lett volna, ezért inkább megírtam és a kommentekben elolvashatod.

Ha valami nem érthető, vagy más kérdésed is lenne, akkor nyugodtan írj, ahogy időm engedi válaszolok. (meg biztosan mások is)

Bocs de nem tudom berakni a kódot csak valami maszat lesz, még próbálkozom.

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)

(#691) Fire/SOUL/CD válasza babyanigirl (#689) üzenetére


Fire/SOUL/CD
félisten

Hali!

Na csak meg lett. Olyan kód volt a forrásba, amit a PH is használ formázásra...

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

//ha többször használod ugyanazt az értket, akkor azt célszerű így definiálni
//így megelőzhető az elgépelésekből adodó hibák
#define MAXCHAR 256

int CharCounter[MAXCHAR];

int main()
{
int i;
//a karakterek(így a betűk, számok, stb) egy byte-on tárolódnak az értékük 0-255 lehet
//ezért nem int típust, hanem unsigned char típust deklarálunk
unsigned char ch;
FILE * TextFileAsBinary;
FILE * OutputTextFile;

printf("Karakter-szamlalo\n\n");

//kinullázzuk a tömbünket. ez azonban jelen esetben teljesen felesleges
//mivel a fórdító automatikusan elvégzi ezt a feladatot. Természetesen ha
//többször kellene használni a tömböt, akkor szükséges lehet az "újranullázás"
for (i=0;i<MAXCHAR;CharCounter[i++]=0);

//minden fájl megnyitásakor kötelező a hibaellenőrzés!
if (!(TextFileAsBinary = fopen("input.txt","rb"))) {
fprintf(stderr,"Nem lehet megnyitni a fajlt...");
exit(-1);
}
//az fread függvény (jelen esetben) 1 darab, 1 byte hosszú adatot olvas be ch-be
//a korábban megnyitott "input.txt" 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(&ch,1,1,TextFileAsBinary)==1) CharCounter[ch]++;
fclose(TextFileAsBinary);

//kimeneti fájl megnyitása, mindig kérdés nélkül felülírodik!
if (!(OutputTextFile = fopen("output.txt","wt"))) {
fprintf(stderr,"Nem lehet irni a fajlt...");
exit(-1);
}
//itt azért 16-ról indítom a ciklust, mert ez alatt többnyire karakteres vezérlőkódok
//találhatók(return, tab, sipolás, visszatörlés stb), amikor ezeket beleírnád a fájlba
//akkor furcsán mutatna
for (i=16;i<MAXCHAR;i++) {
//csak akkor írok fájlba, ha előfordult az 'i' karakter, ha nem akkor felesleges
if (CharCounter[i]) {
fprintf(OutputTextFile,"Gyakorisága a(z) %c karakternek: %d\n",i,CharCounter[i]);
}
}
fclose(OutputTextFile);

return 0;
}

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)

(#692) kiskatus


kiskatus
csendes tag

Sziasztok!
Kaptam egy házi feladatot programozásból. Hétfőre kellene a feladat és nem megy a megoldása. Tudnátok segíteni? Mert ha nem lesz meg, megbuktatnak. Előre is köszönöm!
A feladat: Adott két szöveges fájl (angol szöveg). Hasonlítsa össze a tartalmukat. A különbséget írja ki egy harmadik fájlba.
Üdv.: kiskatus

(#693) Fire/SOUL/CD válasza kiskatus (#692) üzenetére


Fire/SOUL/CD
félisten

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)

(#694) kiskatus válasza Fire/SOUL/CD (#693) üzenetére


kiskatus
csendes tag

Szia!
Én is kérdeztem a Tanár Urat, hogy mire gondol és ezt írta e-mailban, hogy: Karakterenként olvassa be a fájlok tartalmát, majd a beolvasott karaktereket hasonlítsa össze! Ha különböznek, akkor írja ki őket egy harmadik fájlba!

(#695) cellpeti


cellpeti
veterán

Fire te kész vagy! :U :R :R

[ Szerkesztve ]

Tigris, tigris, csóvafény...

(#696) Fire/SOUL/CD válasza kiskatus (#694) üzenetére


Fire/SOUL/CD
félisten

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)

(#697) Fire/SOUL/CD válasza cellpeti (#695) üzenetére


Fire/SOUL/CD
félisten

Hali!

Bocsi, de ezt nem értem?!! Miért vagyok kész? :U

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)

(#698) kiskatus válasza Fire/SOUL/CD (#696) üzenetére


kiskatus
csendes tag

Nagyon szépen köszönöm!!!
Annyit kérhetnék, hogy megjegyzésben nagyjából írd oda, hogy mit miért.
Hátha megértem úgy énis. Mégegyszer nagyon köszönöm!

(#699) cellpeti válasza Fire/SOUL/CD (#697) üzenetére


cellpeti
veterán

Hát,mert mindent értesz,egyből írod pozitív értelemben értettem! :U

Tigris, tigris, csóvafény...

(#700) Fire/SOUL/CD válasza kiskatus (#698) üzenetére


Fire/SOUL/CD
félisten

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)

Copyright © 2000-2024 PROHARDVER Informatikai Kft.