problème de comparaison de deux fichiers

problème de comparaison de deux fichiers - C - Programmation

Marsh Posté le 27-08-2009 à 10:04:38    

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.

Reply

Marsh Posté le 27-08-2009 à 10:04:38   

Reply

Marsh Posté le 27-08-2009 à 10:30:09    

T'as quoi comme problème de C ?

Reply

Marsh Posté le 27-08-2009 à 11:27:44    

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.

Reply

Marsh Posté le 27-08-2009 à 16:22:37    

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.
  • ...

Reply

Marsh Posté le 27-08-2009 à 23:18:53    

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.
Reply

Marsh Posté le 28-08-2009 à 00:08:50    

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. ;)

Reply

Marsh Posté le 28-08-2009 à 08:37:45    

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.
Reply

Marsh Posté le 28-08-2009 à 10:39:56    

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
Reply

Marsh Posté le 28-08-2009 à 11:41:16    

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
Reply

Marsh Posté le 28-08-2009 à 12:01:18    

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
Reply

Sujets relatifs:

Leave a Replay

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