[C++] Comparer 2 fichiers

Comparer 2 fichiers [C++] - C++ - Programmation

Marsh Posté le 15-04-2002 à 00:20:06    

Bonjour,
 
j'aimerais pouvoir comparer 2 fichiers texte, plus globalement 2 fichiers, voire les différences à l'octet prêt.
Voici ce que j'ai tapé :
 
[code]
OpenDialog1->InitialDir = "C:\\";
OpenDialog1->Title = "Exécutable texte original";
if (OpenDialog1->Execute())
 {
 AnsiString fich_org = OpenDialog1->FileName;
 FILE *fichier_org;
 bool fichier_org_ouvert = false;
 char buf_org[255];
 
 OpenDialog1->InitialDir = "C:\\";
 OpenDialog1->Title = "Exécutable texte #2";
 if (OpenDialog1->Execute())
  {
  AnsiString fich_numd = OpenDialog1->FileName;
  FILE *fichier_numd;
  bool fichier_numd_ouvert = false;
  char buf_numd[255];
 
  if ((fichier_org = fopen(fich_org.c_str(), "rb" )) == NULL)
   ShowMessage("Impossible d'ouvrir le fichier " + ExtractFileName(fich_org));
  else
   fichier_org_ouvert = true;
 
  if ((fichier_numd = fopen(fich_numd.c_str(), "rb" )) == NULL)
   ShowMessage("Impossible d'ouvrir le fichier " + ExtractFileName(fich_numd));
  else
   fichier_numd_ouvert = true;
 
  if (fichier_org_ouvert && fichier_numd_ouvert)
   {
   int i=0;
   while (! feof(fichier_org))
    {
    fseek(fichier_org, i, SEEK_SET);
    fread(buf_org, 1, 1, fichier_org);
 
    fseek(fichier_numd, i, SEEK_SET);
    fread(buf_numd, 1, 1, fichier_numd);
 
    if (buf_org != buf_numd)
     {
     Memo2->Lines->Add(buf_numd); //affiche les !=
     }
    i++;
    }
   }
 
  fclose(fichier_org);
  fclose(fichier_numd);
 
  StatusBar1->Panels->Items[0]->Text = buf_org[30] + buf_numd[30];
  }
 }
 
mais mon Memo2 contient
 

uô
êô
sô
 ô
 ô
 ô
(ô
Pô
oô
rô
tô
uô
gô
uô
eô
sô
eô
)ô
ô etc.......
 
même quand mes 2 fichiers texte sont identiques !!!
Où ai-je fait l'erreur à votre avis ?
N'oubliez pas que je voudrait comparer tout types de fichiers, à l'octet prêt ...
 
merci d'avance :hello:


---------------
Visitez mon site : http://www.jujubarbare.linux-fan.com
Reply

Marsh Posté le 15-04-2002 à 00:20:06   

Reply

Marsh Posté le 15-04-2002 à 01:54:16    

buf_org et buf_numd sont définis comme des tableaux de char, donc des pointeurs.
Donc, le 'if (buf_org != buf_numd)' compare 2 adresses, qui sont forcément différentes.
Il faudrait comparer le contenu de ces 2 tableaux.

Reply

Marsh Posté le 15-04-2002 à 09:53:50    

bjbebert a écrit a écrit :

buf_org et buf_numd sont définis comme des tableaux de char, donc des pointeurs.
Donc, le 'if (buf_org != buf_numd)' compare 2 adresses, qui sont forcément différentes.
Il faudrait comparer le contenu de ces 2 tableaux.  




oky merci beaucoup, je suis cette piste !!!
 
@++ :hello:


---------------
Visitez mon site : http://www.jujubarbare.linux-fan.com
Reply

Marsh Posté le 15-04-2002 à 10:00:41    

compare le contenu des 2 buffers avec strcmp, ca devrait suffire je pense.

Reply

Marsh Posté le 15-04-2002 à 19:13:16    

KarLKoX a écrit a écrit :

compare le contenu des 2 buffers avec strcmp, ca devrait suffire je pense.  




salut, j'ai fait if (buf_org[0] != buf_numd[0])
 
ça marche, masi je suis trop con j'ai pas pensé à strcmp()...
 
merci à vous 2 ;)


---------------
Visitez mon site : http://www.jujubarbare.linux-fan.com
Reply

Marsh Posté le 16-04-2002 à 18:17:14    

Tu dis que tu veux comparer 2 fichiers quelconques. Or, strcmp compare des chaines de caractères (terminées par un 0).
 
Comment tu fais si ton fichier contient un octet à 0, ou que tes buffer de 255 octets ne se terminent pas par un 0 :ange:  
 
J'ai l'impression qu'il faudrait plutot utiliser des buffers de type void *, et comparer 'à la main' (une boucle).
 
Edit : le 'if (buf_org[0] != buf_numd[0])', il ne compare que le premier octet de chaque buffer, pas l'ensemble.

 

[jfdsdjhfuetppo]--Message édité par bjbebert--[/jfdsdjhfuetppo]

Reply

Marsh Posté le 16-04-2002 à 18:31:36    

bjbebert a écrit a écrit :

J'ai l'impression qu'il faudrait plutot utiliser des buffers de type void *, et comparer 'à la main' (une boucle).


ou mieux, utiliser memcmp() au lieu de roue_version_447875454().

Reply

Marsh Posté le 16-04-2002 à 19:49:29    

youdontcare a écrit a écrit :

ou mieux, utiliser memcmp() au lieu de roue_version_447875454().  



Oui, on peut aussi :D

Reply

Marsh Posté le 16-04-2002 à 22:09:30    

youdontcare a écrit a écrit :

ou mieux, utiliser memcmp() au lieu de roue_version_447875454().  




Non, on utilise std::mismatch car on fait du c++ de haut vol :-)

Reply

Marsh Posté le 16-04-2002 à 22:14:44    

kenshiro182 a écrit a écrit :

 
Non, on utilise std::mismatch car on fait du c++ de haut vol :-)


Nan mais ca va la tete :pt1cable:

Reply

Marsh Posté le 16-04-2002 à 22:14:44   

Reply

Marsh Posté le 16-04-2002 à 22:40:45    

bjbebert a écrit a écrit :

Nan mais ca va la tete :pt1cable:  




Attends, j'appelle Bjarne :-)  
Bjarne, vient m'aiderrrrr  !!!

Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed