Comparer deux fichiers

Signaler
Messages postés
393
Date d'inscription
lundi 22 juin 2009
Statut
Membre
Dernière intervention
23 décembre 2011
-
Messages postés
393
Date d'inscription
lundi 22 juin 2009
Statut
Membre
Dernière intervention
23 décembre 2011
-
Bonjour,

J'ai deux fichiers "exemple.txt" et "essai.txt"
J'aime afficher les lignes qui existent dans "exemple.txt" et qui n'existent pas dans "essai.txt"
c'est comme une sorte de la différence.

Chaque ligne de fichier contient une chaine de caractère.
Mon idée :
pour chaque ligne de "exemple.txt" je teste si elle existe dans "essai.txt".
Si oui je l'affiche.

Le problème que on peut trouver la même chaine de caractère de "exemple.txt" mais dont l'ordre des mots formant cette chaine est différent de celui dans "essai.txt"

on affiche la chaine autant qui se compose de mêmes mots.

Soit le fichier "exemple.txt"

nom prenom
nom age
nom prenom age
nom emploi
age emploi
prenom age empoi
nom age emploi
nom prenom emploi
nom prenom age emploi


Soit le fichier "essai.txt"

nom
prenom
age
emploi
age nom
nom age prenom
nom emploi
age emploi
prenom age empoi
nom prenom emploi
nom prenom age emploi


le résultat souhaité est:

nom prenom
nom age
nom age emploi


Comment on obtient ce résultat ?

Merci.

108 réponses

Messages postés
3834
Date d'inscription
dimanche 12 décembre 2004
Statut
Modérateur
Dernière intervention
20 octobre 2021
124
Tu créer la fonction "char** get_final_result(char** intersection)".
Tu reprends la variable "inter" qui est dans le main. et juste avant de la libérer tu appliques la fonction get_final_result. Le résultat sera stocké dans une nouvelle variable, que tu penseras à afficher et libérer.

Ton énoncé est assez mal formulé. Sans l'exemple, j'aurais sûrement mal compris. On devrait plutôt dire: "On ne garde que les chaînes qui ne sont pas capables d'inclure les autres chaînes."

La fonction devra donc analyser les chaînes présentes et créer un nouveau tableau qui ne contiendra que les chaînes qui ne peuvent en contenir d'autre.
Messages postés
393
Date d'inscription
lundi 22 juin 2009
Statut
Membre
Dernière intervention
23 décembre 2011
5
Bonsoir,


"On ne garde que les chaînes qui ne sont pas capables d'inclure les autres chaînes."


Oui c'est çà.
Le problème est comment je peux savoir
si une chaine n'est pas incluse le reste des autres chaines ?

Est ce que l'idée est la suivante:
on a "b d" n'inclut pas "a b d" et "b c d" et "a c d" et "a b c d"
Donc on garde "b d".

Mais après comment fait ?

Merci.
Messages postés
3834
Date d'inscription
dimanche 12 décembre 2004
Statut
Modérateur
Dernière intervention
20 octobre 2021
124
Créez une fonction "int is_contained_in(char* needle, char* heap)".
Qui retourne si "needle" est contenu dans "heap".

Cette fonction te servira dans la fonction "get_final_results".
Dans la fonction "is_contained_in" tu peux te servir de "get_word".

Avec toute ces choses tu devrais t'en sortir.
Messages postés
393
Date d'inscription
lundi 22 juin 2009
Statut
Membre
Dernière intervention
23 décembre 2011
5
Bonsoir,

Je suis encore bloquée.

Pouvez me donner le pseudo code pour chaque fonction décrite en dessus pour comprendre mieux ?

Je serais très contente pour votre aide.

Merci.
Messages postés
3834
Date d'inscription
dimanche 12 décembre 2004
Statut
Modérateur
Dernière intervention
20 octobre 2021
124
Non, c'est à toi de réfléchir. Si je te donne le pseudo code, je fais la réflexion à ta place. Ce n'est pas difficile, réalise chacune des fonctions dans cet ordre:
- is_contained_in (en utilisant "get_word" et "is_in_tab", que tu as déjà).
- get_final_result (en utilisant "is_contained_in").

