IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

C++ Discussion :

comparer deux fichiers


Sujet :

C++

  1. #1
    Membre à l'essai
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2015
    Messages
    23
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Tunisie

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Industrie

    Informations forums :
    Inscription : Février 2015
    Messages : 23
    Points : 11
    Points
    11
    Par défaut comparer deux fichiers
    bonsoir , , tout d'abord je me présente ; je suis un élève ingénieur informatique industrielle , je suis entrains de développer un programme c++ (.dll) qui me permet de créer un système d'automatisation ensuite et je suis bloqué dans une tache de ce projet.
    quand mon dll tombe "offline" je doit stoppé tout les tache en cours et quand il revient "OnLine" il suffit de tester s'il y a modification au niveau du configuration donc j'ai créer 2 fichiers l'un pour enregistrer l'ancien config et l'autre pour la nouvelle config après l'offline , ensuite j'ai comparé les deux fichiers si pas de modification donc pas de problème si non je doit informer l’utilisateur ; donc je veux récupérer seulement les lignes ou il y a la modification dans un tableau et l'envoyer ensuite (cette tache doit réaliser avec ZMQ et pour les testes mon utilisateur c'est le workflow ) , et j'attend la repense , si l'utilisateur confirme que c'est lui qui a fait ces modification donc rien ne ce passe juste je doit vider le fichier "new config" sinon je doit remplacer les nouveaux valeurs du config par les anciens .
    voila c'est mon code , je demande votre aide parce que j'ai des contraintes de temps et merci d'avance.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
     
    #include "stdafx.h"
    #include <iostream>
    #include <string>
    #include <fstream>
     
    void Default_Config()
    {
    	fstream fichier("default config.txt", ios::out | ios::trunc);
    	if (fichier)
    	{
    		for (int i = 0; i < 15; i++)
    		{
    			int a = 5;  // c'est valeur juste pour tester
    			a = a*i;
    			fichier << a << endl;
    		}
    		fichier.close();
    	}
    	else
    				cerr << "Impossible d'ouvrir le fichier !" << endl;
     
    }
     
    void new_config()
    	{
    		fstream fichier("new config", ios::out | ios::trunc);
    		if (fichier)
    		{
    			for (int i = 0; i < 15; i++)
    			{
    				int a = 6;
    				a = a*i;
    				fichier << a << endl;
    			}
    			fichier.close();
    		}
    		else
    			cerr << "Impossible d'ouvrir le fichier !" << endl;
     
    	}
     
    std::string fichiers_identiques_strcmp(string fichier1, string fichier2)
    {
    	std::string a = "";
    	int position = 0;
    	char str1[256];
    	char str2[256];
    	fstream file1(fichier1, ios::in);
    	fstream file2(fichier2, ios::in);
    	if (!file1 || !file2)
    	{
    		perror("Impossible d'ouvrir les fichiers");
    		exit(1);
    	}
    	while (file1 >> str1 && file2 >> str2)
    	{
    		position++;
    			if (strcmp(str1, str2) != 0)
    			{	
    				a +=str2;
    			}
     
    	}
    	file1.close();
    	file2.close();
    	return a;
    }
     
    int main()
    {
     
    	string fiche1 = "default config.txt";
    	string fiche2 = "new config.txt";
    	/*fstream file(fiche1, ios::out);*/
    	std::string c;
    	int b;
    	Default_Config();
    	Default_Config1();
     
    		if (lineNumber(fiche1) == lineNumber(fiche2))
    		{
    			c = fichiers_identiques_strcmp("default config.txt", "new config.txt");
    			/*return a;*/
    		}
    		/*else c = false;*/
     
    		b = lineNumber(fiche1);
    		string s;
    		fstream file;
    		file.open(fiche1, ios::out);
    		file << "" << endl;
    		file.close();
     
     
     
    	return 0;
    }
    petite remarque : dans le cas réel j'ai 831 lignes a tester et chaque ligne sera afficher comme ça :
    PC: XXX PcV:yyyy
    PC: program code
    PcV: program code value
    XXX: 001 => 831
    yyyy : la valeur

  2. #2
    Nouveau membre du Club
    Femme Profil pro
    Développeur 3D
    Inscrit en
    Août 2014
    Messages
    23
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Gard (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Développeur 3D

    Informations forums :
    Inscription : Août 2014
    Messages : 23
    Points : 33
    Points
    33
    Par défaut
    quelle est ta question exactement?
    tu veux qu'on corrige ton code? est-ce qu'il ne marche pas? ou est-ce qu'il n'est pas optimisé?

  3. #3
    Expert éminent sénior
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Février 2005
    Messages
    5 073
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 52
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Conseil

    Informations forums :
    Inscription : Février 2005
    Messages : 5 073
    Points : 12 119
    Points
    12 119
    Par défaut
    ".dll", c'est pas un programme "normalement".
    C'est une bibliothèque à chargement dynamique sur système Windows.
    Une bibliothèque n'est ni Online ni OffLine, cela ne veut strictement rien dire.

    Votre système, sur le principe est simple mais un peu archaïque. On ajoute un espace et hop, o, enquiquine l'utilisateur.
    Il faut ajouter un peu de sémantique à tout cela.
    Vous devez avoir une classe configuration et un opérateur de comparaison, un opérateur de sérialisation (<<) et d' désérailisation (>>).
    Avec ces trois opérateurs et cette classe votre code sera bien plus simple et souple.

    Le code qui vous nous montrez ne ressemble à rien, c'est quoi "lineNumber" ?, c'est quoi l'algorithme (les commentaires et les noms des variables, des méthodes, ... c'est pas juste pour faire joli).

  4. #4
    Membre chevronné

    Homme Profil pro
    Développeur informatique
    Inscrit en
    Avril 2013
    Messages
    610
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Finance

    Informations forums :
    Inscription : Avril 2013
    Messages : 610
    Points : 1 878
    Points
    1 878
    Billets dans le blog
    21
    Par défaut
    @Bacelar: il ne faut pas être trop dur avec qqn qui a une dead-line...

    Cela dit, en effet, si tu as un fichier de configuration, je suppose que tu peux en tirer un objet Configuration pour l'utiliser ensuite?
    Auquel cas comparer deux Configuration peut être plus simple que de comparer deux fichiers...

  5. #5
    Membre à l'essai
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2015
    Messages
    23
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Tunisie

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Industrie

    Informations forums :
    Inscription : Février 2015
    Messages : 23
    Points : 11
    Points
    11
    Par défaut
    mon problème est j'ai des contraintes de temps et plusieurs autres tache et je demande vos aide dans cette partie ; comme vous voyez dans le code j'ai une fonction qui doit créer le fichier qui enregistre la configuration par défaut , autre fonction pour la nouvelle configuration après l'offline (dans mon cas je dis offline c'est à dire si je détecte une coupure de courant, une tel sorte de piratage, mon appareil est dans le mode programmation...etc) l'autre fonction pour la comparaison , si je trouve les deux fichiers sont les mêmes donc pas de modification au niveau du configuration mais si on a un différence de doit informer l'utilisateur , dans cette étape j'ai 2 cas : - l'utilisateur confirme cette nouvelle config ==> pas de problème juste le contenu de fichier "New config" va être copié dans le fichier "Default config"
    -si c'est pas le cas (l'utilisateur m'a dis qu'il ne connait plus cette config donc c'est pas lui qui a modifier la modification ) , il suffit de reprendre l'ancien configuration qui est déjà enregistrer dans mon fichier avec le code et le valeur (fonction
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
     void set_program_code(int PC,int VAl)
    @stendhal666: dans mon cas on ne peut plus comparer les deux configuration car après l'offline on trouve juste la nouvelle configuration donc j'ai besoins d'un fichier qui va joue le rôle du "back-up"
    j’espère que tous est clair maintenant !!

    mon problème : 1 je veux détecter les changements lignes par lignes et les envoyer a l'utilisateur dans un tableau par exemple , j'arrive pas a faire cette tache.
    2: ma fonction va prendre comme input les variable de ce tableau PC et Val.
    merci pour votre attention

  6. #6
    Membre chevronné

    Homme Profil pro
    Développeur informatique
    Inscrit en
    Avril 2013
    Messages
    610
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Finance

    Informations forums :
    Inscription : Avril 2013
    Messages : 610
    Points : 1 878
    Points
    1 878
    Billets dans le blog
    21
    Par défaut
    Alors quelque chose comme ça devrait faire l'affaire:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    #include <set>
    #include <fstream>
    #include <algorithm> // set_symmetric_difference
    #include <functional> // equal_to
     
    void fileToMultiset(std::fstream& from, std::multiset<std::string>& to) { // met les lignes du fichier dans un vecteur
      for (std::string line; std::getline(from, line); )
          to.insert(line);
    }
     
    std::vector<std::string> difference(std::multiset<std::string>& fOld, std::multiset<std::string>& fNew) { // retourne les lignes présentes dans new qui ne sont pas dans Old
      std::vector<std::string> result;
      std::set_difference(fNew.begin(), fNew.end(), fOld.begin(), fOld.end(), std::back_inserter(result), std::less<std::string>());
      return result;
    }
    si le résultat de difference est un vecteur vide -> pas de difference, tu peux garder new
    sinon tu affiches ces différences, demande la validation et choisis le fichier de configuration en fonction

  7. #7
    Membre expert
    Profil pro
    Inscrit en
    Mars 2007
    Messages
    1 415
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Mars 2007
    Messages : 1 415
    Points : 3 156
    Points
    3 156
    Par défaut
    La solution de stendhall666 est bien et simple à mettre en oeuvre. Si jamais ce n'est pas assez évolué pour toi, tu peux essayer ce code qui est une implémentation du SequenceMathcer de la bibliothèque python difflib en C++.
    Find me on github

  8. #8
    Membre expérimenté
    Profil pro
    Inscrit en
    Juin 2006
    Messages
    1 354
    Détails du profil
    Informations personnelles :
    Âge : 48
    Localisation : France

    Informations forums :
    Inscription : Juin 2006
    Messages : 1 354
    Points : 1 419
    Points
    1 419
    Par défaut
    il y a deux librairies que j'avais trouvé pour comparer deux fichiers:
    http://code.google.com/p/dtl-cpp/wiki/Tutorial
    http://code.google.com/p/google-diff-match-patch/w/list

    La deuxieme me parait bien, elle est basé sur Qt, peut-etre génant dans ton cas.

    dis nous ce que tu as finalement implémenté, je vais aussi à avoir à utiliser un diff de ce genre bientôt.

    bon courage, a+

  9. #9
    Membre à l'essai
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2015
    Messages
    23
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Tunisie

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Industrie

    Informations forums :
    Inscription : Février 2015
    Messages : 23
    Points : 11
    Points
    11
    Par défaut
    @stendhal666 : merci pour votre repense mais pour mon cas elle ne fonctionne plus car elle fait la difference selon le nombre de ligne de chaque fichier non pas le contenu , si on a deux fichiers de même nombre de lignes (c'est mon cas) il retourne zéro comme différence

  10. #10
    Membre chevronné

    Homme Profil pro
    Développeur informatique
    Inscrit en
    Avril 2013
    Messages
    610
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Finance

    Informations forums :
    Inscription : Avril 2013
    Messages : 610
    Points : 1 878
    Points
    1 878
    Billets dans le blog
    21
    Par défaut
    Dsl, quelques erreurs dans mon post (suis allé trop vite):
    - remplacer les conteneurs de fichier par des multiset (car set_difference demande des séquences triées) / trier les vecteurs obtenus, mais c'est plus lent
    - set_difference plutôt que set_symmetric_difference, sinon tu auras aussi les lignes qui sont dans old et pas dans new
    - utiliser std::less<std::string>, pas std::equal<std::string> dans set_difference.

    Au total ça donne (testé cette fois):

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    #include <multiset>
    #include <fstream>
    #include <algorithm> // set_symmetric_difference
    #include <functional> // equal_to
     
    void fileToMultisetr(std::fstream& from, std::multiset<std::string>& to) { // met les lignes du fichier dans un vecteur
      for (std::string line; std::getline(from, line); )
          to.insert(line);
    }
     
    std::vector<std::string> difference(std::multiset<std::string>& fOld, std::multiset<std::string>& fNew) { // retourne les lignes présentes dans new qui ne sont pas dans Old
      std::vector<std::string> result;
      std::set_difference(fNew.begin(), fNew.end(), fOld.begin(), fOld.end(), std::back_inserter(result), std::less<std::string>());
      return result;
    }

  11. #11
    Membre à l'essai
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2015
    Messages
    23
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Tunisie

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Industrie

    Informations forums :
    Inscription : Février 2015
    Messages : 23
    Points : 11
    Points
    11
    Par défaut
    dans ce cas là j'ai cette erreur " error C1083: Cannot open include file: 'multiset': No such file or directory "

  12. #12
    Membre chevronné

    Homme Profil pro
    Développeur informatique
    Inscrit en
    Avril 2013
    Messages
    610
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Finance

    Informations forums :
    Inscription : Avril 2013
    Messages : 610
    Points : 1 878
    Points
    1 878
    Billets dans le blog
    21
    Par défaut
    oui, il faut:
    #include <set>
    et pas
    #include <multiset>

  13. #13
    Membre à l'essai
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2015
    Messages
    23
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Tunisie

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Industrie

    Informations forums :
    Inscription : Février 2015
    Messages : 23
    Points : 11
    Points
    11
    Par défaut
    merci bien ça marche .
    mon projet est encore un peut long ,si je trouve autre difficulté, est ce que vous pouvez m'aidez ? et merci d'avance

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. comparer deux fichier .xls
    Par oursquetaire dans le forum Excel
    Réponses: 6
    Dernier message: 06/07/2006, 16h52
  2. [JDOM] Comparer deux fichiers XML en Java
    Par calimero2611 dans le forum Format d'échange (XML, JSON...)
    Réponses: 5
    Dernier message: 30/06/2006, 11h19
  3. Comparer deux fichier
    Par Taz_8626 dans le forum Langage
    Réponses: 3
    Dernier message: 20/06/2006, 11h46
  4. comparer deux fichiers avec une api windows
    Par sweetdreamer dans le forum Windows
    Réponses: 4
    Dernier message: 25/05/2006, 22h10
  5. Fonction c qui compare deux fichiers ???
    Par babyface dans le forum C
    Réponses: 4
    Dernier message: 19/11/2005, 13h07

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo