Simple comparaison de fichiers

0/5 (2 avis)

Snippet vu 4 951 fois - Téléchargée 34 fois

Contenu du snippet

suite à la question du forum de LordBob, voici une petite source
traitant de longueur de fichier et parcours

Ce programme permet de comparer simplement deux fichiers :
Soit ils sont de longueur différentes et ils sont forcément différents
Soit ils sont de même longueur et le premier octet différent est donné
ainsi que sa position

n'utilise que du C++ standard !

Source / Exemple :


#include <fstream.h> 
#include <iostream.h>
#include <string.h>
// les entêtes modernes ne permettent pas d'utiliser ios::nocreate ni in1.fd()
// avec visual C++ 6 ... 
//#include <fstream> 
//#include <iostream>
//using namespace std;

int main(int argc, char** argv) {
	if (argc < 3) 
	{ cout << "usage compare fichier1 fichier2" << endl; return 1;}

char *fic1 = new char [strlen(argv[1]+1)];
strcpy(fic1,argv[1]);
char *fic2 = new char [strlen(argv[2]+1)];
strcpy(fic2,argv[2]);

unsigned char c1= 0, c2=0;
{
int cpt=0;
//tentons d'ouvrir les fichiers en se plaçant directement à la fin
//ceci pour mesurer facilement leur longueur
ifstream in1(fic1, ios::nocreate | ios::ate, filebuf::sh_read  ); 
if (in1.fd()==-1) { cout << fic1 << " non trouve" << endl; return 1;}
ifstream in2(fic2, ios::nocreate | ios::ate, filebuf::sh_read  ); 
if (in2.fd()==-1) { cout << fic2 << " non trouve" << endl; return 1;}

//vérification des longueurs
  streampos l1 = in1.tellg(); // la position est égale à la taille du fichier
  in1.seekg(0, ios::beg);//retour au départ
  streampos l2 = in2.tellg();
  in2.seekg(0, ios::beg);

if (l1 != l2) 
{
	cout << "fichiers de longueurs differentes" << endl;
	return 0;
}
	cout << "fichiers de longueurs identiques = " << l1 << endl;
bool bIdem=true;
//lecture
while ( ( in1 >> c1) && ( in2 >> c2 ) )
{
	cpt++;
	if (c1!=c2) 
	{
		cout << "fichiers differents : octet no: " << cpt << endl;
//pour fichiers binaires, on donne les valeurs hexadécimales
//		cout << hex << (int)c1 << " => " << (int)c2 << endl;
//pour fichiers textes on donne simplement les caractères
		cout << c1 << " => " << c2 << endl;
		bIdem=false;
		break;
	}
} // Le Destructeur ferme in 
	if (bIdem) cout << "fichiers identiques" << endl;
}
return 0;
}

Conclusion :


il y a beaucoup plus puissant ... en DOS : fc, comp, diskcomp
et en Windows : windiff (dans les outils livrés avec visual C++)

A voir également

Ajouter un commentaire Commentaires
trinitacs
Messages postés
249
Date d'inscription
mardi 16 juillet 2002
Statut
Membre
Dernière intervention
7 août 2003
2
31 déc. 2002 à 16:07
Et juste pour le plaisir la version en C qui est presque pareil:

fseek(stream, 0L, SEEK_END );
len = ftell( stream );

"il y a beaucoup plus puissant "
vieuxlion >> Cette technique est très fiables donc beaucoup plus puissant je ne suis pas sur.
cs_LordBob
Messages postés
2865
Date d'inscription
samedi 2 novembre 2002
Statut
Membre
Dernière intervention
11 mai 2009
10
31 déc. 2002 à 01:07
un grand merci, c exactement ce ke je voulai... merci...

Vous n'êtes pas encore membre ?

inscrivez-vous, c'est gratuit et ça prend moins d'une minute !

Les membres obtiennent plus de réponses que les utilisateurs anonymes.

Le fait d'être membre vous permet d'avoir un suivi détaillé de vos demandes et codes sources.

Le fait d'être membre vous permet d'avoir des options supplémentaires.