Supprimer des caracteres dans un fichier texte - C - Programmation
Marsh Posté le 15-03-2007 à 13:29:47
tu lis le fichier et tu écris au fur et à mesure dans un autre en filtrant ce que tu veut enlever, quand tu as terminé tu échange les 2 fichiers.
Marsh Posté le 15-03-2007 à 13:30:36
Ben, tu recopies ligne à ligne le fichier dans un fichier temporaire en effectuant les modifs désirée, une fois que c'est fini, tu fermes les fichiers, tu renommes le fichier original avec une autre extension pour conserver une copie de l'original, on n'est jamias trop prudent, et tu renommes enfin la copie avec le bon nom.
Marsh Posté le 15-03-2007 à 15:39:30
Ouaou ! rien de plus simple ? Et mon qui pensait que supprimer serait aussi simple que d'ecrire...
Marsh Posté le 15-03-2007 à 15:44:50
xav987 a écrit : Ouaou ! rien de plus simple ? |
Non.
Marsh Posté le 15-03-2007 à 16:31:09
0x90 a écrit : tu lis le fichier et tu écris au fur et à mesure dans un autre en filtrant ce que tu veut enlever, quand tu as terminé tu échange les 2 fichiers. |
pas forcément terrible comme approche si tu ne peux pas recréer le fichier avec les mêmes attributs (droits, propriétaires, etc).
Marsh Posté le 15-03-2007 à 17:41:49
bah lire caractere par caractere le fichier source, écrire caractere par caractere les caracteres pas filtrés dans un fichier temporaire, recopier le contenu du fichier temporaire dans le fichier source.
Après si t'es joueur, tu peux tenter de le faire sur place, et si t'implémentes bien, ça doit être pas trop mal niveau performance.
Marsh Posté le 15-03-2007 à 18:07:07
Taz a écrit : bah lire caractere par caractere le fichier source, écrire caractere par caractere les caracteres pas filtrés dans un fichier temporaire, recopier le contenu du fichier temporaire dans le fichier source. |
Bah, le fichier temporaire, c'est pas mieux qu'un ficher de destination qui est directement ce qu'on veut... J'avoue ne pas bien comprendre ta logique. Tu nous as habitué à des choses plus simples...
Marsh Posté le 15-03-2007 à 18:56:30
Vu que je ne retire qu'une seule et unique ligne à la fois, je vais tester le truc sur place. Ce serait encore plus simple.
Je fait deux variables, une qui me dit où je suis en lecture et l'autre en ecriture, je ne touche a rien jusqu'au debut de la ligne a supprimer, à partir de la je décale tout d'une ligne vers le haut, je met un "\0" a la place de la derniere ligne.
Sa devrait le faire. J'essaye demain.
Merci de votre aide, en tout cas...
Marsh Posté le 15-03-2007 à 19:25:34
Taz a écrit : pas forcément terrible comme approche si tu ne peux pas recréer le fichier avec les mêmes attributs (droits, propriétaires, etc). |
Je ne suis pas spécialiste pour les questions de droits, mais on peut modifier un fichier si on n'en est pas le propriétaire ?
Marsh Posté le 15-03-2007 à 20:27:20
ben oui si le proprietaire t'en a donné le droits.
Le pb c'est que si A a un fichier et te donne les droits en écriture
tu es B et tu veut y supprimer des lignes
méthode 1
B cré un fichier qui est une copie du fichier original sans les lignes a supprimer
le fichier est renommé pour ecraser le fichier original
le fichier passe du propriétaire A au proprio B
La méthode de Taz consiste a recopier le second fichier dans le fichier original (vider le fichier original avant donc), ainsi le fichier original garde A comme proprietaire.
L'histoire fonctionne aussi avex le groupe, les droits du groupe ...
Marsh Posté le 15-03-2007 à 20:40:57
On peut aussi ce dire que a partir du moment ou l'on ne fait que de la suppression, le fichier sera plus petit a la fin que avant l'operation, donc, avec deux variables, une qui pointe sur l'endroit ou l'on est en lecture, et l'autre en ecriture, on peut recopier caracteres par caracteres en suppriment ce que l'on veut, et on rajoute un "\0" à la fin.
Ou alors, dans le cas de fichier texte petits et de taille bien definit, on recopie tout le fichier dans un buffer, ou modifie le buffer, et on recopie tout le buffer dans le fichier.
Ainsi il n'y a pas de creation ou de destruction de fichiers deja existant, ce qui regle le probleme des droits.
Marsh Posté le 15-03-2007 à 20:58:14
Dans les deux cas, il faut faire très attention aux problème de sécurité, en particulier de ne pas ouvrir un fichier qui existe déjà au lieu de créer un nouvau fichier. Sinon une personne mal intentionnée pourrait créer à l'avance un lien symbolique du nom du fichier que ton programme va tenter de créer. Si la personne qui exécute le fichier à les droits, ça va écraser la cible du lien... Si tu es root par exemple, n'importe quel utilisateur peut ainsi te faire effacer /etc/passwd ou autre fichier système.
A ma connaissance la seule solution standard est d'utiliser tmpfile() (qui oblige à prendre la solution du fichier temporaire). D'autres solutions non standards sont mktemp() et le mode x (exclusif) de fopen.
Marsh Posté le 15-03-2007 à 21:09:40
Oui, moi je disais sa dans le cas ou l'adresse du fichier n'est pas au choix de l'utilisateur... Enfin, en tout cas c'est le cas dans ce que je souhaite faire... Mais la precision vallait le coup, je n'y aurait pas pensé
Marsh Posté le 16-03-2007 à 11:27:44
Emmanuel Delahaye a écrit : Bah, le fichier temporaire, c'est pas mieux qu'un ficher de destination qui est directement ce qu'on veut... J'avoue ne pas bien comprendre ta logique. Tu nous as habitué à des choses plus simples... |
Tu fais comment si le fichier source ne t'appartient pas mais que tu peux le lire/écrire ? Si tu le supprimes et remplaces par un fichier que tu as créé toi-même, et bien le fichier aura changé de propriétaire.
EDIT: Pour avoir zieuter le code de pas mal d'éditeur de texte, les bons vont essayer de faire un remplacement de fichier, mais uniquement si le propriétaire/groupe peut être conserver. Si le remplacement est possible, attention de bien restaurer les mêmes permissions. Et même ça, ça peut devient complexe quand il y a des ACL par exemple.
Marsh Posté le 16-03-2007 à 11:37:38
et puis si t'édites un fichier via un lien ou un lien symbolique, ça se complique. Travailler avec une copie et tout recopier à la fin, c'est basique, un peu plus long à cause de la copie, mais ça sera transparent.
Marsh Posté le 16-03-2007 à 13:13:45
Je vois 2 autres solutions à ce problème :
- si ton fichier est pas trop grand (il peut quand mème faire plusieurs dizaines de mégas sans problème), lit-le en entier en mémoire, corrige et réécrit-le dans le mème fichier. Avantage : très rapide car il n'y a que 2 accès disque et facile à implémenter. Désavantage : consomme plus de ressources mémoire.
- Si ton fichier est vraiment très gros (+ de 100 Mo), ouvre-le en accès directe, lit caractère par caractère et réécrit au mème endroit. Tu peux facilement optimiser en lisant et réécrivant des blocs entiers de texte. Avantage, pas de limite de taille de fichier, désavantage: c'est plus lent et plus compliqué ...
Si tu as des ressources mémoire, moi je prendrais la première solution à tous les coups. Ni 2 fichiers ni l'accès direct.
Marsh Posté le 16-03-2007 à 14:55:22
en mmapant le fichier, ça se fait tout bêtement d'ailleurs.
Marsh Posté le 16-03-2007 à 15:11:18
bignose > c'est exactement les deux solutions dont je parlait. Mais il est vrai que je les ai exprimés beaucoup moins clairement !
Marsh Posté le 15-03-2007 à 13:17:25
Bonjour,
Comment je fait pour supprimer un caractere ou une ligne dans un fichier texte ?
Sa fait un moment que je cherche et je ne voit pas du tout comment proceder...
Merci