Je te laisse imaginer et concevoir ces fonctions. Elles ne sont pas plus difficiles à faire que ce que tu as déjà fait. Je pense que tu es tout à fait capable de les réussir sans problème par toi même.
Messages postés
393
Date d'inscription
lundi 22 juin 2009
Statut
Membre
Dernière intervention
23 décembre 2011
5
Bonjour,

Voici la squelette de dernière étape:


void get_word(char **tab, const char *str)
{
    const char* p = str;
    int a, i = 0;

    while(*str)
    {
        a = 0;
        while(isalpha((unsigned char) *p) && *p) p++, a = 1;
        if(a)
          tab[i++] = mstrndup(str, p-str);
        while(!isalpha((unsigned char) *p) && *p) p++;
        str = p;
    }
}

int is_in_tab(char *str, char **tab2)
{
 while(tab2 &&*tab2)
  {
   if(!strcmp(str,*tab2))
   return 1;
  tab2++;	  
  }
 return 0;
}

int is_contained_in(char* needle, char* heap)
{

get_word();

is_in_tab();

}

char ** get_final_result(char** intersection)
{

 is_contained_in( needle, heap);

}

int main(void)
{

 .......
 .......
 char **  final_res = NULL;
.....
.......
 display_tab(intersect);

  //derniere étape
  final_res = get_final_result(intersect);
  
  display_tab(intersect);
  
  free_table(intersect);
  
  free_table(final_res);

}	


- Pouvez vous m'expliquer c'est quoi "needle" "heap" ? et ces deux derniers représentent quoi réellement dans la fonction "get_final_result(char** intersection)" ?

- Dans le fonction "get_final_result(char** intersection)", est ce que on va parcourir ce tableau en avant et en arrière ?
par exemple si nous sommes dans la 2 ème case alors on va la tester avec la première case et les restes des cases ?

Je serais très contente pour vos réponses.

Merci.
Messages postés
3834
Date d'inscription
dimanche 12 décembre 2004
Statut
Modérateur
Dernière intervention
20 octobre 2021
124
Je t'ai déjà expliqué le but de ces fonctions.
"is_contained_in" permet de dire si une chaine "needle" est contenu dans une chaine "heap".
Exemple:
is_contained_in("b d", "a b d") renvera 1.
is_contained_in("b d", "a c d") renvera 0.
is_contained_in("b d", "a c f") renvera 0.
is_contained_in("b d", "b a d") renvera 1.
is_contained_in("b d", "a b c d") renvera 1.
is_contained_in("a b c d", "b d") renvera 0.

A toi avec tout les éléments que tu as déjà, d'imaginer comment cette fonction doit marcher.

La fonction "is_contained_in" te servira dans la fonction "get_final_result". Le tableau sera parcouru à chaque fois du bas vers le haut, pour chacun des éléments, c'est en ça que la fonction "is_contained_in" te sera très utile.
Messages postés
393
Date d'inscription
lundi 22 juin 2009
Statut
Membre
Dernière intervention
23 décembre 2011
5
Bonjour,

Je suis désolée. J'ai réfléchi beaucoup mais je n'ai pas trouvé la solution.

De plus, j'ai un délai pour terminer ce travail et moi je ne l'ai pas terminé.

Je n'oublie pas votre aide
Merci
Messages postés
393
Date d'inscription
lundi 22 juin 2009
Statut
Membre
Dernière intervention
23 décembre 2011
5
Bonjour,

La fonction "is_contained_in" te servira dans la fonction "get_final_result". Le tableau sera parcouru à chaque fois du bas vers le haut, pour chacun des éléments, c'est en ça que la fonction "is_contained_in" te sera très utile.


Votre idée est logique et bonne mais mon problème est comment commencer à la développer ?


Merci.
Messages postés
3834
Date d'inscription
dimanche 12 décembre 2004
Statut
Modérateur
Dernière intervention
20 octobre 2021
124
La fonction "is_contained_in" est très facile à réaliser si tu as compris la fonction "is_same". Ca ressemble pas mal. En revanche je ne peux pas t'aider plus, sans te donner la solution. C'est à toi de réfléchir. Dans un premier temps essaie de voir logiquement en français, comment réaliser cette fonction.
Messages postés
393
Date d'inscription
lundi 22 juin 2009
Statut
Membre
Dernière intervention
23 décembre 2011
5
Bonjour,
Pour cette dernière étape je pense qu'il faut reprendre l'idée de la fonction is_same mais en modifiant un peu son contenu de sorte qu'on puisse savoir quelle chaine contient l'autre (en fait, il suffit de comparer le nombre de mot, s'il y a plus de mot dans s1 que dans s2 alors la seule possibilité est que s1 contienne s2, s2 ne peux pas contenir s1.
Avec un petit if bien placé:

int is_same2(const char *s1, const char *s2)
{
    char **t1, **t2;
    size_t size1 count_word(s1), size2 count_word(s2);
    int ret = 0;

    if(size1 > size2)
    {
    t1 = malloc(size1 * sizeof(char*));
    t2 = malloc(size2 * sizeof(char*));

    if (t1 && t2)
    {
        size_t i, j;
        int a;

        get_word(t1, s1);
        get_word(t2, s2);

        ret = 1;

        for (i = 0; i < size1; i++)
        {
            a = 0;

            for (j = 0; j < size2; j++)
                if (!strcmp(t1[i], t2[j]))
                    a = 1;

            if (!a)
                ret = 0;
        }

        free_tab(t1, size1), free_tab(t2, size2);
    }
    else
        exit(0);
    }
    return ret;
}



Je vous souhaite que vous m'aidez.

Merci.
Messages postés
3834
Date d'inscription
dimanche 12 décembre 2004
Statut
Modérateur
Dernière intervention
20 octobre 2021
124
Je ne comprends pas: pourquoi est-ce que tu copie colles l'ancien code de is_same en changeant juste le nom de la fonction ? J'ai du mal à saisir l'intérêt.

Dans la fonction "is_contained_in", tu dois vérifier si chacun des mots contenus dans "needle", sont contenus dans "heap".
Il suffit d'utiliser "get_word" pour découper les mots, puis de vérifier que chacun des mots de "needle" sont dans "heap" grâce à la fonction "is_in_tab".
Il n'y a rien de difficile, la fonction devrait tenir en moins d'une dizaine de ligne.
Messages postés
393
Date d'inscription
lundi 22 juin 2009
Statut
Membre
Dernière intervention
23 décembre 2011
5
Bonjour,

Nous allons travailler sur un seul tableau "intersect".

 //derniere étape

  final_res = get_final_result(intersect);


Or dans auparavant nous avons travaillé sur deux tableaux.
par exemple :
dans la fonction :
int is_in_tab(char *str, char **tab2)

on a besoin d'une chaine de caractère "str" de premier tableau et d'un deuxième tableau "tab2".

or dans notre cas on a un seul tableau "intersect" on va prendre à chaque fois "str" de tableau "interesct" alors dans quel tableau on va tester si "str" existe ou non?

de même pour la fonction:
void get_word(char **tab, const char *str)

nous allons une un tableau "tab" qui contient les mots formant la chaine "str".
on a chaque fois "str" = "b d"
puis "str" = "a b d"
puis "str" = "b c d"
puis "str" = "a c d"
puis "str" = "a b c d"

alors "tab" va contenir quoi ?


Je suis bloquée. Pouvez vous me détailler encore les fonctions qui vous allez les utiliser dans votre solution ?

Merci.
Messages postés
3834
Date d'inscription
dimanche 12 décembre 2004
Statut
Modérateur
Dernière intervention
20 octobre 2021
124
Chacune des lignes du tableau intersect sont des chaînes de caractères.
Or ces chaînes de caractères peuvent être découpées grâce à "get_word" qui ne prend qu'un seul argument, pas deux (relis le code que tu as déjà). La fonction "get_word" découpe une chaîne de caractère et renvoie un tableaux qui contient tout les mots découpés.

Dans "is_contained_in", en découpant les mots de la chaîne de caractère "heap" et en faisant de même pour "needle", tu obtiens deux tableaux. Il suffit alors de vérifier que les éléments du premier tableaux sont tous contenus dans le deuxième, ou non.
Messages postés
393
Date d'inscription
lundi 22 juin 2009
Statut
Membre
Dernière intervention
23 décembre 2011
5
Bonjour,
Chacune des lignes du tableau intersect sont des chaînes de caractères.

nous n'avons pas des lignes.
Nous avons des cases du tableau "intersect".

J'ai essayé beaucoup. Mais, je n'ai pas trouvé la solution.

Elle me reste cette dernière étape.

Je souhaite que vous m'aidez car j'ai besoin de de résultat final pour l'utiliser dans une interface graphique.

Merci.
Messages postés
3834
Date d'inscription
dimanche 12 décembre 2004
Statut
Modérateur
Dernière intervention
20 octobre 2021
124
Je ne peux pas t'aider plus. La fonction n'est pas difficile, je suis étonné que tu n'ai pas eu de mal à faire ce qu'il y avait avant, alors que c'était bien plus dur !
Je peux te corriger, mais pas te donner la solution. Je t'ai déjà énormément aiguillé. Donc à moins te de donner la solution, je ne peux pas faire grand chose de plus.
Continue d'essayer.
Messages postés
393
Date d'inscription
lundi 22 juin 2009
Statut
Membre
Dernière intervention
23 décembre 2011
5
Bonjour,

D'accord, je vais essayer encore.

J'ai besoin de ce résultat final de votre solution après.

En réalité je voulais faire une interface graphique:
- pour préparer les données au programme C - puis pour visualiser le résultat (fichiers textes) venant du programme C.

Concernant l'interface VB, j'ai un ami qui a fait cette interface en VB 6.0 pour le même travail que moi. Or lorsque je l'ouvre cette interface avec visual studio 2008 alors il me demande de cliquer sur convertir. je clique sur convertir puis il me demande d'enregistrer dans un emplacement.
ceci se passe bien.
J'ouvre le nouveau projet converti alors je trouve ce que j'ai besoin les interfaces, le code bien fait.
Mais lorsque je lance la compilation
J'ai le même erreur qui ce répète dans tous les "forms" c'est à dire les fenêtres de travail.
Cet erreur est:

C:\20-04-08\20-04-08\ProjetData.NET\choix_attribut_select.vb(59) :
error BC32022: 'Public Event Load(sender As Object, e As
System.EventArgs)' est un événement. Il ne peut donc pas être appelé
directement. Utilisez une instruction 'RaiseEvent' pour déclencher un événement.

Comment on fait une propre conversion de projet VB 6 en vb.net ?

comment utiliser RaiseEvent ?

S'il vous plait, Comment cet erreur va être corriger ?


J'ai vu cette solution:
Apparemment , il faut rajouter 'Event' : LoadEvent au lieu de Load
comme décrit dans ce lien :

http://msmvps.com/blogs/kenlin/archive/2007/01/31/convert-if-someevent-null-into-vb.aspx

J'ai remplacé Load(nom de la Form) par LoadEvent(nom de la Form).
Je compile et j'ai ce message d'erreur:

error BC30451: Le nom 'LoadEvent' n'est pas déclaré.

Je ne sais pas comment je vais corriger cet erreur ?


Merci.
Messages postés
3834
Date d'inscription
dimanche 12 décembre 2004
Statut
Modérateur
Dernière intervention
20 octobre 2021
124
Heu... Le vb n'est pas du C++. Donc si tu veux une interface graphique, fais la toi même en QT, en MFC, wxWidget, ou en Borland. (Mon préféré étant QT).
Si ton ami te donne son interface graphique, c'est de la triche, non ?
Finis déjà ton application en mode console, avant de te lancer dans le mode graphique.
Messages postés
393
Date d'inscription
lundi 22 juin 2009
Statut
Membre
Dernière intervention
23 décembre 2011
5
Si ton ami te donne son interface graphique, c'est de la triche, non ?


c'est un travail coopératif entre les deux.
Moi je vais le programme C
et mon ami fait l'interface graphique

Mon préféré étant QT


Mon programme est en C Or je crois que le QT est en C++ ?

J'ai fait mon programme C (application console) sous windows avec visual studio 2008.
C'est possible d'exploiter cet IDE pour faire une interface graphique ?
ou bien il y a le plus simple ?

Dans l'interface graphique: il y a une connexion à une base de données pour extraire les noms de tables et les attributs de quelques tables .....
aussi par exemple, on clique sur un bouton pour afficher le contenu de fichier résultat(de programme principal) dans une listebox ....

Je serais très contente pour votre aide.

Merci.
Messages postés
393
Date d'inscription
lundi 22 juin 2009
Statut
Membre
Dernière intervention
23 décembre 2011
5
en VB 6 pour Charger/Ouvrir un formulaire il faut faire l'instruction

Load (nom du formulaire)


Quel est l'équivalent en VB.net ?