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
Je ne connais pas bien la ligne de commande de windows. Je vais essayer de procurer une VM windows et tester.
Chez moi (sous linux), j'ai le bon affichage:

Ligne de commande:
./tester f.txt f1.txt


Résultat:

b d
c d
a b d
b c d
a c d
a b c d
Messages postés
3834
Date d'inscription
dimanche 12 décembre 2004
Statut
Modérateur
Dernière intervention
20 octobre 2021
124
Je viens de le tester à l'instant sur un Windows: ça fonctionne parfaitement.

Essaie de faire finir ton programme par ".exe", ça semble ne pas fonctionner sinon.
J'ai appelé mon exécutable "test", ça n'a pas fonctionné. Je l'ai appelé "test.exe" et ça fonctionne quand je tape "test.exe" ou "test".
Messages postés
393
Date d'inscription
lundi 22 juin 2009
Statut
Membre
Dernière intervention
23 décembre 2011
5
Bonjour,

J'ai testé votre dernier code avec la ligne des commandes sans faire aucune modification.
Mais, il y a aucun affichage sur la console.
Mon programme.exe s'appelle "tester_exe"
J'ai mis les deux fichiers f.txt et f1.txt dans le répertoire debug où il y a le programme.exe
Voici la ligne de commande:

c:\tester_\debug> tester_.exe f.txt f1.txt

Pouvez vous posté une version de votre solution sans utiliser argc et argv ? de plus moi je n'utilise pas l'exécution par ligne de commande car j'utilise l'environnement visual studio 2008 pour la compilation et l'exécution ?
Messages postés
3834
Date d'inscription
dimanche 12 décembre 2004
Statut
Modérateur
Dernière intervention
20 octobre 2021
124
Voici une version légèrement modifiée. Il ne te reste qu'à finir de coder la fonction compute_intersect.
Il suffit simplement de ne conserver que les lignes présentes à la fois dans le 1er et le 2ème tableau donné en argument.

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

#define MAX_SIZE 1024

char* strndup(const char *str, size_t n)
{
  char *ret = malloc((n+1) * sizeof (char));

  if (!ret)
    exit(0);  strncpy(ret, str, n);
  ret[n] = 0;

  return ret;
}

void free_tab(char** t)
{
  char** head = t;

  while (t && *t)
  {
    free(*t);
    t++;

  }
  free(head);
}

char** get_word(const char* str)
{
  char* pos = NULL;
  char** res = NULL;
  int nb = 0;

  do
  {
    int size = 0;

    pos = strchr(str, ' ');
    if (pos)
      size = pos - str;    else
      size = strlen(str) - 1; /* - 1 to get rid of \n */
    nb++;
    res = realloc(res, (nb + 1) * sizeof (char*));
    res[nb -1] = strndup(str,  size);
    str = pos + 1;
  }
  while (pos);

  res[nb] = 0;

  return res;
}

int is_same(const char* const s1, const char* const s2)
{
  char **t1, **t2;
  int ret = 0;

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

  if (t1 && t2)
  {
    char** tab1 = t1;
    char** tab2 = t2;
    int nb = 0;
    int size = 0;

    while (tab1 && *tab1)
    {
      tab2 = t2;
      while (tab2 && *tab2)
      {
if (!strcmp(*tab1, *tab2))
  nb++;
tab2++;
      }      tab1++;
      size++;
    }

    ret = (nb >= size);
    free_tab(t1);
    free_tab(t2);
  }

  return ret;
}

char** compare_file(const char* filename1, const char* filename2)
{
  FILE *f, *f1;
  char s[MAX_SIZE], s1[MAX_SIZE];
  int a;
  char** res = NULL;
  int nb = 0;

  f = fopen(filename1, "r");
  f1 = fopen(filename2, "r");
  if (f && f1)
  {
    while (fgets(s, MAX_SIZE, f))
    {
      a = 0;
      rewind(f1);
      while (fgets(s1, MAX_SIZE, f1))
      {
if (is_same(s, s1))
{
  a = 1;
  break;
}
      }
      if (!a)
      {
nb++;
res = realloc(res, (nb + 1) * sizeof (char*));
res[nb - 1] = strndup(s, strlen(s) - 1); /* Get rid of the \n */
res[nb] = 0;
      }
    }
    fclose(f);
    fclose(f1);
  }

  return res;
}

char** copy_tab(char** tab)
{
  char** res = NULL;
  int nb = 0;

  while (tab && *tab)
  {
    nb++;
    res = realloc(res, (nb + 1) * sizeof (char*));
    res[nb - 1] = strndup(*tab, strlen(*tab));
    res[nb] = 0;
    tab++;
  }

  return res;
}

char** compute_intersect(char** tab1, char** tab2)
{
  if (!tab2)
    return NULL;
  if (!tab1)
    return copy_tab(tab2);

  /* Ici finir de coder l'intersection */

  return NULL;
}

void display_tab(char** tab)
{
  while (tab && *tab)
  {
    printf("%s\n", *tab);
    tab++;
  }
}

