PDA

Visualizza la versione completa : [C] Confronto di due files


Sogeking_87
22-09-2011, 22:32
Posto qui di seguito il codice di una mia funzione che dovrebbe confrontare due files dati da me in input e effettuarne una copia in caso che i due programmi sono diversi....


void contenuto(char *arga, char *argb){
int c1, c2, risposta,diff=0;
FILE *f1 = fopen(arga,"r");
FILE *f2 = fopen(argb,"r");
c1=fgetc(f1); c2=fgetc(f2);
printf("%s %s",arga,argb);
while(c1!=EOF || c2!=EOF){
printf("%d-----------%d",c1,c2);
if(c1!=c2){
printf("I due files non sono uguali cosa vuoi fare?!\n1 per copiare il file1 nel file2\n2 per copiare il file2 nel file1\n3 per ignorare\n");
scanf("%d",&risposta);
if(risposta==1){
copia_file(arga,argb);
fclose(f1);
fclose(f2);
diff=1;
break;
}
if(risposta==2){
copia_file(argb,arga);
fclose(f1);
fclose(f2);
diff=1;
break;
}
}
}
if(diff=0){
printf("I due files sono uguali\n");
fclose(f1);
fclose(f2);
}
}


Il programma dovrebbe aprire i due files e confrontarli lettera per lettera, il problema è che a run-time mi accorgo che il programma non entra mai nella condizione if(c1!=c2) .............. e grazie al printf("%d--------%d,c1,c2"); riesco a vedere che il mio programma stampa a ripetizione 9999--------99999 !!!!!!!!
:dottò: Anche se i due files che gli passo sono sue normalissimi files di testo ......
Perche??!?!?!?!? :confused:
(Ovviamente la funzione copia_file è corretta e da me implementata)
Spero di essere stato chiaro.... Grazie a tutti...

ramy89
22-09-2011, 22:45
Non mi soffermo a correggere il codice, ma ti dico che lo potresti fare con molto meno sforzo.Basta che leggi i due files e li metti ciascuno in un buffer di char, poi con la funzione strcmp vedi se le due stringhe sono uguali.
Ad esempio:


FILE *f1,*f2;
char buf1[100],buf2[100];
int i=1;
f1=fopen(arga,"r");
buf1[0]=fgetc(f1);
while(buf1[i-1]!=EOF)
{
buf1[i]=fgetc(f1);
i++;
}

/* idem per il secondo

if(strcmp(buf1,buf2)==0)
printf("Sono uguali\n");
else
printf("Non sono uguali");

Sogeking_87
22-09-2011, 22:51
Sbaglio o in questo modo dovrei fare due buffer immensi?!?!?!?
Il mio programma potrebbe leggere anche due files di 10.000 caratteri .....
Cmq non male come idea.... Potrei partizionare il lavoro in piu' riprese.....
Consigli in merito?! Grazie mille .....

ramy89
22-09-2011, 23:02
Ma il file contiene stringhe con caratteri '\0' ?

Sogeking_87
22-09-2011, 23:03
Il problema che il mio bel c1=fgetc(f1) restituisce sempre 9999 !!!!!!!!!!!
Come puo' essere!?!?

Sogeking_87
22-09-2011, 23:04
correggo....restituisce sempre 99

ramy89
22-09-2011, 23:21
Prova con fgets (http://www.cplusplus.com/reference/clibrary/cstdio/fgets/).

deleted_29
23-09-2011, 19:38
Ci sono vari approcci, a seconda di quanto vuoi sbatterti, e qual'è la probabilità che i file siano diversi.

modo 0: controlla la dimensione dei file. se son diverse => son già diversi i file e bon.

modo 1: calcoli gli hash dei due file e li confronti (es. MD5 più che sufficiente in questo caso, SHA1 più lento, whirlpool assolutamente esagerato).
questo va bene nel caso in cui i file normalmente variano poco

modo 2: carichi "a chunk" (a blocchi) i pezzi dei file in memoria, e confronti i due buffer. Questo va bene se i file cambiano, in generale, dalla parte iniziale

se i file sono minuscoli (minuscoli vuol dire qualche decina di megabyte) puoi tranquillissimamente allocare due vettori, caricare i file dentro e confrontarli.

se possono essere grandi (anche >2GB) tocca fare a blocchi.
Lascia perdere il confronto byte-per-byte, in quanto l'overhead dell'IO diventa elevatissimo (=leeeentooooo)

ramy89
24-09-2011, 00:21
In c++ sarebbe veramente facile da scrivere.

deleted_29
25-09-2011, 11:51
Originariamente inviato da ramy89
In c++ sarebbe veramente facile da scrivere. ma estremamente inefficiente da eseguire, se i file son grandi :fagiano:

Anche in C puoi definire una funzione "magica" confronta_due_file, ma questo non significa che "magicamente" il lavoro diventi meno complesso.
E' solo "zucchero sintattico", niente "magie" per C++

Loading