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

  FORUM HardWare.fr
  Programmation
  C++

  Algorithme de recherche/rempalcement de chaînes dans un fichier ??

 


 Mot :   Pseudo :  
 
 Page :   1  2
Page Précédente
Auteur Sujet :

Algorithme de recherche/rempalcement de chaînes dans un fichier ??

n°348722
ceyquem
E falso sequitur quodlibet
Posté le 01-04-2003 à 02:36:43  profilanswer
 

Bonjour,  :)  
 
je dois réaliser un programme qui à un moment donné
doit rechercher et remplacer dans un fichier texte une liste de mots (stockés dans un tableau de chaînes).
 
j'ai fait des recherches (google et ce forum) mais je n'ai rien trouvé sur la recherche/remplacement de chaînes dans un fichier.
 
avez-vous une idée sur la meilleure façon de procéder pour remplacer les mots, et assez rapidement (une seule passe est-elle possible).
 
même un algo à plusieurs passes m'intéresse car je n'arrive pas à voir comment gérer le changement de taille du fichier texte en mémoire lors du remplacement d'un mot par un plus long par exemple...
 
merci de votre aide !
 
 :hello:

mood
Publicité
Posté le 01-04-2003 à 02:36:43  profilanswer
 

n°348727
Angel_Doog​las
Le dernier des humains
Posté le 01-04-2003 à 03:20:14  profilanswer
 

Par expression reguliere (STFW)?
Ou alors c'est un exo et il faut vraiment que tu realises un algo?


Message édité par Angel_Dooglas le 01-04-2003 à 03:20:29
n°348781
kenshiro18​2
Posté le 01-04-2003 à 09:45:32  profilanswer
 

Precise quel langage: C ou C++. C'est franchement pas pareil au niveau de l'implementation.
 
Deja tu peux faire tenir ton fichier dans une liste de lignes (std::list<std::string> ). C'est mieux pour les modifs :-)
Apres tu procedes pour chaque ligne. Fais une fonction qui pour une ligne (std::string) va retourner la ligne avec les mots transformes.
 
Edit: Fait gaffe aux espaces


Message édité par kenshiro182 le 01-04-2003 à 09:46:47
n°349025
ceyquem
E falso sequitur quodlibet
Posté le 01-04-2003 à 13:07:32  profilanswer
 

je précise :
 
c'est en C et pas C++ qu'il faut que je fasse ce truc.
je peux utiliser tout ce qui me facilite la vie (expression régulière ???), l'important de l'exo n'est pas cet algo...
 
 
Angel_Dooglas>> tu peux préciser ton idée ???  :??:  
 
thx

n°349035
nonokao
moooort o foooot !!!
Posté le 01-04-2003 à 13:21:33  profilanswer
 

y'a pas 36 possibilité, enfin si mais bon, on oubli les bidouillages ! lol
donc, ben tu scan ton fichier à la recherche de ce que tu veux remplacer, une fois que tu l'as trouvé, pas la peine de scanner le reste, et maintenant y'a trois cas, soit ce que tu veux y mettre à la place est de la même taile (trankille le chat), soit plus court donc là ben tu réécrit le reste du fichier en avançant tout et en marquant bien la nouvelle fin de fichier, soit c'est plus long, là fo faire plus attention dans l'algo qui réécrit la suite du fichier en repoussant tout, là bien sur le fichier sera allongé. pourquoi faire attention à l'algo qui recule tout, paske faut pas écrire sur les données que tu n'as pas encore lu, donc travaille avec un tampon en mémoire. Ou alors poour ce cas, tu réécris le fichier en partant de la fin, mais j'ai peur que l'os soit inapte à optimiser un accès sequentiel à reculon, donc on oubli.
 
bref, voilà une possibilité, je te laisse la coder, j'espère que tout te parait clair ;)

n°349508
ceyquem
E falso sequitur quodlibet
Posté le 01-04-2003 à 18:12:09  profilanswer
 

Citation :

bref, voilà une possibilité, je te laisse la coder, j'espère que tout te parait clair ;)


euh, je dois vraiment répondre  :whistle:  
 
hum personne n'a un bout de code pour m'aider à démarrer ???
 
Merci  :hello:

n°349509
theshockwa​ve
I work at a firm named Koslow
Posté le 01-04-2003 à 18:12:44  profilanswer
 

Je vois mal comment utiliser des expressions régulières dans ton cas...
 
