|
[ cyber_killer @ 20.03.2007. 20:03 ] @
| Evo opet se javljam sa zadatkom.Napraviti moram program koji pročita 2 fajla i onda izpise linije u kojeme se razlikujeju.Osim toga mi mora jos izpisati broj linije u kojem se razlikuju.Duzina linije mora biti najvise 80 znakova.
Evo sta sam ja piso,al mi to neradi kako treba.
Code: #include<stdio.h>
void razlicito(char *lin1, char *lin2, int brojL)
{
if( strcmp (lin1,lin2) < 0 || strcmp (lin1,lin2) > 0 )
printf( "%d<%s\n%d>%s\n", brojL, lin1, brojL, lin2);
}
main(int argc, char *argv[])
{
FILE *dat1,*dat2;
char lin1 [80];
char lin2 [80];
int i=0;
if(argc != 3)
{
exit(0);
}
if( (dat1=fopen(argv[1], "r") )==NULL ){
printf("Error u otvaranju datoteke %s\n ", argv[1] );
}
if( (dat2=fopen(argv[2],"r") )==NULL ){
printf("Error u otvaranju datoteke %s \n", argv[2]);
}
while( (fgets(lin1,80,dat1) != NULL) && (fgets(lin1,80,dat1) != NULL));
{
razlicito(lin1,lin2,i);
i++;
}
return 0;
}
|
[ SuPeR_MaSteR @ 21.03.2007. 01:15 ] @
Nisam puno citao tvoj kod, sklepao sam nesto na brzinu pa odoh da spavam:
Code:
#include <stdio.h>
#include <string.h>
#define DUZ 80
int main(int argc, char* argv[])
{
FILE *dat1, *dat2;
char lin1[DUZ], lin2[DUZ];
int brLinije = 1;
if (argc != 3)
return -1;
dat1 = fopen(argv[1],"r"), dat2 = fopen(argv[2],"r");
if (dat1 == NULL || dat2 == NULL)
return -1;
for (brLinije = 1; !feof(dat1) && !feof(dat2); brLinije++)
if (strcmp(fgets(lin1, DUZ, dat1), fgets(lin2, DUZ, dat2)) != 0)
printf("Linija broj %d:\n%sse razlikuje od:\n%s\n", brLinije, lin1, lin2);
fclose(dat1), fclose(dat2);
}
(zasad radi) :)
[ cyber_killer @ 21.03.2007. 11:21 ] @
Radi na pola koliko ja vidim.Na kraju program crkne :D i kad dadnem npr.prve tri linije da su jednake,onda dadnem 2 linije prazne i u drugoj datoteki 2 prazne linije i onda nakon toga jos jednu liniju,bi trebo izpisati da se razlikuje ali ne izpise.
[ Mali Misha @ 21.03.2007. 12:44 ] @
Znači, sajber, u while pri svakom prolazu čitaš po dve linije od prvog fajla umesto po jednu od prvog i drugog - odatle bi poticao problem poređenja. Ono bitnije je da ti ne treba tačka-zarez nakon while. Uz prvu prepravku, uklanjanje ovog znaka će rešiti i problem brojenja linija.
[ cyber_killer @ 22.03.2007. 15:53 ] @
Ja te nisam bas dobro razumio.De mi prepravi u kodi da vidim,sta si mislio.Ovaj program od SuPeR_MaSteR fakticki radi ono sto bi trebo,jedino kazem kad dadnem vise linija onda smrzne.
[ SuPeR_MaSteR @ 23.03.2007. 11:01 ] @
Ne znam zasto moj prethodni kod ne radi, logika je ok ali izgleda da funkcija strcmp() ne poredi kako treba bele znakove ili je problem do fgets() (?!)
@cyber_killer, testiraj ovaj kod, kod mene je sve ispravno:
Code:
#include <stdio.h>
#include <string.h>
#define DUZ 80
void poredi(char* lin1, char* lin2, int brLinije);
int main(int argc, char* argv[])
{
FILE *dat1, *dat2;
char lin1[DUZ], lin2[DUZ];
int brLinije = 1;
dat1 = fopen(argv[1],"r"), dat2 = fopen(argv[2],"r");
if (dat1 == NULL || dat2 == NULL)
return -1;
for (brLinije = 1; !(feof(dat1) || feof(dat2)); brLinije++)
poredi(fgets(lin1, DUZ, dat1), fgets(lin2, DUZ, dat2), brLinije);
fclose(dat1), fclose(dat2);
}
void poredi(char* lin1, char* lin2, int brLinije)
{
int d1 = strlen(lin1), d2 = strlen(lin2);
if (d1 != d2)
printf("Linija broj %d:\n%s se razlikuje od:\n%s\n", brLinije, lin1, lin2);
else
{
int i;
for (i = 0; i < d1 && lin1[i] == lin2[i]; i++);
if (i != d1)
printf("Linija broj %d:\n%s se razlikuje od:\n%s\n", brLinije, lin1, lin2);
}
}
[ cyber_killer @ 25.03.2007. 12:26 ] @
Radi tvoja koda,al za moje znanje malo previse komplicirana.Ponavljam za moje znanje.Evo ja sam napravio ovu kodu.Sve radi dobro osim toga da mi sjece prvo slovo.Neznam to ispraviti.Evo npr.imam datoteku1 i datoteku2.U datoteki1 imam sljedeci string: asdfghjkl (prva linija), yxcvb (druga linija ) qwert (treca linija ).
U datoteki2 imam npr. afdsfasdf (prva linija), jfdsfidffd (druga linija), dfefere (treca linija). E sad moj progam izpise sve razlike ali mi u izpisu odsjece prvo slovo.
Onda me jos zanima npr.kad dadnem u datoteki1 dodatni 5 prazni linija i u datoteki2 dadnem u 5 liniju jedan string.Tude je isto razlika koliko ja razumijem.Trebo bi izpisati razliku al mi ne izpise razlike.
Code: #include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define DUZ 80
int main() {
FILE *dat1=fopen("dat1.txt", "r");
FILE *dat2=fopen("dat2.txt","r");
char lin1[DUZ];
char lin2[DUZ];
int brLin=1;
char *linija1, *linija2;
do {
linija1=fgets(lin1, DUZ, dat1);
linija2=fgets(lin2, DUZ, dat2);
if(strcmp(linija1,linija2)!=0)
{
printf("-------------------------------------------------------------------------------\n");
printf("Br. linije: %d\n", brLin);
printf("datoteka 1: %s\n", linija1);
printf("datoteka 2: %s\n", linija2);
brLin++;
}
else if(strcmp(linija1,linija2)==0)
brLin++;
else
brLin++;
} while(fgetc(dat1)!=EOF && fgetc(dat2)!=EOF);
fclose(dat1); fclose(dat2);
return 0;
}
[ SuPeR_MaSteR @ 25.03.2007. 13:21 ] @
Gubljenje prvog slova se desava zbog uslova u while petlji:
Code: while(fgetc(dat1)!=EOF && fgetc(dat2)!=EOF)
Tu se ucitava iz obe datoteke po jedan karakter i file pointer se inkrementira za 1, tako da pri sledecem iscitavanju gubis ta prva slova.
Umesto toga bolje je da koristis funkciju feof() koja sluzi kao indikator kraja fajla:
Code: while ( ! (feof(dat1) || feof(dat2)) ) /* ako je kraj bar jedne datoteke rezultat je logicka neistina i ne izvrsava se telo petlje
Vise o funkciji feof() nalazi se na adresi:
http://www.cplusplus.com/reference/clibrary/cstdio/feof.html
A u ovom delu koda:
Code:
if(strcmp(linija1,linija2)!=0)
{
........
}
else if(strcmp(linija1,linija2)==0)
brLin++;
else
brLin++;
Poredjenje if(strcmp(linija,linija2) == 0) ti nije potrebno jer ako povratna vrednost funkcije nije razlicita od nule (1 uslov), logicno je da je onda jednaka nuli, nema treceg.
[ cyber_killer @ 25.03.2007. 14:45 ] @
Hvala ti za pomoc.
[ SuPeR_MaSteR @ 26.03.2007. 23:41 ] @
No frks ;)
Copyright (C) 2001-2025 by www.elitesecurity.org. All rights reserved.
|