int main()
{
  char** res = NULL;
  char** intersect = NULL;
  char input[32];
  int i;

  for (i = 1; i <= 3; i++)
  {
    sprintf(input,"f%d.txt",i);
    res = compare_file("f.txt",input);
    /* temp */
    printf("Comparing f.txt and %s:\n", input);
    display_tab(res);
    /* ! temp */
    intersect = compute_intersect(intersect, res);
    free_tab(res);
  }

  printf("Final result:\n");
  display_tab(intersect);
  free_tab(intersect);

  return 0;
}
Messages postés
393
Date d'inscription
lundi 22 juin 2009
Statut
Membre
Dernière intervention
23 décembre 2011
5
Bonjour,

J'ai eu le même problème: la compilation se passe bien mais l'exécution ne termine pas correctement.
Avec quel outil sous windows vous avez testé la solution ?

Je suis entrain de programmer avec visual studio 2008.
J'ai ajouté quelques affichages "printf" dans la fonction main et la fonction compare_file pour voir la source de d'erreur.

J'ai remarqué que le programme fait seulement une comparaison entre f.txt et f1.txt puis il exécute la fonction "compare_file" puis il ne retourne pas à la fonction "main" puisque il n'affiche pas l'instrcution:

printf("Comparing f.txt and %s:\n", input);

Voici le code auquel jai ajouté des "printf"

#include <stdio.h>

#include <stdlib.h>

#include <string.h>



#define MAX_SIZE 1024



char* strndup(const char *str, size_t n)

{

  char *ret = malloc((n+1) * sizeof (char));



  if (!ret)

    exit(0);  strncpy(ret, str, n);

  ret[n] = 0;



  return ret;

}



void free_tab(char** t)

{

  char** head = t;



  while (t && *t)

  {

    free(*t);

    t++;



  }

  free(head);

}



char** get_word(const char* str)

{

  char* pos = NULL;

  char** res = NULL;

  int nb = 0;



  do

  {

    int size = 0;



    pos = strchr(str, ' ');

    if (pos)

      size = pos - str;    else

      size = strlen(str) - 1; /* - 1 to get rid of \n */

    nb++;

    res = realloc(res, (nb + 1) * sizeof (char*));

    res[nb -1] = strndup(str,  size);

    str = pos + 1;

  }

  while (pos);



  res[nb] = 0;



  return res;

}



int is_same(const char* const s1, const char* const s2)

{

  char **t1, **t2;

  int ret = 0;



  t1 = get_word(s1);

  t2 = get_word(s2);



  if (t1 && t2)

  {

    char** tab1 = t1;

    char** tab2 = t2;

    int nb = 0;

    int size = 0;



    while (tab1 && *tab1)

    {

      tab2 = t2;

      while (tab2 && *tab2)

      {

if (!strcmp(*tab1, *tab2))

  nb++;

tab2++;

      }      tab1++;

      size++;

    }



    ret = (nb >= size);

    free_tab(t1);

    free_tab(t2);

  }



  return ret;

}



char** compare_file(const char* filename1, const char* filename2)

{

  FILE *f, *f1;

  char s[MAX_SIZE], s1[MAX_SIZE];

  int a;

  char** res = NULL;

  int nb = 0;



  f = fopen(filename1, "r");

  f1 = fopen(filename2, "r");

  if (f && f1)

  {

    while (fgets(s, MAX_SIZE, f))

    {
         printf("s=%s\n",s);
      a = 0;

      rewind(f1);

      while (fgets(s1, MAX_SIZE, f1))

      {
 printf("s1=%s\n",s1);
if (is_same(s, s1))

{
 printf("eagle=%s\n",s);
  a = 1;

  break;

}

      }

      if (!a)

      {
 printf("non egale=%s\n",s);
nb++;

res = realloc(res, (nb + 1) * sizeof (char*));

res[nb - 1] = strndup(s, strlen(s) - 1); /* Get rid of the \n */

res[nb] = 0;

      }

    }

    fclose(f);

    fclose(f1);

  }



  return res;

}



char** copy_tab(char** tab)

{

  char** res = NULL;

  int nb = 0;



  while (tab && *tab)

  {

    nb++;

    res = realloc(res, (nb + 1) * sizeof (char*));

    res[nb - 1] = strndup(*tab, strlen(*tab));

    res[nb] = 0;

    tab++;

  } 



  return res;

}



char** compute_intersect(char** tab1, char** tab2)

{

  if (!tab2)

    return NULL;

  if (!tab1)

    return copy_tab(tab2);



  /* Ici finir de coder l'intersection */



  return NULL;

}



void display_tab(char** tab)

{

  while (tab && *tab)

  {

    printf("%s\n", *tab);

    tab++;

  }

}



int main()

{

  char** res = NULL;

  char** intersect = NULL;

  char input[32];

  int i;



  for (i = 1; i <= 3; i++)

  {
  printf("%d\n",i);
    sprintf(input,"f%d.txt",i);
    printf("%s\n",input);
    res = compare_file("f.txt",input);

    /* temp */
 
    printf("Comparing f.txt and %s:\n", input);

    display_tab(res);

    /* ! temp */

   // intersect = compute_intersect(intersect, res);

    free_tab(res);

  }



  printf("Final result:\n");

  display_tab(intersect);

  free_tab(intersect);



  return 0;

}


J'obtiens après la compilation et l'exécution l'affichage suivant:

1
f1.txt
s=a b

s1=a

s1=d a

s1=c a

s1=b c a
retour=a b

s=a c

s1=a

s1=d a

