comparaison de deux fichiers

comparaison de deux fichiers - C++ - Programmation

Marsh Posté le 28-05-2006 à 22:03:58    

Bonjour bonjour, bon je galere un peu en c++, alors je demande de l'aide vu que jai pas vraiment trouver d'exemple pouvant m'aider sur le net.
 
je dois ecrire deux fonction pour comparer des fichiers, une en utilisant la commande strcmp et l'autre avec la commande diff (sous linux le tout)
 
la premiere fonction, en fait j'ai pas pu la testé (pas linux sur ce pc) donc dite si ca tient la route svp.

Code :
  1. bool fichiers_identiques_strchr(string fichier1, string fichier2)
  2. {
  3. bool equal=1;
  4. std::ifstream fich1( fichier1 );
  5. std::ifstream fich1( fichier2 );
  6. if (fich1 && fich2 )
  7.  {
  8.  std::string lignef1;
  9.  std::string lignef2;
  10.  while ( std::getline( fich1, lignef1) && std::getline( fich2, lignef2) && equal)
  11.   {
  12.   if (strcmp(lignef1,lignef2)!=0
  13.    {
  14.    equal = 0;
  15.    }
  16.   }
  17.  }
  18. return equal;
  19. }

jme suis inspiré de ce lien.
 
 
Et pour le DIFF je dois avouer que j'en ai aucune idée. J'ai pas trouvé d'exemple concret. Donc je suis ouvert a tte proposition.
 
 
 
Merci d'avance en esperant qu'on puisse m'aider, je vais continué a cherché de mon coté.

Reply

Marsh Posté le 28-05-2006 à 22:03:58   

Reply

Marsh Posté le 28-05-2006 à 22:22:43    

lei lyrken a écrit :

Bonjour bonjour, bon je galere un peu en c++, alors je demande de l'aide vu que jai pas vraiment trouver d'exemple pouvant m'aider sur le net.
 
je dois ecrire deux fonction pour comparer des fichiers, une en utilisant la commande strcmp et l'autre avec la commande diff (sous linux le tout)
 
la premiere fonction, en fait j'ai pas pu la testé (pas linux sur ce pc) donc dite si ca tient la route svp.

Code :
  1. bool fichiers_identiques_strchr(string fichier1, string fichier2)
  2. {
  3. bool equal=1;
  4. std::ifstream fich1( fichier1 );
  5. std::ifstream fich1( fichier2 );
  6. if (fich1 && fich2 )
  7.  {
  8.  std::string lignef1;
  9.  std::string lignef2;
  10.  while ( std::getline( fich1, lignef1) && std::getline( fich2, lignef2) && equal)
  11.   {
  12.   if (strcmp(lignef1,lignef2)!=0
  13.    {
  14.    equal = 0;
  15.    }
  16.   }
  17.  }
  18. return equal;
  19. }

jme suis inspiré de ce lien.
Merci d'avance en esperant qu'on puisse m'aider, je vais continué a cherché de mon coté.


 
Ligne 12, il te manque une parenthèse fermante
Personnellement j'utiliserais les mots clefs "false" et "true" plutôt que "0" et "1" pour une question de lisibilité
Sinon à vue de nez, il a l'air correct. Tu lis les 2 fichiers en parallèle ligne par ligne et tu compares chaque ligne donc c'est good
 

lei lyrken a écrit :

Et pour le DIFF je dois avouer que j'en ai aucune idée. J'ai pas trouvé d'exemple concret. Donc je suis ouvert a tte proposition.


Je suis un peu étonné qu'on te fasse utiliser une commande externe pour ton programme.
La seule chose qu'il me vienne à l'idée, c'est de faire un FILE *flux=popen("diff fic1 fic2", "r" ) et voir si un fgetc(flux) renvoie "EOF" => oui => identiques, non => différents
 
 
 
 


---------------
Vous ne pouvez pas apporter la prospérité au pauvre en la retirant au riche.
Reply

Marsh Posté le 28-05-2006 à 22:27:32    

std::ifstream fich1( fichier1 );
=>
std::ifstream fich1( fichier1.c_str() );
 
strcmp(lignef1,lignef2)
=>
strcmp(lignef1.c_str(),lignef2.c_str())
 
mais pourquoi ne pas utiliser l'operateur == ?
 
aussi ca se fait en une instruction avec std::equal
 

Code :
  1. if( fich1 && fich2 )
  2. {
  3.     equal = std::equal(std::istream_iterator<char>(fich1),
  4.                              std::istream_iterator<char>(),
  5.                              std::istream_iterator<char>(fich2));
  6. }

Reply

Marsh Posté le 29-05-2006 à 00:21:51    

Citation :

Je suis un peu étonné qu'on te fasse utiliser une commande externe pour ton programme.
La seule chose qu'il me vienne à l'idée, c'est de faire un FILE *flux=popen("diff fic1 fic2", "r" ) et voir si un fgetc(flux) renvoie "EOF" => oui => identiques, non => différents

en fait c plutot pour un cours de systeme :p
merci en tout cas pour le DIFF jvais voir ce que je peu faire
 

Citation :

mais pourquoi ne pas utiliser l'operateur == ?
 
aussi ca se fait en une instruction avec std::equal

paske je suis une bouse en c++ et donc j'ai trouvé strcmp, j'utilise strcmp ^^. Merci en tout cas pour le code

Message cité 1 fois
Message édité par lei lyrken le 29-05-2006 à 00:22:38
Reply

Marsh Posté le 29-05-2006 à 10:29:35    

lei lyrken a écrit :

en fait c plutot pour un cours de systeme :p
merci en tout cas pour le DIFF jvais voir ce que je peu faire


Regarde du cote de : execvp, wait

Reply

Marsh Posté le 29-05-2006 à 11:43:57    

lei lyrken a écrit :


Code :
  1. bool fichiers_identiques_strchr(string fichier1, string fichier2)
  2. {
  3. bool equal=1;
  4. std::ifstream fich1( fichier1 );
  5. std::ifstream fich1( fichier2 );
  6. if (fich1 && fich2 )
  7. {
  8.  std::string lignef1;
  9.  std::string lignef2;
  10.  while ( std::getline( fich1, lignef1) && std::getline( fich2, lignef2) && equal)
  11.  {
  12.   if (strcmp(lignef1,lignef2)!=0)
  13.   {
  14.    equal = 0;
  15.   }
  16.  }
  17. }
  18. return equal;
  19. }




Erreur de logique selon moi:
Si l'un des fichiers est plus volumineux que l'autre, le test s'arrete a la fin du fichier le plus court et s'ils ont ete identiques jusque la renvoie vrai alors que cela devrait renvoyer faux, non?  

Reply

Sujets relatifs:

Leave a Replay

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