Perso, j'ai déjà fait un prog similaire (mais je ne l'ai plus) et c'était en Delphi ...
 
J'ai pas forcément utilisé la méthode la plus pratique ... Mais bon...
 
J'ai créé un mini-buffer d'une taille égale à celle du plus long mot que je recherche dans la chaine ...
 
Chaque caractère lu entre dans le buffer et pousse tous les autres, forcant un caractère à sortir, ce caractère est écrit... (heureusement que l'OS gère des buffers pour la lecture et l'écriture, parce que sinon, ce serait vraiment lent ! ou alors plus lourd à gérer)
 
A chaque passe de caractère, tu compares la chaine contenue dans ton buffer avec chaune des chaines qui sont dans ton tableau ... Tu fais les traitements qui vont bien (tu vide la partie du buffer qui représente la chaîne à remplacer si nécessaire et tu remplis le buffer avec autant de caractères que supprimés) et tu continue ...
 
Je sais, c'est pas forcément clair ... :D Mais j'ai fait un effort ...


---------------
last.fm
n°349510
farib
Posté le 01-04-2003 à 18:15:12  profilanswer
 

sed powair (tm)


---------------
Bitcoin, Magical Thinking, and Political Ideology
n°349511
theshockwa​ve
I work at a firm named Koslow
Posté le 01-04-2003 à 18:15:38  profilanswer
 

----
|fichier source
----
 |
 |
---
|b|
|u|
|f|
|f|
|e|
|r|
--- comparaison
 |
 + traitements
 |
----
|fichier dest
----


---------------
last.fm
n°349512
theshockwa​ve
I work at a firm named Koslow
Posté le 01-04-2003 à 18:16:17  profilanswer
 

farib a écrit :

sed powair (tm)


:heink:


---------------
last.fm
mood
Publicité
Posté le 01-04-2003 à 18:16:17  profilanswer
 

n°349524
Tetragramm​aton IHVH
dieu unique =&gt; pensée unique
Posté le 01-04-2003 à 18:38:22  profilanswer
 

ceyquem a écrit :

Bonjour,  :)  
 
même un algo à plusieurs passes m'intéresse car je n'arrive pas à voir comment gérer le changement de taille du fichier texte en mémoire lors du remplacement d'un mot par un plus long par exemple...
 


 
T'as rien à gérer du tout vu que tu vas lire le fichier source pour ecrire le fichier destination (que tu renommes à la fin) : c'est bien plus performant.


---------------
"Dieu a exploité tous nos complexes d'infériorité, en commençant par notre incapacité de croire à notre propre divinité." - Emil Michel Cioran
n°352814
ceyquem
E falso sequitur quodlibet
Posté le 04-04-2003 à 14:42:08  profilanswer
 

Tetragrammaton IHVH a écrit :


 
T'as rien à gérer du tout vu que tu vas lire le fichier source pour ecrire le fichier destination (que tu renommes à la fin) : c'est bien plus performant.


 
en fait je parle de malloc et de problème de remplacement de chaine de caractère, notamment quand le mot remplacé est plus long que le premier mot.
 
est-ce qu'une structure de File de caractères (un objet comprenant un caractère et un pointeur vers le suivant) pourrait etre efficace ? cela risque de prendre plus de place en mémoire ?

n°353083
Tetragramm​aton IHVH
dieu unique =&gt; pensée unique
Posté le 04-04-2003 à 16:32:33  profilanswer
 

ceyquem a écrit :


 
en fait je parle de malloc et de problème de remplacement de chaine de caractère, notamment quand le mot remplacé est plus long que le premier mot.
 
est-ce qu'une structure de File de caractères (un objet comprenant un caractère et un pointeur vers le suivant) pourrait etre efficace ? cela risque de prendre plus de place en mémoire ?


 
T'embetes pas à recoder une liste de char, la STL ou les MFC l'ont fait avant toi.


---------------
"Dieu a exploité tous nos complexes d'infériorité, en commençant par notre incapacité de croire à notre propre divinité." - Emil Michel Cioran
n°353456
sr16
@*#%$*%§!!
Posté le 05-04-2003 à 02:39:14  profilanswer
 

Tu n'a rien trouvé parce que c'est un problème trop simple.
 
Moi je résoudrait le problème de la façon suivante :
 
(1) Charger le fichier en mémoire.
 
(2) Ouvrire un fichier en sortie pour le fichier traité.
 