s1=c a

eagle=a c

s=a d

s1=a

s1=d a

eagle=a d

s=b c

s1=a

s1=d a

s1=c a

s1=b c a
eagle=b c

s=b d

s1=a

s1=d a

s1=c a

s1=b c a
retour=b d

s=c d

s1=a

s1=d a

s1=c a

s1=b c a
retour=c d

s=a b c

s1=a

s1=d a

s1=c a

s1=b c a
retour=a b c

s=a b d

s1=a

s1=d a

s1=c a

s1=b c a
retour=a b d

s=b c d

s1=a

s1=d a

s1=c a

s1=b c a
retour=b c d

s=a c d

s1=a

s1=d a

s1=c a

s1=b c a
retour=a c d

s=a b c d
s1=a


Process returned -1073741819 <0 * C0000005>
Press any key to continue.

Une exception win 32 non gérée s'est produite dans comparaison .exe .


De plus, j'ai testé la solution avec code blocks alors j'obtiens le même problème de l'exécution:



1
f1.txt
s=a b

s1=a

s1=d a

s1=c a

s1=b c a
retour=a b

s=a c

s1=a

s1=d a

s1=c a

eagle=a c

s=a d

s1=a

s1=d a

eagle=a d

s=b c

s1=a

s1=d a

s1=c a

s1=b c a
eagle=b c

s=b d

s1=a

s1=d a

s1=c a

s1=b c a
retour=b d

s=c d

s1=a

s1=d a

s1=c a

s1=b c a
retour=c d

s=a b c

s1=a

s1=d a

s1=c a

s1=b c a
retour=a b c

s=a b d

s1=a

s1=d a

s1=c a

s1=b c a
retour=a b d

s=b c d

s1=a

s1=d a

s1=c a

s1=b c a
retour=b c d

s=a c d

s1=a

s1=d a

s1=c a

s1=b c a
retour=a c d

s=a b c d
s1=a


Process returned -1073741819 <0 * C0000005>
Press any key to continue.


Je suis bloquée.
J'ai besoin de votre aide pour savoir la source de ce problème de l'exécution.

Merci.
Messages postés
3834
Date d'inscription
dimanche 12 décembre 2004
Statut
Modérateur
Dernière intervention
20 octobre 2021
124
Je n'ai testé que sous linux. Tout fonctionne bien, j'obtiens le résultat suivant:

1
f1.txt
s=a b

s1=a

s1=d a

s1=c a

s1=b c a

eagle=a b

s=a c

s1=a

s1=d a

s1=c a

eagle=a c

s=a d

s1=a

s1=d a

eagle=a d

s=b c

s1=a

s1=d a

s1=c a

s1=b c a

eagle=b c

s=b d

s1=a

s1=d a

s1=c a

s1=b c a

non egale=b d

s=c d

s1=a

s1=d a

s1=c a

s1=b c a

non egale=c d

s=a b c

s1=a

s1=d a

s1=c a

s1=b c a

eagle=a b c

s=a b d

s1=a

s1=d a

s1=c a

s1=b c a

non egale=a b d

s=b c d

s1=a

s1=d a

s1=c a

s1=b c a

non egale=b c d

s=a c d

s1=a

s1=d a

s1=c a

s1=b c a

non egale=a c d

s=a b c d

s1=a

s1=d a

s1=c a

s1=b c a

non egale=a b c d

Comparing f.txt and f1.txt:
b d
c d
a b d
b c d
a c d
a b c d
2
f2.txt
s=a b

s1=a

s1=c

s1=b

s1=d

s1=b a

eagle=a b

s=a c

s1=a

s1=c

s1=b

s1=d

s1=b a

s1=d a

s1=b c

s1=d c

s1=b c a

eagle=a c

s=a d

s1=a

s1=c

s1=b

s1=d

s1=b a

s1=d a

eagle=a d

s=b c

s1=a

s1=c

s1=b

s1=d

s1=b a

s1=d a

s1=b c

eagle=b c

s=b d

s1=a

s1=c

s1=b

s1=d

s1=b a

s1=d a

s1=b c

s1=d c

s1=b c a

non egale=b d

s=c d

s1=a

s1=c

s1=b

s1=d

s1=b a

s1=d a

s1=b c

s1=d c

eagle=c d

s=a b c

s1=a

s1=c

s1=b

s1=d

s1=b a

s1=d a

s1=b c

s1=d c

s1=b c a

eagle=a b c

s=a b d

s1=a

s1=c

s1=b

s1=d

s1=b a

s1=d a

s1=b c

s1=d c

s1=b c a

non egale=a b d

s=b c d

s1=a

s1=c

s1=b

s1=d

s1=b a

s1=d a

s1=b c

s1=d c

s1=b c a

non egale=b c d

s=a c d

s1=a

s1=c

s1=b

s1=d

s1=b a

s1=d a

s1=b c

s1=d c

s1=b c a

non egale=a c d

s=a b c d

s1=a

s1=c

s1=b

s1=d

s1=b a

s1=d a

s1=b c

s1=d c

s1=b c a

non egale=a b c d

Comparing f.txt and f2.txt:
b d
a b d
b c d
a c d
a b c d
3
f3.txt
s=a b

s1=a

s1=b

s1=c

s1=c a

s1=d a

s1=b a

