Forum |  HardWare.fr | News | Articles | PC | S'identifier | S'inscrire | Shop Recherche
2000 connectés 

  FORUM HardWare.fr
  Programmation
  C

  problème de comparaison de deux fichiers

 


 Mot :   Pseudo :  
 
Bas de page
Auteur Sujet :

problème de comparaison de deux fichiers

n°1918748
dimadima
Posté le 27-08-2009 à 10:04:38  profilanswer
 

bonjour,
 
Je vous explique mon problème.
Soit le premier fichier fichier "f.txt":
nom prenom
nom age
nom prenom age
nom emploi
age emploi
prenom age emploi
nom age emploi
nom prenom emploi
nom prenom age emploi
 
Soit le deuxième fichier "f2.txt":
 
nom
prenom
age
emploi
age nom
nom age prenom
nom emploi
age emploi
prenom age emploi
nom prenom emploi
nom prenom age emploi
 
Le résultat souhaité:
nom prenom
nom age emploi
 
Je cherche les lignes qui appartiennent à "f.txt" et non pas "f2.txt"
C'est une sorte de différence lignes de "f.txt" moins lignes de "f2.txt"
à condition:
Une ligne de "f.txt" est identique à une ligne de "f2.txt"
si les deux lignes ont la même valeur et le même nombre des mots qui forment les deux lignes quelque soit l'ordre des mots puisque l'ordre des mots n'est pas important dans mon problème.
le plus important c'est : la même valeur et le même nombre
 
Sinon c'est à dire les deux lignes n'ont pas la même valeur et le même nombre des mots alors dans ce cas les deux lignes sont différentes.
 
par exemple:
"nom prenom age" = "nom age prenom"
 
et donc l'ordre est ignoré.
 
J'espère que je le problème est clair sinon je vous explique encore.
 
Sachant que chaque ligne du deux fichiers "f.txt" et "f2.txt" est composé d'un seul champ (une chaine de caractères).
 
Le remplissage de deux fichiers se fait par:
 
fprintf(fp,"%s",s); //le fichier "f.txt"
 
fprintf(fp2,"%s",s); //le fichier "f2.txt"
 
J'ai besoin de vos aides.
 
Merci.

mood
Publicité
Posté le 27-08-2009 à 10:04:38  profilanswer
 

n°1918765
Taz
bisounours-codeur
Posté le 27-08-2009 à 10:30:09  profilanswer
 

T'as quoi comme problème de C ?

n°1918787
dimadima
Posté le 27-08-2009 à 11:27:44  profilanswer
 

Bonjour,
Voici un premier essai:
 

Code :
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. #include <string.h>
  4.  
  5. int main()
  6. {
  7.  
  8. FILE *f,*f2 ;
  9. char s[1000], s2[1000];
  10.  
  11. f = fopen("f.txt", "r" );
  12. f2 = fopen("f2.txt", "r" );
  13. while(fgets(s, 1000, f)!= NULL)
  14. {
  15.  
  16.   rewind(f2);
  17.   while(fgets(s2, 1000, f2)!= NULL)
  18.      if(strcmp(s, s2))
  19.             printf("%s\n",s);
  20.        
  21.   }
  22. fclose(f);
  23. fclose(f2);
  24. return 0;
  25. }


 
Mais cette solution tient de l'ordre des mots de deux lignes pour chaque fichier.
"nom prenom age" est différent " nom age prenom"
 
j'ai dit  il suffit de changer cette condition: if(!strcmp(s, s2))  par un truc comme if(same_word(s, s2)) .
mais, je trouve difficulté de implémenter
la fonction  same_word(s, s2)
 
Comment je vais modifier cette solution pour ignorer l'ordre.
pour obtenir:
 
 "nom prenom age" = " nom age prenom"
 
Merci.

n°1918899
Sebxoii
I've made a huge tiny mistake.
Posté le 27-08-2009 à 16:22:37  profilanswer
 

Je ne crois pas qu'une telle fonction existe telle quelle. Il va falloir que tu découpes chaque chaîne de caractère en trois champs "à la main" et que tu vérifies successivement :

  • si le premier champ de la première chaine est égal à l'un des trois champs de la second chaîne.
  • si le second champ de la première chaine est égal à l'un des deux restants.
  • ...

n°1919064
Sve@r
Posté le 27-08-2009 à 23:18:53  profilanswer
 

Sebxoii a écrit :

Je ne crois pas qu'une telle fonction existe telle quelle.


Exact - Ca n'existe pas
 

Sebxoii a écrit :

Il va falloir que tu découpes chaque chaîne de caractère en trois champs "à la main" et que tu vérifies successivement :

  • si le premier champ de la première chaine est égal à l'un des trois champs de la second chaîne.
  • si le second champ de la première chaine est égal à l'un des deux restants.
  • ...

Super algo. Et si t'avais 10 champs, tu ferais une à une les 55 comparaisons ???
Tu mets tes data du fichier 1 dans un tableau X, tes datas du fichier 2 dans un tableau Y. Puis tu tries les 2 tableaux par ordre alphabétique (qsort(..., ..., ..., strcmp)) puis tu compares les tableaux champ [n] tableau X avec champ[n] tableau Y avec sortie immédiate si différents...

Message cité 1 fois
Message édité par Sve@r le 27-08-2009 à 23:21:49

---------------
Vous ne pouvez pas apporter la prospérité au pauvre en la retirant au riche.
n°1919068
Sebxoii
I've made a huge tiny mistake.
Posté le 28-08-2009 à 00:08:50  profilanswer
 

Sve@r a écrit :

Super algo. Et si t'avais 10 champs, tu ferais une à une les 55 comparaisons ???

