Pagina 1 di 2 1 2 ultimoultimo
Visualizzazione dei risultati da 1 a 10 su 11
  1. #1

    [C] Confronto di due files

    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....
    codice:
    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 !!!!!!!!
    Anche se i due files che gli passo sono sue normalissimi files di testo ......
    Perche??!?!?!?!?
    (Ovviamente la funzione copia_file è corretta e da me implementata)
    Spero di essere stato chiaro.... Grazie a tutti...

  2. #2
    Utente bannato
    Registrato dal
    Oct 2010
    Messaggi
    1,219
    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:
    codice:
    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");

  3. #3
    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 .....

  4. #4
    Utente bannato
    Registrato dal
    Oct 2010
    Messaggi
    1,219
    Ma il file contiene stringhe con caratteri '\0' ?

  5. #5
    Il problema che il mio bel c1=fgetc(f1) restituisce sempre 9999 !!!!!!!!!!!
    Come puo' essere!?!?

  6. #6
    correggo....restituisce sempre 99

  7. #7
    Utente bannato
    Registrato dal
    Oct 2010
    Messaggi
    1,219
    Prova con fgets.

  8. #8
    Utente di HTML.it
    Registrato dal
    Jan 2011
    Messaggi
    1,469
    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)

  9. #9
    Utente bannato
    Registrato dal
    Oct 2010
    Messaggi
    1,219
    In c++ sarebbe veramente facile da scrivere.

  10. #10
    Utente di HTML.it
    Registrato dal
    Jan 2011
    Messaggi
    1,469
    Originariamente inviato da ramy89
    In c++ sarebbe veramente facile da scrivere.
    ma estremamente inefficiente da eseguire, se i file son grandi

    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++

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2024 vBulletin Solutions, Inc. All rights reserved.