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

  FORUM HardWare.fr
  Programmation
  C

  Supprimer des caracteres dans un fichier texte

 


 Mot :   Pseudo :  
 
Bas de page
Auteur Sujet :

Supprimer des caracteres dans un fichier texte

n°1528875
xav987
jsuis pas fait pour travailler
Posté le 15-03-2007 à 13:17:25  profilanswer
 

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

mood
Publicité
Posté le 15-03-2007 à 13:17:25  profilanswer
 

n°1528882
0x90
Posté le 15-03-2007 à 13:29:47  profilanswer
 

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.

Message cité 1 fois
Message édité par 0x90 le 15-03-2007 à 13:29:55

---------------
Me: Django Localization, Yogo Puzzle, Chrome Grapher, C++ Signals, Brainf*ck.
n°1528883
Trap D
Posté le 15-03-2007 à 13:30:36  profilanswer
 

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.

n°1528951
xav987
jsuis pas fait pour travailler
Posté le 15-03-2007 à 15:39:30  profilanswer
 

Ouaou ! rien de plus simple ? Et mon qui pensait que supprimer serait aussi simple que d'ecrire...

n°1528957
Emmanuel D​elahaye
C is a sharp tool
Posté le 15-03-2007 à 15:44:50  profilanswer
 

xav987 a écrit :

Ouaou ! rien de plus simple ?


Non.


---------------
Des infos sur la programmation et le langage C: http://www.bien-programmer.fr Pas de Wi-Fi à la maison : http://www.cpl-france.org/
n°1528983
Taz
bisounours-codeur
Posté le 15-03-2007 à 16:31:09  profilanswer
 

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

n°1529009
xav987
jsuis pas fait pour travailler
Posté le 15-03-2007 à 17:26:33  profilanswer
 

Et il y à quoi, comme autre approche ?

n°1529015
Taz
bisounours-codeur
Posté le 15-03-2007 à 17:41:49  profilanswer
 

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.

n°1529023
Emmanuel D​elahaye
C is a sharp tool
Posté le 15-03-2007 à 18:07:07  profilanswer
 

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


---------------
Des infos sur la programmation et le langage C: http://www.bien-programmer.fr Pas de Wi-Fi à la maison : http://www.cpl-france.org/
n°1529053
xav987
jsuis pas fait pour travailler
Posté le 15-03-2007 à 18:56:30  profilanswer
 

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


Message édité par xav987 le 15-03-2007 à 18:57:20
mood
Publicité
Posté le 15-03-2007 à 18:56:30  profilanswer
 

n°1529074
Trap D
Posté le 15-03-2007 à 19:25:34  profilanswer
 

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 ?

n°1529105
ffomnislas​h
Posté le 15-03-2007 à 20:27:20  profilanswer
 

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

n°1529115
xav987
jsuis pas fait pour travailler
Posté le 15-03-2007 à 20:40:57  profilanswer
 

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.

n°1529125
matafan
Posté le 15-03-2007 à 20:58:14  profilanswer
 

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.

n°1529133
xav987
jsuis pas fait pour travailler
Posté le 15-03-2007 à 21:09:40  profilanswer
 

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é

n°1529401
Taz
bisounours-codeur
Posté le 16-03-2007 à 11:27:44  profilanswer
 

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.


Message édité par Taz le 16-03-2007 à 11:30:46
n°1529406
Taz
bisounours-codeur
Posté le 16-03-2007 à 11:37:38  profilanswer
 

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.

n°1529458
bignose
Posté le 16-03-2007 à 13:13:45  profilanswer
 

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.

n°1529543
Taz
bisounours-codeur
Posté le 16-03-2007 à 14:55:22  profilanswer
 

en mmapant le fichier, ça se fait tout bêtement d'ailleurs.

n°1529571
xav987
jsuis pas fait pour travailler
Posté le 16-03-2007 à 15:11:18  profilanswer
 

bignose > c'est exactement les deux solutions dont je parlait. Mais il est vrai que je les ai exprimés beaucoup moins clairement ! :)


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

  Supprimer des caracteres dans un fichier texte

 

Sujets relatifs
Positionnement de texte, problème sous IE (Au secours)Rechercher fichier puis affichage d´une partie du contenu
Compiler un fichier avec Sciteredirection dans un fichier
Convertir un fichier Excel en PDFcreation automatique d'un fichier
Donner droits a un fichiersupprimer des sos-dossiers
Fichier de configuration à la BD et securité[Batch] Comment lire la 7e ligne d'un fichier ? [Résolu]
Plus de sujets relatifs à : Supprimer des caracteres dans un fichier texte


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