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

  FORUM HardWare.fr
  Programmation
  C

  Code C-Lecture de fichiers à partir d'un dossier.

 


 Mot :   Pseudo :  
 
Bas de page
Auteur Sujet :

Code C-Lecture de fichiers à partir d'un dossier.

n°2071824
Bysthourie
Posté le 24-04-2011 à 20:11:20  profilanswer
 

Bonjour,
 
Avant toute chose, je ne peut travailler qu'en code C (donc pas en C++) et mes connaissances vont des bases (tableaux, boucles, fonctions, pointeurs, etc) que j'ai vues en cours (je n'en aurai plus) jusqu'à la manipulation de fichiers (lire, éditer, ouvrir) que j'ai apprise sur internet (site du zéro), enfin bon c'est peut-être de la base pour vous aussi^^. Au niveau de la manipulation de dossiers, je bloque un peu, c'est d'ailleurs pourquoi je viens vous demander de l'aide:  
 
Dans le cadre d'un projet informatique, je dois télécharger un dossier sur un site internet; dossier dans lequel se trouvent des centaines de fichiers avec des données chiffrées dans chaque fichier(je vous donne un modèle):
 
01  01  2001 25
01  02  2001 24.6
         ...
         ...
         ...
25  06  2006 26
 
c'est donc une suite de chiffres présentés sous forme de tableau (ça représente le jour, le mois, l'année et la température...avec un fichier pour chaque ville,donc une centaine de fichiers).
 
Je vous dit ce que j'ai fait dès le début au cas où j'aurai fait une erreur avant de commencer à programmer:
J'ai donc tout d'abord téléchargé le dossier dans C:\ en zip puis j'ai extrait le dossier, que j'ai copié dans mon répertoire Code C, où je mets mes autres programmes jGrasp.
Il faut donc maintenant que je lise les fichiers du dossier. Les fichiers étant nombreux et ayant des noms complexes, les ouvrir un par un avec fopen pour chaque serait une solution trop longue.
 
Il faut donc que j'ouvre le dossier. L'idéal je pense (car je dois exploiter les données), c'est d'ouvrir le dossier, puis le 1er fichier, mettre les données dans un tabeau, l'exploiter, écraser ce fichier par le 2ème fichier et refaire la même démarche(écraser le tableau précédant), et ce jusqu'au dernier fichier, tout en stockant les résultats de l'exploitation des données.
J'ai donc essayé d'ouvrir le dossier et de faire une boucle qui permet de faire tourner les fichiers. Pour vérifier le bon déroulement du programme, j'ai fait un printf des 20 premiers caractères du fichier ainsi que son nom.
J'ai donc le code suivant :  
 

Code :
  1. #include<stdio.h>
  2. #include<stdlib.h>
  3. #include<dirent.h>
  4.    int main(void)
  5.    {
  6.       DIR *dp=NULL;
  7.       struct dirent *fp=NULL;
  8.       FILE *fa=NULL;
  9.       char chaine[20];
  10.       dp=opendir("Temperature Data Files" );
  11.       fp=readdir(dp);
  12.       while ((fp=readdir(dp))!= NULL)
  13.       {
  14.          printf("Le fichier lu s'appelle '%s'\n",fp->d_name);
  15.          fa=fopen("fp","rt" );
  16.          while(fgets(chaine,20,fa)!=NULL)
  17.          {
  18.             printf("%s",chaine);
  19.          }
  20.          fclose(fa);
  21.       }
  22.       closedir(dp);
  23.       return 0;
  24.    }


 
J'obtiens bien les noms des fichiers qui se trouvent dans le dossier (enfin juste les derniers mais je crois que c'est par manque de place dans la fenêtre) mais je n'ai pas les 20 premiers caractères.
Avant de manipuler les dossiers, j'ai fait la même chose sur le 1er fichier du dossier :
 

Code :
  1. #include<stdio.h>
  2. #include<stdlib.h>
  3.    int main(void)
  4.    {
  5.       char chaine[1000];
  6.       FILE *fp = NULL;
  7.       fp=fopen("ABTIRANA2.txt","rt" );
  8.       while(fgets(chaine,1000,fp) != NULL)
  9.       {
  10.          printf("%s", chaine);
  11.       }
  12.       fclose(fp);
  13.       return 0;
  14.    }


 
