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

Algorithme de recherche/rempalcement de chaînes dans un fichier ?? - C++ - Programmation

Marsh Posté le 01-04-2003 à 02:36:43    

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:

Reply

Marsh Posté le 01-04-2003 à 02:36:43   

Reply

Marsh Posté le 01-04-2003 à 03:20:14    

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
Reply

Marsh Posté le 01-04-2003 à 09:45:32    

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
Reply

Marsh Posté le 01-04-2003 à 13:07:32    

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

Reply

Marsh Posté le 01-04-2003 à 13:21:33    

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

Reply

Marsh Posté le 01-04-2003 à 18:12:09    

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:

Reply

Marsh Posté le 01-04-2003 à 18:12:44    

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
Reply

Marsh Posté le 01-04-2003 à 18:15:12    

sed powair (tm)


---------------
Bitcoin, Magical Thinking, and Political Ideology
Reply

Marsh Posté le 01-04-2003 à 18:15:38    

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


---------------
last.fm
Reply

Marsh Posté le 01-04-2003 à 18:16:17    

farib a écrit :

sed powair (tm)


:heink:


---------------
last.fm
Reply

Marsh Posté le 01-04-2003 à 18:16:17   

Reply

Marsh Posté le 01-04-2003 à 18:38:22    

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
Reply

Marsh Posté le 04-04-2003 à 14:42:08    

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 ?

Reply

Marsh Posté le 04-04-2003 à 16:32:33    

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
Reply

Marsh Posté le 05-04-2003 à 02:39:14    

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
Reply

Marsh Posté le 05-04-2003 à 03:00:12    

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

Marsh Posté le 05-04-2003 à 12:58:23    

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

Reply

Marsh Posté le 05-04-2003 à 18:42:49    

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
Reply

Marsh Posté le 05-04-2003 à 18:47:01    

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
Reply

Marsh Posté le 05-04-2003 à 18:56:08    

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
Reply

Marsh Posté le 05-04-2003 à 20:58:28    

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
Reply

Marsh Posté le 05-04-2003 à 21:06:00    

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
Reply

Marsh Posté le 06-04-2003 à 12:50:46    

Tetragrammaton IHVH a écrit :


 
Et si le fichier fait un giga ?  :lol:  


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

Reply

Marsh Posté le 06-04-2003 à 16:26:42    

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
Reply

Marsh Posté le 06-04-2003 à 20:05:59    

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
Reply

Marsh Posté le 06-04-2003 à 20:07:09    

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
Reply

Marsh Posté le 06-04-2003 à 23:46:42    

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
Reply

Marsh Posté le 06-04-2003 à 23:48:42    

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

Reply

Marsh Posté le 06-04-2003 à 23:50:37    

ou un return(0) spareil...

Reply

Marsh Posté le 07-04-2003 à 21:18:12    

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
Reply

Marsh Posté le 07-04-2003 à 21:19:42    

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
Reply

Marsh Posté le 07-04-2003 à 21:58:47    

Sr16 a écrit :


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

 
 
[:t c]

Reply

Marsh Posté le 07-04-2003 à 22:00:14    

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

Reply

Marsh Posté le 07-04-2003 à 22:03:11    

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

Reply

Marsh Posté le 08-04-2003 à 18:49:14    

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
Reply

Marsh Posté le 08-04-2003 à 18:56:35    

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
Reply

Marsh Posté le 09-04-2003 à 02:24:15    

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

Reply

Marsh Posté le 10-04-2003 à 17:02:42    

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:

Reply

Marsh Posté le 21-04-2003 à 15:59:05    

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

Reply

Marsh Posté le 21-04-2003 à 16:03:47    

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 ! :)

Reply

Marsh Posté le 23-04-2003 à 15:17:04    

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++

Reply

Marsh Posté le    

Reply

Sujets relatifs:

Leave a Replay

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