Vous ne trouvez pas de réponse à votre problème ? Alors posez la question dans le forum. Souvenez-vous qu'il n'y a jamais de question bête, mais rester dans l'ignorance parce que l'on n'ose pas poser une question, ça c'est une erreur !

SIMPLE COMPARAISON DE FICHIERS


Information sur la source

Catégorie :Fichiers / Disque Niveau : Débutant Date de création : 31/12/2002 Date de mise à jour : 31/12/2002 00:45:30 Vu : 2 887

Note :
Aucune note

Commentaire sur cette source (2)
Ajouter un commentaire et/ou une note

Description

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

  • #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;
  • }
#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++)
 

Commentaires et avis

signaler à un administrateur
Commentaire de LordBob le 31/12/2002 01:07:39

un grand merci, c exactement ce ke je voulai... merci...

signaler à un administrateur
Commentaire de trinitacs le 31/12/2002 16:07:26

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 &gt;&gt; Cette technique est très fiables donc beaucoup plus puissant je ne suis pas sur.

Ajouter un commentaire



Nos sponsors

Sondage...

CalendriCode

Septembre 2008
LMMJVSD
1234567
891011121314
15161718192021
22232425262728
2930     

Consulter la suite du CalendriCode



Développement réalisé par Nicolas SOREL (Nix) avec l'aide de : Cyril DURAND et Emmanuel BAÏSE, Merci à Vincent pour ses précieux conseils
CodeS-SourceS.com© Toute reproduction même partielle est interdite sauf accord écrit du Webmaster
CodeS-SourceS.com© est une marque déposée tous droits réservés
Temps d'éxécution de la page : 0,36 sec

Google Coop CodeS-SourceS Google Coop CodeS-SourceS


Certaines images présentes sur le site (notament certains avatars) sont issues des collections IconShock, donc si vous souhaitez utiliser ces icons vous devez les acheter, ne les copiez pas et ne utilisez pas dans vos sites et applications sans les avoir commandé.