Ici, j'ai bien le contenu du fichier.
Le fichier exploité n'est pas dans le dossier (j'en ai fait une copie un niveau plus haut, où j'ai tous mes programmes jGrasp ainsi que le fameux dossier) car si je prends directement le fichier dans le dossier, ça ne marche pas (c'est peut-être une des raisons de mon problème)
 
Sinon, autre petite question: sur l'énoncé il est écrit que je dois utiliser, entre autres, fread et feof...d'après ce que j'ai lu sur internet, on peut tout faire avec fgets (donc sans fread, mais peut être plus facile avec fread?) et pour feof, détecter la fin du fichier n'est pas indispensable grace à la boucle

Code :
  1. while ((fp=readdir(dp))!= NULL)
  2.       {
  3. ...
  4. }


Je me trompe?
 
Merci d'avance pour votre aide que j'apprécie et sachez, même si ça n'a pas d'importance que vous n'aidez pas seulement une personne qui doit rendre un devoir, mais une personne qui s'intéresse à la programmation (et qui en fait tous les week-ends malgré le fait que mes études n'ont pas trop de lien avec l'informatique)
 
Bonne journée à tous !

mood
Publicité
Posté le 24-04-2011 à 20:11:20  profilanswer
 

n°2071830
gilou
Modérateur
Modzilla
Posté le 24-04-2011 à 21:19:10  profilanswer
 

Citation :

fa=fopen("fp","rt" );


