[ 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 ;)