(3) Tu scanne le fichier du début a la fin. Ce qui n'est pas conforme a un mot, tu l'écrit tel quel dans le fichier dest. Ce qui corresponds a un mot, ben tu ecrit le mot remplaçant dans le fichier.
 
(4) A la fin du fichiers, c'est fini.
 
 
C'est pour quoi le prog, tu est en quoi ?


Message édité par sr16 le 05-04-2003 à 02:39:57

---------------
TOPIC PERMANENT Matrox Parhelia
n°353457
Angel_Doog​las
Le dernier des humains
Posté le 05-04-2003 à 03:00:12  profilanswer
 

Sr16 a écrit :

Tu n'a rien trouvé parce que c'est un problème trop simple.
 
Moi je résoudrait le problème de la façon suivante :
 
(1) Charger le fichier en mémoire.
 
(2) Ouvrire un fichier en sortie pour le fichier traité.
 
(3) Tu scanne le fichier du début a la fin. Ce qui n'est pas conforme a un mot, tu l'écrit tel quel dans le fichier dest. Ce qui corresponds a un mot, ben tu ecrit le mot remplaçant dans le fichier.
 
(4) A la fin du fichiers, c'est fini.
 
 
C'est pour quoi le prog, tu est en quoi ?


 
 [:touki]  
 
Probleme trop simple la recherche de motifs?


---------------
You have the right to remain silent. You are warned that anything you say can will be taken down used as evidence against you///Il n'y a pas de théorie de l'évolution. Juste une liste d'espèces que Chuck Norris autorise à survivre.
n°353557
ceyquem
E falso sequitur quodlibet
Posté le 05-04-2003 à 12:58:23  profilanswer
 

je suis en école d'ingénieur,
le problème de recherche/remplacement
fait partie d'un projet de programmation C.
 
il s'agit de remplacer certaines chaînes de caractères (pas forcément des mots (ie des trucs séparés par des espaces)) par la même chaine suivie de "\index".

n°353711
sr16
@*#%$*%§!!
Posté le 05-04-2003 à 18:42:49  profilanswer
 

Angel_Dooglas a écrit :


 
 [:touki]  
 
Probleme trop simple la recherche de motifs?
 


 
Ne le prends pas mal. Je ne me rends pas réellement compte si c'est compliqué ou pas pour un étudiant. Moi ça me parais simple. Mais c'est vrai que ça fait assez longtemps que je programme.


Message édité par sr16 le 05-04-2003 à 18:43:05

---------------
TOPIC PERMANENT Matrox Parhelia
n°353713
Tetragramm​aton IHVH
dieu unique =&gt; pensée unique
Posté le 05-04-2003 à 18:47:01  profilanswer
 

Sr16 a écrit :

Tu n'a rien trouvé parce que c'est un problème trop simple.
 
Moi je résoudrait le problème de la façon suivante :
 
(1) Charger le fichier en mémoire.
 


 
Et si le fichier fait un giga ?  :lol:


---------------
"Dieu a exploité tous nos complexes d'infériorité, en commençant par notre incapacité de croire à notre propre divinité." - Emil Michel Cioran
n°353723
sr16
@*#%$*%§!!
Posté le 05-04-2003 à 18:56:08  profilanswer
 

ceyquem a écrit :

je suis en école d'ingénieur,
le problème de recherche/remplacement
fait partie d'un projet de programmation C.
 
il s'agit de remplacer certaines chaînes de caractères (pas forcément des mots (ie des trucs séparés par des espaces)) par la même chaine suivie de "\index".


 
Quel domaine ? Tu peut nous en dire plus sur ce qui t'est demandé ?
 
A mon sens, tu charge le fichier en mémoire avec un octet de plus a 0 a la fin. Tu crée un pointeur que tu fais pointer sur le début du fichier.
Le but du jeu, c'est de comparer chaque chaine de ta liste a partir de la position de ce pointeur.
Si le caractère ne correspond a aucune chaine, tu l'envoie dans le fichier de sortie. Si il correspond, tu envoie la chaine de remplacement vers le fichier de sortie.
A chacque itération, tu augmente le pointeur de 1 caractère jusqu'a la fin du fichier.
 


---------------
TOPIC PERMANENT Matrox Parhelia
n°353780
sr16
@*#%$*%§!!
Posté le 05-04-2003 à 20:58:28  profilanswer
 

Allez, je suis de bonne z'humeur aujourd'huis...
 
