Newsgroup: it.comp.lang.c
Titolo: Confronto due file

Salve, ho un problemino.
Dovrei fare un confronto fra due file e vedere se sono uguali o diversi.ò
Ho messo giù questo codice, funziona, però ogni tanto da qualch problemino..
Non esiste un metodo + affidabile ([OT]anche in C++ o con STL)???
#include <stdio.h>
#define TRUE  1
#define FALSE  0
int fc (char *file1, char *file2)
{
 FILE *tmp1,*tmp2;
 char c,d;
 // apertura dei 2 files
 if ((tmp1 = fopen (file1,"rb"))==NULL)
  return FALSE;
 if ((tmp2 = fopen (file2,"rb"))==NULL)
  return FALSE;
 while ((!feof(tmp1))||(!feof(tmp2))) {
  c=fgetc(tmp1);
  d=fgetc(tmp2);
  if (c!=d)
   return FALSE;
 }
 fclose(tmp1);
 fclose(tmp2);
 return TRUE;
}
Grazie
--
Timothy Redaelli

 while ((!feof(tmp1))||(!feof(tmp2))) {
"Funziona" e' una parola grossa.
La condizione del while e' sbagliata, perche' ti devi
fermare alla prima fine del file trovata.  Se hai due file,
l'uno + grande dell'altro, finisci col leggere da quello +
corto, anche se hai raggiunto gia' da un bel pezzo la fine.
-- 
Andrea Laforgia (
walkie...@libero.it
)
"Usenet is a strange place" [Dennis Ritchie]

L'errore  ti  è già  stato  detto,  se  vuoi migliorare  il  programma
potresti dare uno sguardo al  codice di 'diff' (fa parte del pacchetto
diffutils, lo trovi su 
http://www.gnu.org/directory/diffutils.html
).
ciao,
nico

"Timothy" ha scritto
: Salve, ho un problemino.
: Dovrei fare un confronto fra due file e vedere se sono uguali o diversi.ň
: Ho messo giů questo codice, funziona, perň ogni tanto da qualch
problemino..
: Non esiste un metodo + affidabile ([OT]anche in C++ o con STL)???
:
: #include <stdio.h>
:
: #define TRUE  1
: #define FALSE  0
:
Oltre all'errore nella condizione del while, quando
trovi una differenza tra i due file restituisci FALSE,
ma non chiudi i FILE. In c++ se tu usassi gli stream
sarebbe il distruttore degli oggetti a preoccuparsi
di chiuderli quando non lo fai tu esplicitamente.
Per ovviare, potresti fare qualcosa tipo:
: int fc (char *file1, char *file2)
: {
:
:  FILE *tmp1,*tmp2;
:  char c,d;
   int ret = TRUE;
:
:  // apertura dei 2 files
:  if ((tmp1 = fopen (file1,"rb"))==NULL)
:   return FALSE;
:
:  if ((tmp2 = fopen (file2,"rb"))==NULL)
   {
    fclose( tmp1 );
:   return FALSE;
   }
:
:  while ((!feof(tmp1))||(!feof(tmp2))) {
:
:   c=fgetc(tmp1);
:   d=fgetc(tmp2);
:   if (c!=d)
    {
      ret = FALSE;
      break;
    }
:  }
:
:  fclose(tmp1);
:  fclose(tmp2);
   return ret;
: }
:
ciao
Massimo

 ma non chiudi i FILE. 
Uscendo dal programma  con exit() (o con return, e`  la stessa cosa) gli
stream aperti vengono automaticamente fflush()ati e chiusi.
ciao
Kronos
-- 
Home: 
http://kronoz.cjb.net
"It is more complicated than you think"
                -- The Eighth Networking Truth from RFC 1925

 ha scritto:
: > Oltre all'errore nella condizione del while, quando
: > trovi una differenza tra i due file restituisci FALSE,
: > ma non chiudi i FILE.
:
: Uscendo dal programma  con exit() (o con return, e`  la stessa cosa) gli
: stream aperti vengono automaticamente fflush()ati e chiusi.
:
L'OP aveva postato una funzione, che come tale potrebbe essere chiamata
piu` volte in un servizio/demone destinato a girare a lungo.
Ovviamente nel caso di un programmino non vi e` problema, ma in tal caso
sarebbe coerente non chiamare mai fclose.
ciao
Massimo


Secondo me (non l'ho provato :) )
#include <stdio.h>
int fc(char* file1, char* file2)
{FILE *tmp1,*tmp2;
 int c,d;
 // apertura dei 2 files
 if((tmp1 = fopen (file1,"rb"))==NULL)
   return -1;
 if((tmp2 = fopen (file2,"rb"))==NULL)
  return -1;
 do{ c=fgetc(tmp1);
       d=fgetc(tmp2);
     }while(c!=EOF && d!=EOF && c==d);
 
 if(c==d && d==EOF) return 0; //sono uguali
 else if(c==EOF && d!=EOF) return 1;
        //file 1 č contenuto nel file 2
 else if(d==EOF && c!=EOF) return 2;
       //file 2 č contenuto nel file 1
 else return 3; //sono diversi
 fclose(tmp1);
 fclose(tmp2);
}
Saluti

On Mon, 28 Jan 2002 19:13:22 GMT, j...@jk.jk (jk) wrote:
#include <stdio.h>
int fc(char* file1, char* file2)
{FILE *tmp1,*tmp2;
 int c,d;
 // apertura dei 2 files
 if((tmp1 = fopen (file1,"rb"))==NULL)
   return -1;
 if((tmp2 = fopen (file2,"rb"))==NULL)
{  return -1;  fclose(tmp1); }
 do{ c=fgetc(tmp1);
       d=fgetc(tmp2);
     }while(c!=EOF && d!=EOF && c==d);
 fclose(tmp1); //è meglio?
 fclose(tmp2);
 
if(c==d && d==EOF) return 0; //sono uguali
 else if(c==EOF && d!=EOF) return 1;
        //file 1 è contenuto nel file 2
 else if(d==EOF && c!=EOF) return 2;
       //file 2 è contenuto nel file 1
 else return 3; //sono diversi
}
RiSaluti

 wrote:
La domanda che vorrei fare: si può aprire lo stesso file in lettura
due volte con due puntatori a file?
 
Questo l'ho provato:
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
int fc(char* file1, char* file2)
{FILE * tmp1, * tmp2;
 register int c,d;
 // apertura dei 2 files
 if( (tmp1=fopen(file1,"rb"))==NULL)
                            return -1;
 if(strcmp(file1, file2)==0) 
          {fclose(tmp1); return 0; }
 
 if((tmp2=fopen(file2,"rb"))==NULL )
         {fclose(tmp1); return -1;}
 do{ c=getc(tmp1);
     d=getc(tmp2);
   }while(c!=EOF && d!=EOF && c==d);
 fclose(tmp1); //è meglio?
 fclose(tmp2);
 
 if(c==d && d==EOF) return 0; //sono uguali
 else if(c==EOF) return 1;
        //file 1 è contenuto nel file 2
 else if(d==EOF) return 2;
