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 contenu de 2 fichiers


Sujet :

C

  1. #1
    Membre du Club
    Profil pro
    Inscrit en
    Avril 2010
    Messages
    152
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2010
    Messages : 152
    Points : 64
    Points
    64
    Par défaut Comparer contenu de 2 fichiers
    Salut !

    Est-ce que vous auriez un code pour comparer 2 fichiers caractère par caractère (car il me faut le nombre de différences).
    Je commence un peu a tripatouiller les fopen/fputs/fread, mais j'ai trop d'erreurs.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
     
    FILE * a= fopen("a.txt",r);
    FILE * b= fopen("b.txt",r);
    int c=0;
     
    while(CONDITION ARRET (qd le fichier a est vide) ){
     
    char x = fgetc(a);
    char y = fgetc(b);
     
    if(x!=y)
    c++;
    }
    Je ne sais pas comment écrire la condition d'arret.

    Quelqu'un aurait une solution ?

    Meric d'avance.

  2. #2
    Inactif  


    Homme Profil pro
    Doctorant sécurité informatique — Diplômé master Droit/Économie/Gestion
    Inscrit en
    Décembre 2011
    Messages
    9 012
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 31
    Localisation : France, Loire (Rhône Alpes)

    Informations professionnelles :
    Activité : Doctorant sécurité informatique — Diplômé master Droit/Économie/Gestion
    Secteur : Enseignement

    Informations forums :
    Inscription : Décembre 2011
    Messages : 9 012
    Points : 23 145
    Points
    23 145
    Par défaut
    Bonjour,

    Si tu veux comparer des fichiers, je te conseilles de les comparer en binaire (option b cf le man ).

    Sinon pour la condition de fin de boucles, je te conseille de regarder les mans, de rechercher un peu sur google ou de faire un tour dans la FAQ.

  3. #3
    Membre du Club
    Profil pro
    Inscrit en
    Avril 2010
    Messages
    152
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2010
    Messages : 152
    Points : 64
    Points
    64
    Par défaut
    De quelle option parles tu ? De fopen ? Je ne la vois pas la la page que tu as donné.

  4. #4
    Inactif  


    Homme Profil pro
    Doctorant sécurité informatique — Diplômé master Droit/Économie/Gestion
    Inscrit en
    Décembre 2011
    Messages
    9 012
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 31
    Localisation : France, Loire (Rhône Alpes)

    Informations professionnelles :
    Activité : Doctorant sécurité informatique — Diplômé master Droit/Économie/Gestion
    Secteur : Enseignement

    Informations forums :
    Inscription : Décembre 2011
    Messages : 9 012
    Points : 23 145
    Points
    23 145
    Par défaut
    Citation Envoyé par Raikyn Voir le message
    De quelle option parles tu ? De fopen ? Je ne la vois pas la la page que tu as donné.
    Citation Envoyé par http://man.developpez.com/man3/fopen.3.php
    La chaîne mode peut également inclure la lettre ``b'' comme 3ème caractere, ou même entre les deux caractères d'une des séquences à 2 lettres vues ci-dessus. Ce mode sert uniquement à assurer la compatibilité avec ANSI X3.159-1989 (``ANSI C'') et n'a aucun effet. Le ``b'' est ignoré sur tous les systèmes compatibles POSIX, y compris Linux. (D'autres systèmes peuvent traiter les fichiers de texte et les fichiers binaires différement, et l'ajout du ``b'' peut être une bonne idée si vous faites des entrées-sorties binaires et que votre programme risque d'être porté sur un environnement non-Unix).
    C'est surtout pour la compatibilité avec Windows.

  5. #5
    Membre du Club
    Profil pro
    Inscrit en
    Avril 2010
    Messages
    152
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2010
    Messages : 152
    Points : 64
    Points
    64
    Par défaut
    Désolé je ne comprend pas le rapport avec mon problème ^^

    Je programme sous Linux sinon.

  6. #6
    Modérateur

    Avatar de Bktero
    Homme Profil pro
    Développeur en systèmes embarqués
    Inscrit en
    Juin 2009
    Messages
    4 481
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur en systèmes embarqués

    Informations forums :
    Inscription : Juin 2009
    Messages : 4 481
    Points : 13 679
    Points
    13 679
    Billets dans le blog
    1
    Par défaut
    Possèdes-tu Notepad++ ? Si oui tu pourras vérifier facilement ce que je vais expliquer (il y a un bouton pour afficher tous les caractères y compris CR et LF), si non, tu devras me croire ou trouver un logiciel qui le fait ^^

    Quand tu enregistres ou lit du texte, les caractères '\n' en langage C sont convertis dans le format de ton OS (et inversement lors de la lecture). Sous Linux, en LF ; sous Windows en CR + LF.

    Si tu compares le même fichier mais que l'un a été crée sous Linux et l'autre sous Windows sans précaution, tous les retours de fin de ligne seront différents. Si tu souhaites voir ces différences ou si tu veux les gommer, il faut utiliser ou pas l'option b. En effet, en mode binaire (donc avec l'option b), les '\n' ne sont pas interprétés / modifiés.

    Je te conseille personnellement de vérifier la valeur de retour de fopen() pour savoir si les fichiers ont été correctement ouverts.

  7. #7
    Expert éminent sénior
    Avatar de Sve@r
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2006
    Messages
    12 684
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Oise (Picardie)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Février 2006
    Messages : 12 684
    Points : 30 973
    Points
    30 973
    Billets dans le blog
    1
    Par défaut
    Citation Envoyé par Raikyn Voir le message
    Je ne sais pas comment écrire la condition d'arret.

    Quelqu'un aurait une solution ?
    Salut
    Code c : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    i=0;
    while (1)
    {
        i++;
        x=fgetc(a);
        y=fgetc(b);
        if (x != y) printf("Différence au caractère %d\n", i);
        if (x == EOF || y == EOF) break;
    }
    Mon Tutoriel sur la programmation «Python»
    Mon Tutoriel sur la programmation «Shell»
    Sinon il y en a pleins d'autres. N'oubliez pas non plus les différentes faq disponibles sur ce site
    Et on poste ses codes entre balises [code] et [/code]

  8. #8
    Membre du Club
    Profil pro
    Inscrit en
    Avril 2010
    Messages
    152
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2010
    Messages : 152
    Points : 64
    Points
    64
    Par défaut
    Salut à vous, merci pour les réponses.

    J'avais écrit un morceau de code à partir de qq infos que j'ai trouvé :
    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
     
    int erreurs(){
      FILE * a = fopen("resultat.txt","rb");
      FILE * b = fopen("donnees.txt","rb");
      char x = fgetc(a);
      char y = fgetc(b);
      int c = 0;
     
      do{
     
        if(x!=y){
          c++;
        }
        x = fgetc(a);
        y = fgetc(b);
     
      }while(x!=EOF && y!=EOF);
      return c;
        }
    Mais ça affiche tout le temps que 1 erreur ...

    Je vais essayer avec ton code Sve@r, mais il semblerait qu'ils soient à peu près écrit de la même façon.


    EDIT : Ca me donne le même résultat malheuresement, il doit avoir une erreur sinon plus dans le reste de mon programme...

  9. #9
    Membre expérimenté Avatar de Ngork
    Homme Profil pro
    Barbare IT
    Inscrit en
    Avril 2009
    Messages
    160
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Barbare IT
    Secteur : Finance

    Informations forums :
    Inscription : Avril 2009
    Messages : 160
    Points : 1 372
    Points
    1 372
    Par défaut
    En combinant les conseils de Neckara et Bktero pour le "rb" au lieu du r (qui doit quoi qu'il en soit se trouver entre guillemets) afin d'anticiper un portage futur de tes oeuvres sous Windows, ainsi que le conseil de Bktero de tester la bonne ouverture de tes fichiers, et enfin le mini code de Sve@r qui fournit l'emplacement de chaque différence constatée, il est facile d'obtenir un petit code d'exemple :

    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
    int erreurs()
    {
      int c=0,x,y;
      FILE * a= fopen("resultat.txt","rb");
      FILE * b= fopen("donnees.txt","rb");
     
      if ( a != NULL && b != NULL)
        {
          while (1)
            {
              x=fgetc(a);
              y=fgetc(b);
              if (x != y)
                {
                  c++;
                }
              if (x == EOF || y == EOF)
                {
                  break;
                }
            }
     
          fclose(a);
          fclose(b);
        }
     
      return c;
    }
    Il est certain que ce code est moche, avec des noms de variables très mal choisis, et des noms de fichiers inscrits en dur et non transmis à la fonction.

    Surtout, le nombre de différences ne correspond qu'aux différences rencontrées linéairement et seulement jusqu'à la fin du plus court des deux fichiers.
    Ainsi, si le fichier b est égal au fichier a avec juste un seul caractère supplémentaire placé au début, ce simple décalage provoquera un calcul disproportionné du nombre de différences !

    Es-tu sûr qu'une comparaison de cette sorte est la plus judicieuse ?

  10. #10
    Membre du Club
    Profil pro
    Inscrit en
    Avril 2010
    Messages
    152
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2010
    Messages : 152
    Points : 64
    Points
    64
    Par défaut
    Je ne sais pas si c'est la plus judicieuse, mais c'est tout ce que je peux espérer concevoir à mon niveau de C actuel ^^

    Je voudrais juste avoir le nombre de caractères qui diffèrent d'un fichier à l'autre. Alors à part faire une comparaison caractère par caractère je ne vois pas trop.

  11. #11
    Expert éminent sénior
    Avatar de Sve@r
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2006
    Messages
    12 684
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Oise (Picardie)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Février 2006
    Messages : 12 684
    Points : 30 973
    Points
    30 973
    Billets dans le blog
    1
    Par défaut
    Citation Envoyé par Raikyn Voir le message
    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
     
    int erreurs(){
      FILE * a = fopen("resultat.txt","rb");
      FILE * b = fopen("donnees.txt","rb");
      char x = fgetc(a);
      char y = fgetc(b);
      int c = 0;
     
      do{
     
        if(x!=y){
          c++;
        }
        x = fgetc(a);
        y = fgetc(b);
     
      }while(x!=EOF && y!=EOF);
      return c;
        }
    Je vais essayer avec ton code Sve@r, mais il semblerait qu'ils soient à peu près écrit de la même façon.
    Presque. Mais ton code ne fonctionne pas dans le cas d'un fichier vide (tu fais 2 lectures)...

    Citation Envoyé par Raikyn Voir le message
    Mais ça affiche tout le temps que 1 erreur ...
    Normal, tu renvoies c qui ne contient que la dernière différence...

    Citation Envoyé par Raikyn Voir le message
    Je voudrais juste avoir le nombre de caractères qui diffèrent d'un fichier à l'autre. Alors à part faire une comparaison caractère par caractère je ne vois pas trop.
    Tu devrais regarder le programme "diff" ou même son homologue graphique "meld". C'est sûr c'est un joli truc...
    Mon Tutoriel sur la programmation «Python»
    Mon Tutoriel sur la programmation «Shell»
    Sinon il y en a pleins d'autres. N'oubliez pas non plus les différentes faq disponibles sur ce site
    Et on poste ses codes entre balises [code] et [/code]

  12. #12
    Inactif  


    Homme Profil pro
    Doctorant sécurité informatique — Diplômé master Droit/Économie/Gestion
    Inscrit en
    Décembre 2011
    Messages
    9 012
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 31
    Localisation : France, Loire (Rhône Alpes)

    Informations professionnelles :
    Activité : Doctorant sécurité informatique — Diplômé master Droit/Économie/Gestion
    Secteur : Enseignement

    Informations forums :
    Inscription : Décembre 2011
    Messages : 9 012
    Points : 23 145
    Points
    23 145
    Par défaut
    Citation Envoyé par Sve@r Voir le message
    Salut
    Code c : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    i=0;
    while (1)
    {
        i++;
        x=fgetc(a);
        y=fgetc(b);
        if (x != y) printf("Différence au caractère %d\n", i);
        if (x == EOF || y == EOF) break;
    }
    Pourquoi faire un while(1) avec un if(...) break; à la fin plutôt qu'un do { } while( ...); ?

    Désolé je ne comprend pas le rapport avec mon problème ^^

    Je programme sous Linux sinon.
    Windows ignore les caractères non-imprimables lorsqu'on ne spécifie pas l'option "b".

  13. #13
    Expert éminent sénior
    Avatar de Sve@r
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2006
    Messages
    12 684
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Oise (Picardie)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Février 2006
    Messages : 12 684
    Points : 30 973
    Points
    30 973
    Billets dans le blog
    1
    Par défaut
    Citation Envoyé par Neckara Voir le message
    Pourquoi faire un while(1) avec un if(...) break; à la fin plutôt qu'un do { } while( ...); ?
    Très bonne question. J'ai tapé vite fait sans réfléchir...
    Mon Tutoriel sur la programmation «Python»
    Mon Tutoriel sur la programmation «Shell»
    Sinon il y en a pleins d'autres. N'oubliez pas non plus les différentes faq disponibles sur ce site
    Et on poste ses codes entre balises [code] et [/code]

  14. #14
    Membre du Club
    Profil pro
    Inscrit en
    Avril 2010
    Messages
    152
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2010
    Messages : 152
    Points : 64
    Points
    64
    Par défaut
    J'ai pas compris le problème avec la variable c.
    Je l'initialise à 0 et je l'incrémente à chaque fois qu'il y a une différence, ça devrait me renvoyer le nombre de différence non ?

  15. #15
    Expert éminent sénior
    Avatar de Sve@r
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2006
    Messages
    12 684
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Oise (Picardie)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Février 2006
    Messages : 12 684
    Points : 30 973
    Points
    30 973
    Billets dans le blog
    1
    Par défaut
    Citation Envoyé par Raikyn Voir le message
    J'ai pas compris le problème avec la variable c.
    Je l'initialise à 0 et je l'incrémente à chaque fois qu'il y a une différence, ça devrait me renvoyer le nombre de différence non ?
    Ouaip j'avais mal lu. Je pensais que, comme moi, tu affichais la position du caractère qui diffère. Alors qu'effectivement tu affiches le nombre de caractères.
    Donc il ne devrait pas y avoir de souci...
    Mon Tutoriel sur la programmation «Python»
    Mon Tutoriel sur la programmation «Shell»
    Sinon il y en a pleins d'autres. N'oubliez pas non plus les différentes faq disponibles sur ce site
    Et on poste ses codes entre balises [code] et [/code]

Discussions similaires

  1. Comparer contenu de deux fichiers
    Par Garkan dans le forum Shell et commandes GNU
    Réponses: 3
    Dernier message: 08/07/2013, 10h10
  2. Comparer le contenu de deux fichiers
    Par Sancti_Eyes dans le forum Langage
    Réponses: 7
    Dernier message: 03/05/2009, 10h54
  3. comparer contenu de deux fichiers
    Par Earl7 dans le forum Langage
    Réponses: 5
    Dernier message: 02/02/2009, 16h07
  4. comparer le contenu de 2 fichiers
    Par vins25 dans le forum Autres Logiciels
    Réponses: 3
    Dernier message: 20/03/2006, 07h04
  5. Comment comparer le contenu de 2 fichiers ?
    Par steph_1 dans le forum Langage
    Réponses: 4
    Dernier message: 17/06/2005, 18h38

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