C'est ecrit très rapidement. Ca a l'air de marcher comme ça.
 

Code :
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. #include <string.h>
  4. struct Motif
  5. {
  6.   char * MotifARemplacer;
  7.   char * MotifRemplacant;
  8. };
  9. struct Motif TableauMotifs[] =
  10. {
  11.   {"bière" , "bière/index"},
  12.   {"jolie nana" , "jolie nana/index"},
  13.   {"chips devant la télé" , "chips devant la télé/index"},
  14.   {"match de foot" , "match de foot/index"},
  15.   {0,0}
  16. };
  17. int main( int argc, char * argv[] )
  18. {
  19.   FILE* Fd;
  20.   long Size;
  21.   char * InFile;
  22.   char * Textp;
  23.   unsigned long i,j;
  24.   char PasTrouve;
  25.   char * WorkRef;
  26.   char c;
  27.   /* Si pas le bon nombre de paramètres, DTC. */
  28.   if (argc<3) printf("Syntaxe : StringFinder FichierSource FichierDestination" );
  29.   /* Déterminer la taille du fichier. */
  30.   Fd = fopen(argv[1],"rb" );
  31.   if ( Fd == NULL ) { printf("Ouverture du fichier d'entrée impossible\n" ); return(0); }
  32.   fseek(Fd, 0, SEEK_END);
  33.   Size= ftell(Fd);
  34.   fclose (Fd);
  35.   /* Allouer une zone de mémoire */
  36.   InFile = (char *)malloc(Size+1); if (!InFile) { printf("Pas de mémoire : Bécanne pourite\n" ); return(0); }
  37.  
  38.   /* Charge le fichier en mémoire */
  39.   Fd = fopen(argv[1],"rb" );
  40.   if ( Fd == NULL ) { printf("Ouverture du fichier d'entrée impossible\n" ); return(0); }
  41.   if (! 1==fread( InFile, Size, 1, Fd )) { printf("Ta gueule\n" ); free(InFile); return(0); }
  42.   fclose (Fd);
  43.   InFile[Size] = 0;
  44.  
  45.   /* Ouvre le fichier de sortie */
  46.   Fd = fopen(argv[2],"wb" );
  47.   if ( Fd == NULL ) { printf("Ouverture du fichier de sortie impossible\n" ); free(InFile); return(0); }
  48.  
  49.   /* Compare et remplace */
  50.   Textp = InFile;
  51.   while (Size)
  52.   {
  53.     for (i=0, PasTrouve = 1; TableauMotifs[i].MotifARemplacer != NULL && PasTrouve ;i++ )
  54.     {
  55.       WorkRef = TableauMotifs[i].MotifARemplacer;
  56.       for (j=0; Textp[j] == WorkRef[j] && WorkRef[j]; j++)
  57.       {
  58.         if (!WorkRef[j+1])
  59.         {
  60.           PasTrouve = 0;
  61.           fwrite( TableauMotifs[i].MotifRemplacant, strlen(TableauMotifs[i].MotifRemplacant),1, Fd );
  62.           Textp += j;
  63.           Size -= j;
  64.         }
  65.       }
  66.     }
  67.     if (PasTrouve) {putc(* Textp ++,Fd); Size --;}
  68.   }
  69.   /* Ferme le fichier de sortie */
  70.   fclose (Fd);
  71.   /* Au dodo */
  72.   return 0;
  73. }


Message édité par sr16 le 05-04-2003 à 21:07:00

---------------
TOPIC PERMANENT Matrox Parhelia
n°353781
sr16
@*#%$*%§!!
Posté le 05-04-2003 à 21:06:00  profilanswer
 

Tetragrammaton IHVH a écrit :


 
Et si le fichier fait un giga ?  :lol:  


 
Tu charge morceau par morceau en mémoire.  
 
Bien sûr, on pourait demander au flux de revenir en arrière dans le fichier. Mais la tu est trop tributaire de l'optimisation de ces routines, ce que tu ne maitrise pas.... et qui peut conduire a une cata. Même si c'est bufferisé. Donc a ne pas faire.
 


---------------
TOPIC PERMANENT Matrox Parhelia
n°353908
polo021
Posté le 06-04-2003 à 12:50:46  profilanswer
 

Tetragrammaton IHVH a écrit :


 
Et si le fichier fait un giga ?  :lol:  


 
 