eagle=a b

s=a c

s1=a

s1=b

s1=c

s1=c a

eagle=a c

s=a d

s1=a

s1=b

s1=c

s1=c a

s1=d a

eagle=a d

s=b c

s1=a

s1=b

s1=c

s1=c a

s1=d a

s1=b a

s1=b c

eagle=b c

s=b d

s1=a

s1=b

s1=c

s1=c a

s1=d a

s1=b a

s1=b c

s1=b c a

non egale=b d

s=c d

s1=a

s1=b

s1=c

s1=c a

s1=d a

s1=b a

s1=b c

s1=b c a

non egale=c d

s=a b c

s1=a

s1=b

s1=c

s1=c a

s1=d a

s1=b a

s1=b c

s1=b c a

eagle=a b c

s=a b d

s1=a

s1=b

s1=c

s1=c a

s1=d a

s1=b a

s1=b c

s1=b c a

non egale=a b d

s=b c d

s1=a

s1=b

s1=c

s1=c a

s1=d a

s1=b a

s1=b c

s1=b c a

non egale=b c d

s=a c d

s1=a

s1=b

s1=c

s1=c a

s1=d a

s1=b a

s1=b c

s1=b c a

non egale=a c d

s=a b c d

s1=a

s1=b

s1=c

s1=c a

s1=d a

s1=b a

s1=b c

s1=b c a

non egale=a b c d

Comparing f.txt and f3.txt:
b d
c d
a b d
b c d
a c d
a b c d
Final result:


Je vais tester sous windows (j'ai pris dev-c++, pas aussi bien que Visual, mais moins lourd).
Messages postés
3834
Date d'inscription
dimanche 12 décembre 2004
Statut
Modérateur
Dernière intervention
20 octobre 2021
124
Je viens de tester à l'instant ton code sous Windows avec Dev-C++ : Aucun problème j'ai exactement le même résultat que sous linux.
Messages postés
393
Date d'inscription
lundi 22 juin 2009
Statut
Membre
Dernière intervention
23 décembre 2011
5
J'ai utilisé le debugger de visual sudio 2008.
Voici le résultat:

Exception non gérée à 0*1026fb89(msvcr90d.dll) dans comparaison .exe:
0*C0000005 : violation d'accées mlors de l'écriture à l'emplacement 0*0033a000.

De plus, à coté de la fenetre main il y a une apparition d'une autre fenetre strncpy.asm

Voici l'affichage de la sortie de debugeur:

'comparaison.exe' : Chargé 'C:\comparaison\Debug\comparaison.exe', Les symboles ont été chargés.
'comparaison.exe' : Chargé 'C:\WINDOWS\system32\ntdll.dll'
'comparaison.exe' : Chargé 'C:\WINDOWS\system32\kernel32.dll'
'comparaison.exe' : Chargé 'C:\WINDOWS\WinSxS\x86_Microsoft.VC90.DebugCRT_1fc8b3b9a1e18e3b_9.0.21022.8_x-ww_597c3456\msvcr90d.dll', Les symboles ont été chargés.
'comparaison.exe' : Chargé 'C:\Program Files\SuperCopier2\SC2Hook.dll', Le fichier binaire n'a pas été généré avec les informations de débogage.
'comparaison.exe' : Chargé 'C:\WINDOWS\system32\user32.dll'
'comparaison.exe' : Chargé 'C:\WINDOWS\system32\gdi32.dll'
'comparaison.exe' : Chargé 'C:\WINDOWS\system32\advapi32.dll'
'comparaison.exe' : Chargé 'C:\WINDOWS\system32\rpcrt4.dll'
'comparaison.exe' : Chargé 'C:\WINDOWS\system32\oleaut32.dll'
'comparaison.exe' : Chargé 'C:\WINDOWS\system32\msvcrt.dll'
'comparaison.exe' : Chargé 'C:\WINDOWS\system32\ole32.dll'
'comparaison.exe' : Chargé 'C:\WINDOWS\system32\imm32.dll'
'comparaison.exe' : Chargé 'C:\WINDOWS\system32\lpk.dll'
'comparaison.exe' : Chargé 'C:\WINDOWS\system32\usp10.dll'
Exception de première chance à 0x1026fb89 (msvcr90d.dll) dans comparaison.exe : 0xC0000005: Violation d'accès lors de l'écriture à l'emplacement 0x0033a000.
Exception non gérée à 0x1026fb89 (msvcr90d.dll) dans comparaison.exe : 0xC0000005: Violation d'accès lors de l'écriture à l'emplacement 0x0033a000.
Exception de première chance à 0x1026fb89 (msvcr90d.dll) dans comparaison.exe : 0xC0000005: Violation d'accès lors de l'écriture à l'emplacement 0x0033a000.
Exception non gérée à 0x1026fb89 (msvcr90d.dll) dans comparaison.exe : 0xC0000005: Violation d'accès lors de l'écriture à l'emplacement 0x0033a000.
Exception de première chance à 0x1026fb89 (msvcr90d.dll) dans comparaison.exe : 0xC0000005: Violation d'accès lors de l'écriture à l'emplacement 0x0033a000.
Exception non gérée à 0x1026fb89 (msvcr90d.dll) dans comparaison.exe : 0xC0000005: Violation d'accès lors de l'écriture à l'emplacement 0x0033a000.
Exception de première chance à 0x1026fb89 (msvcr90d.dll) dans comparaison.exe : 0xC0000005: Violation d'accès lors de l'écriture à l'emplacement 0x0033a000.
Exception non gérée à 0x1026fb89 (msvcr90d.dll) dans comparaison.exe : 0xC0000005: Violation d'accès lors de l'écriture à l'emplacement 0x0033a000.
Exception de première chance à 0x1026fb89 (msvcr90d.dll) dans comparaison.exe : 0xC0000005: Violation d'accès lors de l'écriture à l'emplacement 0x0033a000.
Exception non gérée à 0x1026fb89 (msvcr90d.dll) dans comparaison.exe : 0xC0000005: Violation d'accès lors de l'écriture à l'emplacement 0x0033a000.
Exception de première chance à 0x1026fb89 (msvcr90d.dll) dans comparaison.exe : 0xC0000005: Violation d'accès lors de l'écriture à l'emplacement 0x0033a000.
Exception non gérée à 0x1026fb89 (msvcr90d.dll) dans comparaison.exe : 0xC0000005: Violation d'accès lors de l'écriture à l'emplacement 0x0033a000.
Exception de première chance à 0x1026fb89 (msvcr90d.dll) dans comparaison.exe : 0xC0000005: Violation d'accès lors de l'écriture à l'emplacement 0x0033a000.
Exception non gérée à 0x1026fb89 (msvcr90d.dll) dans comparaison.exe : 0xC0000005: Violation d'accès lors de l'écriture à l'emplacement 0x0033a000.
Exception de première chance à 0x1026fb89 (msvcr90d.dll) dans comparaison.exe : 0xC0000005: Violation d'accès lors de l'écriture à l'emplacement 0x0033a000.
Exception non gérée à 0x1026fb89 (msvcr90d.dll) dans comparaison.exe : 0xC0000005: Violation d'accès lors de l'écriture à l'emplacement 0x0033a000.
Exception de première chance à 0x1026fb89 (msvcr90d.dll) dans comparaison.exe : 0xC0000005: Violation d'accès lors de l'écriture à l'emplacement 0x0033a000.
Exception non gérée à 0x1026fb89 (msvcr90d.dll) dans comparaison.exe : 0xC0000005: Violation d'accès lors de l'écriture à l'emplacement 0x0033a000.
Exception de première chance à 0x1026fb89 (msvcr90d.dll) dans comparaison.exe : 0xC0000005: Violation d'accès lors de l'écriture à l'emplacement 0x0033a000.
Exception non gérée à 0x1026fb89 (msvcr90d.dll) dans comparaison.exe : 0xC0000005: Violation d'accès lors de l'écriture à l'emplacement 0x0033a000.
Exception de première chance à 0x1026fb89 (msvcr90d.dll) dans comparaison.exe : 0xC0000005: Violation d'accès lors de l'écriture à l'emplacement 0x0033a000.
Exception non gérée à 0x1026fb89 (msvcr90d.dll) dans comparaison.exe : 0xC0000005: Violation d'accès lors de l'écriture à l'emplacement 0x0033a000.
Exception de première chance à 0x1026fb89 (msvcr90d.dll) dans comparaison.exe : 0xC0000005: Violation d'accès lors de l'écriture à l'emplacement 0x0033a000.
Exception non gérée à 0x1026fb89 (msvcr90d.dll) dans comparaison.exe : 0xC0000005: Violation d'accès lors de l'écriture à l'emplacement 0x0033a000.
Exception de première chance à 0x1026fb89 (msvcr90d.dll) dans comparaison.exe : 0xC0000005: Violation d'accès lors de l'écriture à l'emplacement 0x0033a000.
Exception non gérée à 0x1026fb89 (msvcr90d.dll) dans comparaison.exe : 0xC0000005: Violation d'accès lors de l'écriture à l'emplacement 0x0033a000.
Exception de première chance à 0x1026fb89 (msvcr90d.dll) dans comparaison.exe : 0xC0000005: Violation d'accès lors de l'écriture à l'emplacement 0x0033a000.
Exception non gérée à 0x1026fb89 (msvcr90d.dll) dans comparaison.exe : 0xC0000005: Violation d'accès lors de l'écriture à l'emplacement 0x0033a000.
Exception de première chance à 0x1026fb89 (msvcr90d.dll) dans comparaison.exe : 0xC0000005: Violation d'accès lors de l'écriture à l'emplacement 0x0033a000.
Exception non gérée à 0x1026fb89 (msvcr90d.dll) dans comparaison.exe : 0xC0000005: Violation d'accès lors de l'écriture à l'emplacement 0x0033a000.
Exception de première chance à 0x1026fb89 (msvcr90d.dll) dans comparaison.exe : 0xC0000005: Violation d'accès lors de l'écriture à l'emplacement 0x0033a000.
Exception non gérée à 0x1026fb89 (msvcr90d.dll) dans comparaison.exe : 0xC0000005: Violation d'accès lors de l'écriture à l'emplacement 0x0033a000.
Exception de première chance à 0x1026fb89 (msvcr90d.dll) dans comparaison.exe : 0xC0000005: Violation d'accès lors de l'écriture à l'emplacement 0x0033a000.
Exception non gérée à 0x1026fb89 (msvcr90d.dll) dans comparaison.exe : 0xC0000005: Violation d'accès lors de l'écriture à l'emplacement 0x0033a000.
Exception de première chance à 0x1026fb89 (msvcr90d.dll) dans comparaison.exe : 0xC0000005: Violation d'accès lors de l'écriture à l'emplacement 0x0033a000.
Exception non gérée à 0x1026fb89 (msvcr90d.dll) dans comparaison.exe : 0xC0000005: Violation d'accès lors de l'écriture à l'emplacement 0x0033a000.



De plus j'ai utilisé le deboggeur de code blocks alors il me donne :

Building to ensure sources are up-to-date
Build succeeded
Selecting target:
Debug
Adding source dir: C:\between\
Adding source dir: C:\between\
Adding file: bin\Debug\between.exe
Starting debugger:
done
Registered new type: wxString
Registered new type: STL String
Registered new type: STL Vector
Setting breakpoints
Debugger name and version: GNU gdb 6.7.50.20071127
Child process PID: 3676
Program received signal SIGSEGV, Segmentation fault.
In strncpy () (C:\WINDOWS\system32\msvcrt.dll)


les deux debogeurs indiquent que le problème est dans la foncntion strncpy ()

J'ai besoin de vos aides car je suis bloquée .

Merci.
Messages postés
393
Date d'inscription
lundi 22 juin 2009
Statut
Membre
Dernière intervention
23 décembre 2011
5
Bonjour,
Que pensez vous ? et comment je ce problème va être résolu.

Merci.
Messages postés
3834
Date d'inscription
dimanche 12 décembre 2004
Statut
Modérateur
Dernière intervention
20 octobre 2021
124
C'est vraiment bizarre il dit que strncpy bug... Alors que ça fonctionne très bien chez moi !

2 tentatives:

* Essaie de changer la fonction strndup par ceci:

char* strndup(const char *str, size_t n)
{
  char *ret = malloc((n+1) * sizeof (char));
  if (!ret)
    exit(0);

  ret = strncpy(ret, str, n);
  ret[n] = 0;
  return ret;
}


* Si ça ne résoud pas le problème écrit ta propre fonction "my_strncpy".
Messages postés
393
Date d'inscription
lundi 22 juin 2009
Statut
Membre
Dernière intervention
23 décembre 2011
5
Bonjour,

J'ai essayé avec ce code
char* strndup(const char *str, size_t n)

{

  char *ret = malloc((n+1) * sizeof (char));

  if (!ret)

    exit(0);



  ret = strncpy(ret, str, n);

  ret[n] = 0;

  return ret;

}



Mais le même problème.
Je ne sais pourquoi la fonction strncpy ne marche pas bien ?
je crois que à moment donnée les paramètres de cette fonction ne sont pas affectées ou bien ils sont indéfinis.
Que pensez vous ?

* Si ça ne résoud pas le problème écrit ta propre fonction "my_strncpy".


Qu'est ce je vais mettre dans cette fonction ?

Merci.
Messages postés
3834
Date d'inscription
dimanche 12 décembre 2004
Statut
Modérateur
Dernière intervention
20 octobre 2021
124
Voici la code de my_strncpy:
Pense à changer tout les appels à strncpy par my_strncpy dans ton code.

char* my_strncpy(char* to, const char* from, size_t size)
{
  char* head = to;

  while (from && *from && size > 0)
  {
    *to = * from;
    to++;
    from++;
    --size;
  }
  *to = 0;

  return head;
}
Messages postés
393
Date d'inscription
lundi 22 juin 2009
Statut
Membre
Dernière intervention
23 décembre 2011
5
Bonsoir,

J'ai copie le code de la fonction my_strncpy dans mon programme C avec visual studio sous windows. Alors la compilation se passe bien mais l'exécution ne passe pas bien et j'obtiens le message suivant:
Debug Error !

Program: c:\comparaison\debug\comparaison.exe

HEAP CORRUPTION DETECTED : before Normal Block (#408) at 0*00338108.
CRT detected that the last application wrote to memory before start of heap buffer.

S'il vous plait, j'ai besoin de votre aide.

Merci.
Messages postés
393
Date d'inscription
lundi 22 juin 2009
Statut
Membre
Dernière intervention
23 décembre 2011
5
Bonsoir,
J'ai posé un point d'arrêt sur la ligne où il y a l'appel à strncpy dans l'ancien version
lorsque le programme s'arrête, j'ai regardé les paramètres qui vont être passés à strncpy.
Voici ces valeurs:
Nom Valeur Type
n 1 unsigned int
ret 0x00339210 "ÍÍýýýý««««««««îþ" char *
str 0x0012fa1c "a b" const char *



Signifie quoi ces valeurs ?
Les paramètres sont bien passés ?

Merci.
Messages postés
3834
Date d'inscription
dimanche 12 décembre 2004
Statut
Modérateur
Dernière intervention
20 octobre 2021
124
Tu as mis des options de compilations spéciales sous Visual ? Je n'ai toujours aucun problème !

Ces valeurs sont normales. "ret" a été alloué, mais n'a pas été initialisé, donc ce qu'il contient est indeterminé. Essaies de débugger ligne pas ligne, jusqu'à arriver au moment où l'erreur se produit. Vu que le code fonctionne chez moi (Windows et Linux), je ne vois pas ce qui ne va pas.
Messages postés
393
Date d'inscription
lundi 22 juin 2009
Statut
Membre
Dernière intervention
23 décembre 2011
5
Bonjour,
J'ai pris de nouveau le code de première solution alors pas de problème en compilation et en exécution.
Voici votre code en laissant la fonction strncpy :
#include <stdio.h>

#include <stdlib.h>

#include <string.h>



#define MAX_SIZE 1024



char* strndup(const char *str, size_t n)

{

  char *ret = malloc((n+1) * sizeof (char));



  if (!ret)

    exit(0);  strncpy(ret, str, n);

  ret[n] = 0;



  return ret;

}



void free_tab(char** t)

{

  char** head = t;



  while (t && *t)

  {

    free(*t);

    t++;



  }

  free(head);

}



char** get_word(const char* str)

{

  char* pos = NULL;

  char** res = NULL;

  int nb = 0;



  do

  {

    int size = 0;



    pos = strchr(str, ' ');

    if (pos)

      size = pos - str;    else

      size = strlen(str) - 1; /* - 1 to get rid of \n */

    nb++;

    res = realloc(res, (nb + 1) * sizeof (char*));

    res[nb -1] = strndup(str,  size);

    str = pos + 1;

  }

  while (pos);



  res[nb] = 0;



  return res;

}



int is_same(const char* const s1, const char* const s2)

{

  char **t1, **t2;

  int ret = 0;



  t1 = get_word(s1);

  t2 = get_word(s2);



  if (t1 && t2)

  {

    char** tab1 = t1;

    char** tab2 = t2;

    int nb = 0;

    int size = 0;



    while (tab1 && *tab1)

    {

      tab2 = t2;

      while (tab2 && *tab2)

      {

if (!strcmp(*tab1, *tab2))

  nb++;

tab2++;

      }      tab1++;

      size++;

    }



    ret = (nb >= size);

    free_tab(t1);

    free_tab(t2);

  }



  return ret;

}



char** compare_file(const char* filename1, const char* filename2)

{

  FILE *f, *f1;

  char s[MAX_SIZE], s1[MAX_SIZE];

  int a;

  char** res = NULL;

  int nb = 0;



  f = fopen(filename1, "r");

  f1 = fopen(filename2, "r");

  if (f && f1)

  {

    while (fgets(s, MAX_SIZE, f))

    {

      a = 0;

      rewind(f1);

      while (fgets(s1, MAX_SIZE, f1))

      {

if (is_same(s, s1))

{

  a = 1;

  break;

}

      }

      if (!a)

      {

nb++;

res = realloc(res, (nb + 1) * sizeof (char*));

res[nb - 1] = strndup(s, strlen(s) - 1); /* Get rid of the \n */

res[nb] = 0;

      }

    }

    fclose(f);

    fclose(f1);

  }



  return res;

}



char** copy_tab(char** tab)

{

  char** res = NULL;

  int nb = 0;



  while (tab && *tab)

  {

    nb++;

    res = realloc(res, (nb + 1) * sizeof (char*));

    res[nb - 1] = strndup(*tab, strlen(*tab));

    res[nb] = 0;

    tab++;

  }



  return res;

}



char** compute_intersect(char** tab1, char** tab2)

{

  if (!tab2)

    return NULL;

  if (!tab1)

    return copy_tab(tab2);



  /* Ici finir de coder l'intersection */



  return NULL;

}



void display_tab(char** tab)

{

  while (tab && *tab)

  {

    printf("%s\n", *tab);

    tab++;

  }

}



int main()

{

  char** res = NULL;

  char** intersect = NULL;

  char input[32];

  int i;



  for (i = 1; i <= 3; i++)

  {

    sprintf(input,"f%d.txt",i);

    res = compare_file("f.txt",input);

    /* temp */

    printf("Comparing f.txt and %s:\n", input);

    display_tab(res);

    /* ! temp */

    intersect = compute_intersect(intersect, res);

    free_tab(res);

  }



  printf("Final result:\n");

  display_tab(intersect);

  free_tab(intersect);



  return 0;

}



J'ai remarqué que l'exécution du ce programme nous donne pas le résultat souhaité concernant la comparaison entre deux fichiers en respectant les deux conditions à savoir l'ignorance de l'ordre des mots et l'inclusion
Après alors l'exécution du ce programme j'obtiens:

Comparing f.txt and f1.txt:
a b
b d
c d
a b c
a b d
b c d
a c d
a b c d
Comparing f.txt and f2.txt:
a c
b d
a b c
a b d
b c d
a c d
a b c d
Comparing f.txt and f3.txt:
b d
c d
a b c
a b d
b c d
a c d
a b c d
Final result:
Appuyez sur une touche pour continuer...


Mais, le résultat souhaité est:

Comparing f.txt and f1.txt:
b d
c d
a b d
b c d
a c d
a b c d
Comparing f.txt and f2.txt:
b d
a b d
b c d
a c d
a b c d
Comparing f.txt and f3.txt:
b d
c d
a b d
b c d
a c d
a b c d
Final result:
Appuyez sur une touche pour continuer...


A titre d'information, le contenu des fichiers est:
"f.txt"
a b
a c
a d
b c
b d
c d
a b c
a b d
b c d
a c d
a b c d

"f1.txt"
a
d a
c a
b c a

"f2.txt"
a
c
b
d
b a
d a
b c
d c
b c a

"f3.txt"
a
b
c
c a
d a
b a
b c
b c a

Que pensez vous ? et que proposez vous ?

Merci.
Messages postés
3834
Date d'inscription
dimanche 12 décembre 2004
Statut
Modérateur
Dernière intervention
20 octobre 2021
124
Le code que tu viens de copier coller me donne le bon résultat:


Comparing f.txt and f1.txt:
b d
c d
a b d
b c d
a c d
a b c d
Comparing f.txt and f2.txt:
b d
a b d
b c d
a c d
a b c d
Comparing f.txt and f3.txt:
b d
c d
a b d
b c d
a c d
a b c d
Final result:
b d
c d
a b d
b c d
a c d
a b c d


Est-tu sur de compiler le bon fichier ? Pourrais-tu tester tout cela dans un autre compilateur ? C'est très étrange, tout fonctionne à merveille chez moi.
Messages postés
393
Date d'inscription
lundi 22 juin 2009
Statut
Membre
Dernière intervention
23 décembre 2011
5
Bonjour,
J'ai testé le code au dessus dans un nouveau programme C en utilsant code Blocks alors la compilation se passe bien mais l'exécution ne se termine pas correctement.
j'ai remarqué que le programme sort lorsque il arrive à lire la dernière ligne "a b c d" de fichier "f.txt"
donc j'ai supprimé cette ligne "a b c d" du fichier "f.txt"
et j'ai lancé l'exécution alors j'ai cet affichage:

Comparing f.txt and f1.txt:
a b
b d
c d
a b c
a b d
b c d
a c d
Comparing f.txt and f2.txt:
a c
b d
a b c
a b d
b c d
a c d

Comparing f.txt and f3.txt:
b d
c d
a b c
a b d
b c d
a c d
Final result:


Mais, cet affichage n'est pas le vrai résultat.

- Pourquoi lorsque je supprime la dernière ligne "a b c d" du fichier "f.txt" alors l'exécution se passe ?
- je ne sais pas pourquoi pas je n'obtiens le même résultat que vous ?

Vous dites que :
Le code que tu viens de copier coller me donne le bon résultat:


Comparing f.txt and f1.txt:
b d
c d
a b d
b c d
a c d
a b c d
Comparing f.txt and f2.txt:
b d
a b d
b c d
a c d
a b c d
Comparing f.txt and f3.txt:
b d
c d
a b d
b c d
a c d
a b c d
Final result:
b d
c d
a b d
b c d
a c d
a b c d


- Pouvez vous poster le code qui vous permet d'obtenir ce résultat ?
- Pouvez vous aussi poster le contenu des fichiers qui vous êtes entrain de les tester ?
- Si vous avez testé ceci sur windows alors vous utilisez quel compilateur ?

Le temps passe et je ne sais pas qu'est ce que je vais faire.

J'ai besoin de vos aides.

Merci.
Messages postés
3834
Date d'inscription
dimanche 12 décembre 2004
Statut
Modérateur
Dernière intervention
20 octobre 2021
124
- Pouvez vous poster le code qui vous permet d'obtenir ce résultat ?

C'est celui que tu as posté (le tout dernier que tu as copier coller sur ce forum).

- Pouvez vous aussi poster le contenu des fichiers qui vous êtes entrain de les tester ?

C'est ceux que tu as posté ici (f.txt, f1.txt, f2.txt et f3.txt).

- Si vous avez testé ceci sur windows alors vous utilisez quel compilateur ?

Le compilateur intégré dans Dev-C++ 4.9.9, sur un WinXP SP2.
Messages postés
393
Date d'inscription
lundi 22 juin 2009
Statut
Membre
Dernière intervention
23 décembre 2011
5
Bonjour,
1) Mon projet C est fait sous Visual Studio 2008.
Il possède un bon compilateur à mon avis sous windows. De plus, je ne peux pas le changer maintenant.
Je crois que dans la fonction strndup
que vous écrivez plus de donnés qu'il n'y a de place dans ton tableau, en l'occurrence, vous écrivez un byte de trop, donc comportement indéterminé.

Que pensez vous ?

2)
Vous dites que :

Le code que tu viens de copier coller me donne le bon résultat:
Comparing f.txt and f1.txt:
b d
c d
a b d
b c d
a c d
a b c d
Comparing f.txt and f2.txt:
b d
a b d
b c d
a c d
a b c d
Comparing f.txt and f3.txt:
b d
c d
a b d
b c d
a c d
a b c d
Final result:
b d
c d
a b d
b c d
a c d
a b c d


Je ne trouve pas dans le code la partie qui permet d'afficher:
Final result:
b d
c d
a b d
b c d
a c d
a b c d


De plus, l'intersection entre les trois résultats de comparaison nous donne:

b d
a b d
b c d
a c d
a b c d


et le résultat final qui est le but de ce problème est de laisser de l'intersection les lignes qui ne sont pas incluses dans les autres lignes donc nous obtenons :

b d
a c d


C'est possible de me donner la version finale et complète de code qui me répond à mon problème pour le tester une fois pour toute ?

Merci.