C'est faux ça! la tu essayes d'ouvrir un fichier nommé fp.
Il faudrait lire la page man de fopen (qui n'a jamais pris de t comme paramètre de mode de lecture que je sache) avant de coder.
fa=fopen(fp->d_name,"r" );

 
Code :
  1. dp=opendir("Temperature Data Files" );
  2. fp=readdir(dp);
  3. while ((fp=readdir(dp))!= NULL)

En faisant ceci, tu sautes la première entrée retournée par readdir.
Il va donc falloir faire

Code :
  1. dp=opendir("Temperature Data Files" );
  2. while ((fp = readdir(dp))!= NULL)


Et il faudra sans doute exclure le cas des entrées "." et ".." si readdir les renvoie (il me semble que c'est le cas)

 

A+,


Message édité par gilou le 24-04-2011 à 21:35:50

---------------
There's more than what can be linked! --    Iyashikei Anime Forever!    --  AngularJS c'est un framework d'engulé!  --
n°2071836
Bysthourie
Posté le 24-04-2011 à 22:23:16  profilanswer
 

Citation :

Citation :
 
 
fa=fopen("fp","rt" );
 
 
 
C'est faux ça! la tu essayes d'ouvrir un fichier nommé fp.
Il faudrait lire la page man de fopen (qui n'a jamais pris de t comme paramètre de mode de lecture que je sache) avant de coder.
fa=fopen(fp->d_name,"r" );
 
 


 
J'avais essayé car je trouvais ça louche mais ça me mettait une erreur de compil, du coup j'était revenu en arrière. Mais cette fois j'ai copié ta ligne et pas d'erreur, j'avais du mal taper mon code^^.

Citation :


Code :
 
1.dp=opendir("Temperature Data Files" );
2.fp=readdir(dp);
3.while ((fp=readdir(dp))!= NULL)
 
 
En faisant ceci, tu sautes la première entrée retournée par readdir.
Il va donc falloir faire  
 
 
Code :
 
1.dp=opendir("Temperature Data Files" );
2.while ((fp = readdir(dp))!= NULL)
 
 
 
Et il faudra sans doute exclure le cas des entrées "." et ".." si readdir les renvoie (il me semble que c'est le cas


 
Oui c'est sûr, je sait pas pourquoi j'ai mis cette ligne. Après pour les entrées . et .. je vois bien de quoi il est question, je vais arranger mon programme demain et voir si il y a encore des erreurs
Merci gilou :)

n°2071837
gilou
Modérateur
Modzilla
Posté le 24-04-2011 à 22:26:17  profilanswer
 

J'aurais à coder cela, je procéderais ainsi:

 
Code :
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. #include <dirent.h>
  4. #include <string.h>
  5. #define BUFFER_SIZE 20
  6. int main(void)
  7. {
  8.     char dirname[] = "Temperature Data Files";
  9.     char buffer[BUFFER_SIZE];
  10.     DIR *dp = opendir(dirname);
  11.     if (dp) {
  12.         struct dirent *entry;
  13.         FILE *fp;
  14.         while (entry = readdir(dp)) {
  15.             printf("L'entrée lue s'appelle '%s'\n", entry->d_name); 
  16.             /* Je suppose que "." et ".." sont les seules entrees
  17.                qui sont des repertoires ici. On pourrait ecrire du code
  18.                verifiant que entry n'est pas un repertoire sinon */
  19.             if (strcmp(".", entry->d_name) == 0 ||
  20.                 strcmp("..", entry->d_name) == 0)
  21.                 continue;
  22.             if (fp = fopen(entry->d_name, "r" )) {
  23.                 while (fgets(buffer, BUFFER_SIZE, fp)) {
  24.                     printf("%s\n", buffer); 
  25.                 }
  26.                 fclose(fp);   
  27.             }
  28.         }
  29.         closedir(dp);
  30.         return EXIT_SUCCESS;
  31.     }
  32.     return EXIT_FAILURE;
  33. }


Bon, j'ai pas pu tester, car opendir, readdir et closedir n'ont pas d'équivalent sous windows pour mon compilo (Digital Mars).

 

A+,


Message édité par gilou le 24-04-2011 à 22:37:19

---------------
There's more than what can be linked! --    Iyashikei Anime Forever!    --  AngularJS c'est un framework d'engulé!  --
n°2071895
Bysthourie
Posté le 25-04-2011 à 16:28:08  profilanswer
 

Bonjour!!
 
Alors pour mon code, j'ai tout arrangé comme il faut et j'ai toujours le même résultat: le nom des fichiers mais pas leur contenu. Cependant, je pense vraiment que c'est un problème d'affichage et pas de code car j'ai copié tout ton message et même résultat (il ne tiens pas compte du fgets). Je devrais déja commencer l'exploitation des données voir si il y a réellement un problème. Sinon pour le strcmp(), j'ai fait des recherches et je trouve ça bien utile pour le programme, merci !
 
Edit: je commence l'exploitation maintenant, je reviendrai pour dire si sa bloque encore ou si j'y suis enfin arrivé^^


Message édité par Bysthourie le 25-04-2011 à 16:36:43
n°2071903
tpierron
Posté le 25-04-2011 à 17:34:05  profilanswer
 

Un problème que je vois avec ce code, est que le champ d_name ne contient pas le nom du répertoire qui a été passé en arguement à opendir, donc le fopen() va retourner systématiquement NULL.
 
Bref, une petite modif du genre, ça devrait aller mieux:
 

Code :
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. #include <dirent.h>
  4. #include <string.h>
  5.  
  6. #define BUFFER_SIZE 20
  7. int main(void)
  8. {
  9.    char dirname[] = "Temperature Data Files";
  10.    char buffer[BUFFER_SIZE];
  11.    char filename[256];
  12.    DIR *dp = opendir(dirname);
  13.    if (dp) {
  14.        struct dirent *entry;
  15.        FILE *fp;
  16.        while (entry = readdir(dp)) {
  17.            /* Je suppose que "." et ".." sont les seules entrees
  18.               qui sont des repertoires ici. On pourrait ecrire du code
  19.               verifiant que entry n'est pas un repertoire sinon */
  20.            if (strcmp(".", entry->d_name) == 0 ||
  21.                strcmp("..", entry->d_name) == 0)
  22.                continue;
  23.  
  24.            snprintf(filename, sizeof filename, "%s/%s", dirname, entry->d_name);
  25.            printf("L'entrée lue s'appelle '%s'\n", filename);  
  26.  
  27.            if (fp = fopen(filename, "r" )) {
  28.                while (fgets(buffer, BUFFER_SIZE, fp)) {
  29.                    printf("%s\n", buffer);  
  30.                }
  31.                fclose(fp);    
  32.            }
  33.        }
  34.        closedir(dp);
  35.        return EXIT_SUCCESS;
  36.    }
  37.    return EXIT_FAILURE;
  38. }


n°2071905
gilou
Modérateur
Modzilla
Posté le 25-04-2011 à 17:52:28  profilanswer
 

tpierron a écrit :

Un problème que je vois avec ce code, est que le champ d_name ne contient pas le nom du répertoire qui a été passé en arguement à opendir, donc le fopen() va retourner systématiquement NULL.

Bien vu!
Comme j'ai pas pu compiler et faire tourner le code pour le tester, ça m'a échappé.
Pour être un poil plus efficace, sous unix ou linux, j'aurais juste fait un chdir("Temperature Data Files" ) puis un opendir("." ), ce qui évite les multiples appels à snprintf.
A+,


Message édité par gilou le 25-04-2011 à 18:05:25

---------------
There's more than what can be linked! --    Iyashikei Anime Forever!    --  AngularJS c'est un framework d'engulé!  --
n°2071916
Bysthourie
Posté le 25-04-2011 à 19:15:36  profilanswer
 

Salut tpierron,
 
En effet, avec snprintf, que j'ai adapté sur mon programme, on a bel et bien le résultat attendu.
Par contre, je commence la programmation et j'ai seulement pu adapter ton code sans vraiment tout comprendre (enfin j'ai compris un minimum pour l'adapter quand même^^) :  

Code :
  1. #include<stdio.h>
  2. #include<stdlib.h>
  3. #include<dirent.h>
  4.    int main(void)
  5.    {
  6.       DIR *dp=NULL;
  7.       struct dirent *fp=NULL;
  8.       FILE *fa=NULL;
  9.       char chaine[20];
  10.       char fn[256];
  11.       dp=opendir("Temperature Data Files" );
  12.       while ((fp=readdir(dp))!= NULL)
  13.       {
  14.          if (strcmp(".", fp->d_name) == 0 || strcmp("..", fp->d_name) == 0)
  15.          {
  16.             continue;
  17.          }
  18.          snprintf(fn,sizeof fn,"Temperature Data Files/%s",fp->d_name);
  19.          printf("Le fichier lu s'appelle '%s'",fn);
  20.          fa=fopen(fn,"r" );
  21.          while(fgets(chaine,20,fa)!=NULL) /*Il y a moins de 20 caractères par ligne*/
  22.          {
  23.          printf("%s",chaine);
  24.          }
  25.          fclose(fa);
  26.       }
  27.       closedir(dp);
  28.       return 0;
  29.    }


 
Je suis allé voir sur internet mais les rares pages d'explications en français ne m'ont pas aidé. J'ai cru comprendre que snprintf assigne à une chaine de caractères (1er argument) ce qui ce trouve dans le 3ème argument, pour un maximum de x caractères déterminés par le 2eme argument (ici, 256). Mais du coup, je ne vois pas la différence avec le code précédent. Ou alors, on ne peut simplement pas mettre de d_name comme argument pour un fopen?
 
Sinon, pourquoi ne peut-on pas mettre

Code :
  1. snprintf(fn,sizeof fn,"%s",fp->d_name);


 
?
 
Car tous les fichiers du dossier ont des noms uniques sur mon ordinateur
 
Désolé pour les questions en parallèle mais sa me laisse perplexe^^
 
Encore merci à vous !

n°2071926
gilou
Modérateur
Modzilla
Posté le 25-04-2011 à 20:58:14  profilanswer
 

>> Sinon, pourquoi ne peut-on pas mettre snprintf(fn,sizeof fn,"%s",fp->d_name);
Parce que le nom fp->d_name est relatif au répertoire ouvert avec opendir, mais que fopen prend un nom relatif au répertoire d'ou le programme s'est lancé.
D'ou deux solutions:
Soit déduire le nom relatif au répertoire d'ou le programme s'est lancé à partir du nom relatif au répertoire ouvert avec opendir et du nom du répertoire ouvert avec opendir, c'est ce qui est fait avec snprintf
Soit changer de répertoire de travail pour fopen et mettre comme répertoire de travail celui ou les fichiers se trouvent. C'est ce qui peut être fait avec chdir.
A+,


Message édité par gilou le 25-04-2011 à 21:01:13

---------------
There's more than what can be linked! --    Iyashikei Anime Forever!    --  AngularJS c'est un framework d'engulé!  --
n°2071928
Bysthourie
Posté le 25-04-2011 à 21:17:43  profilanswer
 

Merci pour la clarification, j'ai tout compris. Eh bien, je crois que c'est ok pour l'exploitation des données, merci encore à tous les deux!!

mood
Publicité
Posté le 25-04-2011 à 21:17:43  profilanswer
 

n°2071940
gilou
Modérateur
Modzilla
Posté le 25-04-2011 à 22:07:28  profilanswer
 

Si tu es souus unix/linux (ce qui devrait être la cas si j'ai bien compris, tu peux procéder comme suit:
 

Code :
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. #include <dirent.h>
  4. #include <string.h>
  5. #include <unistd.h>
  6. #define BUFFER_SIZE 20
  7. int main(void)
  8. {
  9.     if (chdir("Temperature Data Files" )) {
  10.         DIR *dp = opendir("." );
  11.         if (dp) {
  12.             struct dirent *entry;
  13.             FILE *fp;
  14.             char buffer[BUFFER_SIZE];
  15.             while (entry = readdir(dp)) {
  16.                 printf("L'entrée lue s'appelle '%s'\n", entry->d_name);
  17.                 if (!(strcmp(".", entry->d_name) && strcmp("..", entry->d_name)))
  18.                     continue;
  19.                 if (fp = fopen(entry->d_name, "r" )) {
  20.                     while (fgets(buffer, BUFFER_SIZE, fp)) {
  21.                         printf("%s\n", buffer);
  22.                     }
  23.                     fclose(fp); 
  24.                 }
  25.             }
  26.             closedir(dp);
  27.             return EXIT_SUCCESS;
  28.         }
  29.     }
  30.     return EXIT_FAILURE;
  31. }


A+,


---------------
There's more than what can be linked! --    Iyashikei Anime Forever!    --  AngularJS c'est un framework d'engulé!  --
n°2072050
Bysthourie
Posté le 26-04-2011 à 15:54:05  profilanswer
 

Non non, je ne suis pas sous linux. Mais merci quand même!! :)

n°2072055
gilou
Modérateur
Modzilla
Posté le 26-04-2011 à 16:20:18  profilanswer
 

Mais si tu n'est pas sous linux, le code qu'on t'a donné ne vas pas marcher, vu que opendir, closedir et readdir sont pas à priori supportées dans l'environnement windows.
Bon si tu fais ça avec gcc sous cygwin, je dis pas, mais sinon...
A+,

Message cité 1 fois
Message édité par gilou le 26-04-2011 à 16:21:25

---------------
There's more than what can be linked! --    Iyashikei Anime Forever!    --  AngularJS c'est un framework d'engulé!  --
n°2072056
tpierron
Posté le 26-04-2011 à 16:31:10  profilanswer
 

gilou a écrit :

Mais si tu n'est pas sous linux, le code qu'on t'a donné ne vas pas marcher, vu que opendir, closedir et readdir sont pas à priori supportées dans l'environnement windows.
Bon si tu fais ça avec gcc sous cygwin, je dis pas, mais sinon...
A+,


 
Ça fonctionne aussi avec MinGW (inclus avec Code::Blocks par ex.). Ça ne fonctionnera sans doute pas avec Visual Studio, ces fonctions ne font pas partie de la msvcrt. Là va falloir utiliser l'API Win32.

n°2072069
Bysthourie
Posté le 26-04-2011 à 17:13:10  profilanswer
 

Oui je suis bien sur MinGW, donc pas de problème de ce côté la:)

n°2072092
gilou
Modérateur
Modzilla
Posté le 26-04-2011 à 19:51:31  profilanswer
 

Sinon il faut appeler l'API Windows. Ceci passe avec mon compilo digital mars.
 

Code :
  1. #include <windows.h>
  2. #include <stdio.h>
  3. #include <string.h>
  4. #define BUFFER_SIZE 20
  5. int main(void)
  6. {
  7.     if (SetCurrentDirectory("Temperature Data Files" )) {
  8.         FILE *fp;
  9.         char buffer[BUFFER_SIZE];
  10.         WIN32_FIND_DATA FindFileData;
  11.         HANDLE hFind = FindFirstFile("*.", &FindFileData);
  12.         if (hFind != INVALID_HANDLE_VALUE) {
  13.             if (strcmp(".", FindFileData.cFileName) &&
  14.                 strcmp("..", FindFileData.cFileName)) {
  15.                        printf("L'entree lue s'appelle '%s'\n", FindFileData.cFileName);
  16.                        if (fp = fopen(FindFileData.cFileName, "r" )) {
  17.                            while (fgets(buffer, BUFFER_SIZE, fp)) {
  18.                                  printf("%s\n", buffer); 
  19.                            }
  20.                            fclose(fp);
  21.                        }
  22.             }
  23.             while (FindNextFile(hFind, &FindFileData)) {
  24.                 if (strcmp(".", FindFileData.cFileName) == 0 ||
  25.                     strcmp("..", FindFileData.cFileName) == 0)
  26.                     continue;
  27.                 printf("L'entree lue s'appelle '%s'\n", FindFileData.cFileName);
  28.                 if (fp = fopen(FindFileData.cFileName, "r" )) {
  29.                     while (fgets(buffer, BUFFER_SIZE, fp)) {
  30.                          printf("%s\n", buffer); 
  31.                     }
  32.                     fclose(fp); 
  33.                 }
  34.             }
  35.             int ErrorCode = GetLastError();
  36.             if (ErrorCode == ERROR_NO_MORE_FILES) {
  37.                if (FindClose(hFind)) {
  38.                    return EXIT_SUCCESS; 
  39.                }
  40.             }
  41.         }
  42.     }
  43.     return EXIT_FAILURE;
  44. }


Bon, j'ai pas testé a fond, il reste à voir s'il y a des problèmes d'encoding entre ce qui est retourne par FindFileData.cFileName et ce qui est attendu par fopen ou s'il y a des problèmes nom court/nom long.
A+,


Message édité par gilou le 26-04-2011 à 19:58:00

---------------
There's more than what can be linked! --    Iyashikei Anime Forever!    --  AngularJS c'est un framework d'engulé!  --
n°2072110
Bysthourie
Posté le 26-04-2011 à 22:27:48  profilanswer
 

Aïe, j'ai du mal à comprendre le code, trop différent de ce que j'ai l'habitude de faire. Ca doit être dù au compilo, je ne connais que mingw^^.
Sinon, je voulais vous demander à propose de cette partie du code :

Code :
  1. if (strcmp(".", fp->d_name) == 0 || strcmp("..", fp->d_name) == 0)
  2.          {
  3.             continue;
  4.          }


En fait ça veut dire que si la chaine correspondant à fp->d_name est "." ou "..", on arrête pas la boucle c'est ça? En fait je pensais que justement, on avais toujours des fichiers nommés "." et ".." quand on lis les fichiers d'un dossier et qu'il fallait les retirer, mais en fait il font qu'on ait ces points car ils indiquent que les fichiers appartiennent à un dossier?? Je suis un peu perdu ...
 
Bonne soirée :)

n°2072111
mr simon
Posté le 26-04-2011 à 22:44:41  profilanswer
 

"continue" signifie que tu retourne a l'evaluation de la condition de la boucle :
entry = readdir(dp)

 

Dans ce cas precis, cela signifie que tu ne veux pas traiter ces fichiers.


Message édité par mr simon le 26-04-2011 à 22:44:53
n°2072117
Bysthourie
Posté le 27-04-2011 à 00:00:06  profilanswer
 

Ah d'accord, j'avais donc bien compris qu'il ne fallait pas traîter les fichiers nommés "." et ".." mais j'avais mal compris la fonction de continue; c'est la petite flèche bleue qu'affiche le CSD qui m'a trompé^^merci!


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

  Code C-Lecture de fichiers à partir d'un dossier.

 

Sujets relatifs
Visual C++ dependances supplémentairesCreation d'une appli Web a partir du code C# Winforms
Compiler des fichiers externeDebugage jeu en C#
Problème ecriture/lecture carte SDen C : comment retourner plusieurs variables ?
ajouter un contact sur son smartphone à partir d'un site web mobilTransformer ma fonction Recherche en code
Plus de sujets relatifs à : Code C-Lecture de fichiers à partir d'un dossier.


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