vive le swap? [:spamafote]
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 [:the grosminet]

n°353978
bjone
Insert booze to continue
Posté le 06-04-2003 à 16:26:42  profilanswer
 

Tetragrammaton IHVH a écrit :


 
Et si le fichier fait un giga ?  :lol:  


 
méthode warrior:
tu mappes le fichier en mémoire :D


Message édité par bjone le 06-04-2003 à 16:27:13
n°354100
sr16
@*#%$*%§!!
Posté le 06-04-2003 à 20:05:59  profilanswer
 

BJOne a écrit :


 
méthode warrior:
tu mappes le fichier en mémoire :D
 


 
[Mode emmerdeur ON]
 
Et si le fichier fait 100 méga ?
 
[Mode emmerdeur OFF]


---------------
TOPIC PERMANENT Matrox Parhelia
n°354101
sr16
@*#%$*%§!!
Posté le 06-04-2003 à 20:07:09  profilanswer
 

Ah oui, il y a une grosse faute dans mon programme. Ca l'empêche pas de fonctionner correctement.
 
A vous de la trouver.


Message édité par sr16 le 06-04-2003 à 20:07:46

---------------
TOPIC PERMANENT Matrox Parhelia
n°354246
bjone
Insert booze to continue
Posté le 06-04-2003 à 23:46:42  profilanswer
 

100 Go tu veux dire ?
 
PS: à ce moment là tu prends un CPU 64 bits avec l'OS qui va avec :D
 
je pense qu'il doit bien y avoir moyen d'avoir un espace de mappage supérieur à 2Go ou 4Go :D


Message édité par bjone le 06-04-2003 à 23:47:28
n°354247
bjone
Insert booze to continue
Posté le 06-04-2003 à 23:48:42  profilanswer
 

Sr16 a écrit :

Ah oui, il y a une grosse faute dans mon programme. Ca l'empêche pas de fonctionner correctement.
 
A vous de la trouver.


 
y manque l'exit() après le if( argc < 3 )....

n°354249
bjone
Insert booze to continue
Posté le 06-04-2003 à 23:50:37  profilanswer
 

ou un return(0) spareil...

n°355200
sr16
@*#%$*%§!!
Posté le 07-04-2003 à 21:18:12  profilanswer
 

BJOne a écrit :


 
y manque l'exit() après le if( argc < 3 )....


 
Exact.
 
Mais il y en a encore une autre.


---------------
TOPIC PERMANENT Matrox Parhelia
n°355201
sr16
@*#%$*%§!!
Posté le 07-04-2003 à 21:19:42  profilanswer
 

BJOne a écrit :

100 Go tu veux dire ?
 
PS: à ce moment là tu prends un CPU 64 bits avec l'OS qui va avec :D
 
je pense qu'il doit bien y avoir moyen d'avoir un espace de mappage supérieur à 2Go ou 4Go :D


 
[Mode chieur fini ON]
 
Et si on a un fichier de 2^64 octets ?
 
[Mode chieur fini OFF]


---------------
TOPIC PERMANENT Matrox Parhelia
n°355224
bjone
Insert booze to continue
Posté le 07-04-2003 à 21:58:47  profilanswer
 

Sr16 a écrit :


 
[Mode chieur fini ON]
 
Et si on a un fichier de 2^64 octets ?
 
[Mode chieur fini OFF]
 

 
 
[:t c]

n°355225
bjone
Insert booze to continue
Posté le 07-04-2003 à 22:00:14  profilanswer
 

de toutes façons, si tu prends le hammer, le bus mémoire cablé est sur 48 bits pour commençer, et l'espace virtuel cablé est de 52 ou 56 bits sais pu...
 
à la 68000-like qui avait que 24bits de cablés sur 32 pour commençer....

n°355228
bjone
Insert booze to continue
Posté le 07-04-2003 à 22:03:11  profilanswer
 

sinon pour l'autre bug c'est algorithmique ou codage/truc à la con qui se fait pas ? (je vois pas plus)

n°356048
sr16
@*#%$*%§!!
Posté le 08-04-2003 à 18:49:14  profilanswer
 

BJOne a écrit :

sinon pour l'autre bug c'est algorithmique ou codage/truc à la con qui se fait pas ? (je vois pas plus)


 
Non, c'est l'oublie de libérer la mémoire utilisée pour le fichier source en mémoire.
 
Tiens, on a pas de réponse de Ceyquem. Tu est vivant ou pas ?
 
Si tu nous lis, fais au moins l'effort de participer a ton propre topic !!!


---------------
TOPIC PERMANENT Matrox Parhelia
n°356058
sr16
@*#%$*%§!!
Posté le 08-04-2003 à 18:56:35  profilanswer
 

BJOne a écrit :

de toutes façons, si tu prends le hammer, le bus mémoire cablé est sur 48 bits pour commençer, et l'espace virtuel cablé est de 52 ou 56 bits sais pu...
 
à la 68000-like qui avait que 24bits de cablés sur 32 pour commençer....


 
Certes, mais c'est dans l'optique ou l'on voudrait un algo réellement indépendant de toute taille.
 
Ne rigolons pas, c'est souvent la base d'une bonne programmation. On voit bien que des limites posées un jour comme etant très larges peuvent bloquer un jour ou l'autre.
 
C'est d'ailleurs ce qui m'énerve au plus haut point dans la programmation des singes de chez Microsoft, il y a une taille maxi pour tout et pas très importante en general.
 
Certes, en pratique on se prends rarement la tête a ce point et on écrit par manque de temps (ou pour optimiser la vitesse) des algos "limités". C'est le cas du programme ecrit plus haut qui est une option réaliste dans la majorité des cas. Et c'est celle la que l'on utilisera pratiquement toujours.
 
Mais il interessant d'avoir une idée aussi traiter le cas autrement.
 
Sinon j'adore ton smiley... : [:t c]


---------------
TOPIC PERMANENT Matrox Parhelia
n°356328
bjone
Insert booze to continue
Posté le 09-04-2003 à 02:24:15  profilanswer
 

oui je sais, l'es pas de moi je l'ai piqué à un autre, mais il collait bien à la situation...

n°358008
ceyquem
E falso sequitur quodlibet
Posté le 10-04-2003 à 17:02:42  profilanswer
 

hello,
 
juste le temps de passer pour vous remercier de toutes ces réponses ! je n'ai pas encore eu le temps de me repencher sur le problème, je devais terminer la réalisation d'un mini tableur en C (tout en mode texte et à 4 opérations)...  :D  
 
je regarderai mon projet pendant les vacances :)
 
a++  :hello:

n°367748
ceyquem
E falso sequitur quodlibet
Posté le 21-04-2003 à 15:59:05  profilanswer
 

Sr16 a écrit :


Non, c'est l'oublie de libérer la mémoire utilisée pour le fichier source en mémoire.
Tiens, on a pas de réponse de Ceyquem. Tu est vivant ou pas ?
Si tu nous lis, fais au moins l'effort de participer a ton propre topic !!!


 
je viens (enfin) de me pencher sur mon projet et je n'arrive pas à implémenter ton code dans mon application.
 
j'ai plusieurs questions :
 
- je n'ai pas trouvé le problème de libération de mémoire du fichier source qui, comme tu le dis, empêche le prog de fonctionner. peux tu m'en dire plus ??
 
- le programme ne fonctionne pas dans mon projet et je n'arrive pas trop à comprendre comment il fonctionne. peut-il remplacer plusieurs occurences des mots de la liste ou passe-t-il au suivant ?? peux-tu commenter chacune des lignes de tes trois boucles ??
 
- serait-il possible ensuite de faire un remplacement de motif qui ne sois pas sensible à la casse ??
 
pour le moment mon appli recopie tel quel le fichier source sans indexer les mots.
 
merci beaucoup  à tous !
 
C. Eyquem

n°367750
ceyquem
E falso sequitur quodlibet
Posté le 21-04-2003 à 16:03:47  profilanswer
 

tiens au passage voici mon code adapté à mon projet :
 
fichier ecrire.c :