Je réfléchis un peu dans ce cas ! :D

Sve@r a écrit :

Tu mets tes data du fichier 1 dans un tableau X, tes datas du fichier 2 dans un tableau Y. Puis tu tries les 2 tableaux par ordre alphabétique (qsort(..., ..., ..., strcmp)) puis tu compares les tableaux champ [n] tableau X avec champ[n] tableau Y avec sortie immédiate si différents...

J'aime bien la méthode en tout cas, je note ça dans un coin de cerveau. ;)

n°1919084
Sve@r
Posté le 28-08-2009 à 08:37:45  profilanswer
 

Sebxoii a écrit :

Je réfléchis un peu dans ce cas ! :D


Arf, faut réfléchir tout le temps :D
 

Sebxoii a écrit :

J'aime bien la méthode en tout cas, je note ça dans un coin de cerveau. ;)


Au plaisir


---------------
Vous ne pouvez pas apporter la prospérité au pauvre en la retirant au riche.
n°1919163
dimadima
Posté le 28-08-2009 à 10:39:56  profilanswer
 

Bonjour,
J'ai testé le code suivant :  
 

Code :
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. #include <string.h>
  4. int main()
  5. {
  6. FILE *f,*f2 ;
  7. char s[1000], s2[1000];
  8. f = fopen("f.txt", "r" );
  9. f2 = fopen("f2.txt", "r" );
  10. while(fgets(s, 1000, f)!= NULL)
  11. {
  12.    rewind(f2);
  13.    while(fgets(s2, 1000, f2)!= NULL)
  14.       if(strcmp(s, s2))
  15.              printf("%s\n",s);
  16.        
  17.    }
  18. fclose(f);
  19. fclose(f2);
  20. return 0;
  21. }


 
La compilation se passe bien. Mais, l'exécution ne passe pas bien puisque il y a une génération de l'exception suivante:

Citation :


 
Debug assertion Failed!
Prpgram :  
File : f\dd\vctools\crt_bld\self_x86\crt\src\fgets.c
Line : 57
 
Expression : (str != NULL)


 
D'où vient cette erreur ?
 
Merci.


Message édité par dimadima le 28-08-2009 à 10:47:08
n°1919215
dimadima
Posté le 28-08-2009 à 11:41:16  profilanswer
 

Bonjour,
 
J'ai modifié un peu le code :
 
#

Code :
  1. include <stdio.h>
  2. #include <stdlib.h>
  3. #include <string.h>
  4. int main()
  5. {
  6.   FILE *f, *f2;
  7.   char s[1000], s2[1000];
  8.   char* filename1 = "f.txt";
  9.   char* filename2 = "f2.txt";
  10.   f = fopen(filename1, "r" );
  11.   if (f == NULL)
  12.   {
  13.     printf("Unable to open file %s\n", filename1);
  14.     return 1;
  15.   }
  16.   f2 = fopen(filename2, "r" );
  17.   if (f2 == NULL)
  18.   {
  19.     printf("Unable to open file %s\n", filename2);
  20.     return 1;
  21.   }
  22.   while (fgets(s, 1000, f) != NULL)
  23.   {
  24.     rewind(f2);
  25.     while (fgets(s2, 1000, f2) != NULL)
  26.       if (strcmp(s, s2))
  27. printf("%s\n",s);
  28.   }
  29.   fclose(f);
  30.   fclose(f2);
  31.   return 0;
  32. }


 
 
Après l'exécution, il m'affiche :
 
Unable to open file f
 
Mais, les deux fichiers existent.


Message édité par dimadima le 28-08-2009 à 11:41:46
n°1919229
ptitchep
Posté le 28-08-2009 à 12:01:18  profilanswer
 

Salut
C'est mieux avec la gestion des erreurs ;)
Il faut toujours vérifier les appels système.
fgets ajoute \0 à la fin de la chaine, je ne suis plus sûr (voir la doc) mais je pense qu'avec un tableau de 1000, il ne faut demander que 999 caractères à fgets pour qu'il puisse placer \0 au cas où le tableau soit effectivement rempli.
Attention strcmp renvoie 0 si les chaîne sont identiques. Ta comparaison fait bien ce que tu veux?
essaie:

Code :
  1. char filename1[] = "f.txt";


cela déclare un tableau de caractères. char* ce n'est qu'un pointeur sur 1 caractère.

 

remarque cela devrait te faire une zone temporaire contenant ta chaîne et un pointeur qui pointe dessus... Je n'ai jamais créé de chaînes comme cela, toujours avec des tableaux, cela me fait douter pour le coup. Sinon pour vérifier s'il trouve bien tes fichiers:

Code :
  1. f = fopen("f.txt", "r" );


comme dans ton premier essai mais en ajoutant la vérification des erreurs.


Message édité par ptitchep le 28-08-2009 à 12:12:07

---------------
deluser --remove-home ptitchep

Aller à :
Ajouter une réponse
  FORUM HardWare.fr
  Programmation
  C

  problème de comparaison de deux fichiers

 

Sujets relatifs
problème d'affichageProbléme avec mon formulaire Email
Problème d'authentification avec sha1[RESOLU][VBA] Problème sur creation graphique à 2 axes
Probleme de T_DOUBLE_ARROWproblème d'allocation du tableau
AJAX : problème de compatibilité IE / FirefoxProblème RSS valide qui ne s'affiche pas
Probleme avec le client citrix[C++] Probleme de Makefile/linkage
Plus de sujets relatifs à : problème de comparaison de deux fichiers


Copyright © 1997-2022 Hardware.fr SARL (Signaler un contenu illicite / Données personnelles) / Groupe LDLC / Shop HFR