Algorithme de recherche/rempalcement de chaînes dans un fichier ?? - C++ - Programmation
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?
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
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
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
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
hum personne n'a un bout de code pour m'aider à démarrer ???
Merci
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 ... Mais j'ai fait un effort ...
Marsh Posté le 01-04-2003 à 18:15:12
ReplyMarsh Posté le 01-04-2003 à 18:38:22
ceyquem a écrit : Bonjour, |
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.
Marsh Posté le 04-04-2003 à 14:42:08
Tetragrammaton IHVH 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 ?
Marsh Posté le 04-04-2003 à 16:32:33
ceyquem a écrit : |
T'embetes pas à recoder une liste de char, la STL ou les MFC l'ont fait avant toi.
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 ?
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. |
Probleme trop simple la recherche de motifs?
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".
Marsh Posté le 05-04-2003 à 18:42:49
Angel_Dooglas a écrit : |
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.
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. |
Et si le fichier fait un giga ?
Marsh Posté le 05-04-2003 à 18:56:08
ceyquem a écrit : je suis en école d'ingénieur, |
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.
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 :
|
Marsh Posté le 05-04-2003 à 21:06:00
Tetragrammaton IHVH a écrit : |
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.
Marsh Posté le 06-04-2003 à 12:50:46
ReplyMarsh Posté le 06-04-2003 à 16:26:42
Tetragrammaton IHVH a écrit : |
méthode warrior:
tu mappes le fichier en mémoire
Marsh Posté le 06-04-2003 à 20:05:59
BJOne a écrit : |
[Mode emmerdeur ON]
Et si le fichier fait 100 méga ?
[Mode emmerdeur OFF]
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.
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
je pense qu'il doit bien y avoir moyen d'avoir un espace de mappage supérieur à 2Go ou 4Go
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. |
y manque l'exit() après le if( argc < 3 )....
Marsh Posté le 07-04-2003 à 21:18:12
BJOne a écrit : |
Exact.
Mais il y en a encore une autre.
Marsh Posté le 07-04-2003 à 21:19:42
BJOne a écrit : 100 Go tu veux dire ? |
[Mode chieur fini ON]
Et si on a un fichier de 2^64 octets ?
[Mode chieur fini OFF]
Marsh Posté le 07-04-2003 à 21:58:47
ReplyMarsh 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....
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)
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 !!!
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... |
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... :
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...
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)...
je regarderai mon projet pendant les vacances
a++
Marsh Posté le 21-04-2003 à 15:59:05
Sr16 a écrit : |
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
Marsh Posté le 21-04-2003 à 16:03:47
tiens au passage voici mon code adapté à mon projet :
fichier ecrire.c :
Code :
|
fichier lire.c :
Code :
|
fichier principal :
Code :
|
fichiers divers.h :
Code :
|
bon courage pour la lecture, j'ai fait quelques efforts de commentaires !
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++
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 !