Code :
  1. #include "ecrire.h"
  2. Boolean indexSourceTeX(char* fsource, char* fcopie,int indexc, str40** indexv,Boolean opt_v)
  3. {
  4.     FILE* f;
  5.     long Size;
  6.     char * InFile;
  7.     char * Textp;
  8.     unsigned long i,j;
  9.     char PasTrouve;
  10.     char * WorkRef;
  11.     char * MotifRemplacant;
  12.     char * MotifAjoute="\\index";
  13.    
  14.     char c;
  15.     /* Déterminer la taille du fichier. */   
  16.     f = fopen(fsource,"rb" );
  17.     if ( f == NULL )
  18.     {
  19.       printf("Ouverture du fichier d'entrée [%s] impossible\n",fsource);
  20.       return FAUX;
  21.     }
  22.     fseek(f, 0, SEEK_END); 
  23.     Size= ftell(f);
  24.     fclose (f);
  25.    
  26.     /* Allouer une zone de mémoire */
  27.     InFile = (char *)malloc(Size+1);
  28.     if (!InFile)
  29.     {
  30.       printf("Mémoire insiffusante pour le chargement du fichier d'entrée\n" );
  31.       return FAUX;
  32.     }
  33.      
  34.     /* Charge le fichier en mémoire */
  35.     f = fopen(fsource,"rb" );
  36.     if ( f == NULL )
  37.     {
  38.       printf("Ouverture du fichier d'entrée [%s] impossible\n",fsource);
  39.       free(InFile);
  40.       return FAUX;
  41.     }
  42.     if (! 1 == fread(InFile,Size,1,f))
  43.     {
  44.       printf("Erreur de lecture du fichier d'entrée [%s]\n",fsource);
  45.       free(InFile);
  46.       return FAUX;
  47.     }
  48.     fclose (f);
  49.     InFile[Size] = 0;
  50.      
  51.     /* Ouvre le fichier de sortie */
  52.     f = fopen(fcopie,"wb" );
  53.     if ( f == NULL )
  54.     {
  55.       printf("Ouverture du fichier de sortie [%s] impossible\n",fcopie);
  56.       free(InFile);
  57.       return FAUX;
  58.     }
  59.      
  60.     /* Compare et remplace */
  61.     Textp = InFile;
  62.     while (Size)
  63.     {
  64.         for (i=0, PasTrouve = 1; i < indexc && PasTrouve ;i++ )
  65.         {
  66.             WorkRef = (*indexv)[i];
  67.     for (j=0; Textp[j] == WorkRef[j] && WorkRef[j]; j++)
  68.             { 
  69.                 if (!WorkRef[j+1]) 
  70.                 {
  71.                     PasTrouve = 0;
  72.                     fwrite( MotifRemplacant , strlen((*indexv)[i]) , 1 , f );
  73.      fwrite( MotifAjoute , 6 , 1 , f);
  74.                     Textp += j;
  75.                     Size -= j;
  76.                 }
  77.             }
  78.         }
  79.         if (PasTrouve) {putc(* Textp ++,f); Size --;}
  80.     }
  81.  
  82.     /* Ferme le fichier de sortie */
  83.  
  84.     fclose (f);
  85.  
  86.     /* Au dodo */
  87.     return VRAI;
  88. }


 
fichier lire.c :

Code :
  1. #include "lire.h"
  2. void readIndexTxt(char* filename, int* indexc, str40** indexv, Boolean opt_verbose)
  3. {
  4.   int i=0;
  5.   FILE* f;
  6.   //tampon de lecture
  7.   char s[40];
  8.  
  9.   if((f=fopen(filename,"r" ))==NULL)
  10.     {
  11.       printf("Erreur d'ouverture du fichier %s\n",filename);
  12.       exit(1);
  13.     }
  14.   //comptage des mots contenus dans le fichiers (un par ligne)
  15.   (*indexc)=0;
  16.   while((fgets(s,40,f))!=NULL) (*indexc)++; //ajout d'un mot
  17.   //allocation mémoire
  18.  
  19.   (*indexv) = (str40*) malloc(sizeof(str40)*(*indexc));
  20.   //retour au début du fichier
  21.   rewind(f);
  22.   //remplissage de la liste de mots
  23.   printf("Chargement de la liste de mots" );
  24.   printf("\n" );
  25.   while((fgets(s,40,f))!=NULL)
  26.     {
  27.       strcpy((*indexv)[i],s);
  28.       if(opt_verbose) printf("Chargement de : indexv[%d] (%d)\t:\t%s",i,strlen((*indexv)[i]),(*indexv)[i]);
  29.       i++;
  30.     }
  31.  
  32.   fclose(f);
  33. }


 
fichier principal :

Code :
  1. #include<stdio.h>
  2. #include<stdlib.h>
  3. #include<string.h>
  4. #include<getopt.h>
  5. #include "boolean.h"
  6. #include "divers.h"
  7. #include "lire.h"
  8. #include "ecrire.h"
  9. void printErreur(void);
  10. int main(int argc, char** argv)
  11. {
  12.   Boolean opt_c = FAUX;
  13.   Boolean opt_v = FAUX;
  14.   char* fsource=""; //fichier source TeX
  15.   char* findex="";  //fichier index Txt
  16.   char* fcopie="";  //fichier copie TeX si besoin
  17.   int i=0;
  18.   int indexc=0;
  19.   int sourcec=0;
  20.   str40* indexv; //tableaux des entrées à indexer
  21.   str255* sourcev; //tableaux des mots de la source TeX
  22.   //----- lecture des options -----
  23.   int c;
  24.   int digit_optind=0;
  25.   while(1)
  26.   {
  27.     int this_option_optind = optind ? optind : 1;
  28.     int option_index=0;
  29.     static struct option long_options[] =
  30.     {
  31.       {"copy",1,0,0},
  32.       {"verbose",1,0,0},
  33.       {0,0,0,0}
  34.     };
  35.     c=getopt_long(argc, argv, "cv", long_options, &option_index);
  36.     if(c==-1)
  37.       break;
  38.     switch(c)
  39.     {
  40.       case 0:
  41. break;
  42.       case 'c':
  43. printf("option c\n" );
  44. opt_c=VRAI;
  45. break;
  46.       case 'v':
  47. printf("option v\n" );
  48. opt_v=VRAI;
  49. break;
  50.       default:
  51. printf("option non gérée" );
  52.     }
  53.   }
  54.   //----- fin de lecture des options -----
  55.   //----- vérification fichier.tex index.txt copie.tex -----
  56.  
  57.  
  58.   if((optind==1 && argc<3)||(argc < 3 && optind==2)||(argc < 4 && optind==3))
  59.   {
  60.     printErreur(); //on est censé avoir un nom de fichier pour la copie
  61.     exit(1);
  62.   }
  63.  
  64.   fsource=argv[optind];
  65.   findex=argv[optind+1];
  66.   fcopie=argv[optind+2];
  67.  
  68.   //----- fin de vérification fichier.tex index.txt copie.tex -----
  69.  
  70.   //----- lecture du fichier d'index -----
  71.   readIndexTxt(findex,&indexc,&indexv,opt_v);
  72.   printf("\n" );
  73.   //----- fin de lecture du fichier d'index -----
  74.   //----- traitement de la recherche/rempalcement de la source TeX -----
  75.   //
  76.   indexSourceTeX(fsource,fcopie,indexc,&indexv,opt_v);
  77.   //----- fin de lecture du fichier source -----
  78.  
  79.   return EXIT_SUCCESS;
  80. }
  81. void printErreur()
  82. {
  83.   printf("Usage: indexit [options] source index [copie]\n" );
  84.   printf("Options\n" );
  85.   printf("  -v\tVerbose : affiche pleins d'informations\n" );
  86.   printf("  -c\tCopy : n'écrase pas la source TeX\n" );
  87. }


 
fichiers divers.h :
 

Code :
  1. #ifndef _DIVERS_H_
  2. #define _DIVERS_H_
  3. typedef char str40[40+1];
  4. typedef char str255[255+1];
  5. #endif


 
bon courage pour la lecture, j'ai fait quelques efforts de commentaires ! :)

n°369506
ceyquem
E falso sequitur quodlibet
Posté le 23-04-2003 à 15:17:04  profilanswer
 

bonjour,
 
après quelques heures de boulot, j'ai réussi
à faire fonctionner le programme de recherche
et remplacement.
 
merci à sr16 et son code qui m'a bien aidé, et merci
aux autres pour tous les conseils !
 
je  peux mettre le code en ligne si ça intéresse des
gens.
 
a++

mood
Publicité
Posté le   profilanswer
 

 Page :   1  2
Page Précédente

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

  Algorithme de recherche/rempalcement de chaînes dans un fichier ??

 

Sujets relatifs
[Java] Afficher le contenu d'un fichier texte dans une fenêtre ?Inserer du texte dans un fichier texte
[PHP]Problème récuperation fichier uploadé:open_basedir restriction...obtenir la date de modification d'un fichier
Algorithme de bits...iverser des chaines de caracteres
Je recherche un prog d'eeprom qui corresponde a mes criteres ^^[C++] Lire un fichier
Recherche dynamique dans zone de texte[résolu] ouvrir un fichier au travers d'HTTP
Plus de sujets relatifs à : Algorithme de recherche/rempalcement de chaînes dans un fichier ??


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