Linux

emili -  
batmat Messages postés 1871 Statut Membre -
Bonsoir,
comment supprimer une ligne d'un fichier en C ya t'il une fonction qui fait ceci car jai cherché sur le web jai rien trouver mai je pense que sa n'existe pas quen pensé vous?
Merci a++
A voir également:

9 réponses

ousmane
 
c'est un fichier C sous linux ou pas ?
0
batmat Messages postés 1871 Statut Membre 114
 
tu veux supprimer la ligne n


//disons que ton texte est dans s :
int i=0;
int num_l=1;
int debut_l;

while(s[i]!='\0' && num_l!=n)
{
if(s[i]=='\n')
num_l++;
i++;
}
debut_l=i;
//tu avances jusqu'à la fin de la ligne en cours :
while(s[i]!='\0' && s[i]!='\n' )
i++;

strcpy(s+debut_l, s+i);


En gros, c ça, ce code est très très très sale et je parierais qu'il est meme faux en partie, mais j'ai pas le temps de vérifier ;p A toi de bosser maintenant ;p
@++

Vous hésitez entre Linux et Windows?
Vous voulez dépenser du temps ou de l'argent ?
0
emili
 
Bonjour Batmat
en fait non je me suis mal exprimé,
c'est un fichier texte par exemple:
Lilin 5 lsupo
ghhh k llls
dflk k fk

et je souhaite supprimer la ligne ghhh k lls par exemple mais je cherche une fonction en C.
merci
0
Stephane
 
Bonjour emili!

En realite Batman repond parfaitement a ta question.
Il n'existe pas de fonction pour faire ce que tu veut, il faut la creer.

Ce que je rajouterai a son code:

FILE f;
char s [taille_max];
int i=0;


if ( (f=fopen("fichier.txt","rb"))!=0)
{
while ( (s[i++]=fgetc(f))!= '\0');
s[i]='\0';
fclose(f);
Fonction_de_Batman(s,ligne_a_effacer);

if ( (f=fopen("fichier.txt","wb"))!=0)
{
write(s,1,i,f);
fclose(f);
printf("\nLigne efface");
}
else printf("Erreur d'ecriture");
}
else printf("impossible d'ouvrir le fichier");



Voila qui devrait resoudre ton probleme...

PS: Je ne crois pas que mon code soit tres propre non plus, ni meme qu'il n'y a aucune erreur, mais s'il y en a elle vienne surement des erreurs d'indice ou du fait que je me souvienne plus tres bien des fonction c (write par exemple)
0
batmat Messages postés 1871 Statut Membre 114
 
Comme stéphane : ya pas de fct en C pour faire ça...

Mais au fait : c'est pour un programme en C obligatoirement ? parce que si ce n'est pas obligatoire, tu peux le faire assez simplement à la ligne de commande sous unix/linux... Si ça t'interesse, fais moi signe ...
@++

Vous hésitez entre Linux et Windows?
Vous voulez dépenser du temps ou de l'argent ?
0
emili
 
Salut
Jvous remercie d'avoir répondu vous etes trop balaise
jvoudrais bien connaitre une commande qui fait ça car jpourais ptet faire un :
systeme(commande);
non!ques t'en pense.
merci bcp a+++
0
emili
 
bonsoir Batmap t'es pas la!!!
pour la commande jte fais signe jte passe mon mail si tu veux me répondre ,si ta le temps un jour:
nhtiti@voila.fr
bonne soirée
0
batmat Messages postés 1871 Statut Membre 114
 
head -$(( $1-1 )) $2 > tmp.dellignes && tail -$(( `wc -l $2 | tr -s ' ' | cut -d' ' -f"2"`-$1 )) $2 >>tmp.dellignes && mv tmp.dellignes $2

Tu remplaces $1 par le numéro de ligne, et $2 par le nom du fichier dont tu veux virer la nieme ligne.

Je viens de tester, ça a l'air de fonctionner. Par contre :
1) teste bien que la ligne demandée n'est pas supérieure au numéro de ligne maximal
2) teste que c'est bien un entier que tu passes.
3) Pour faire ton appel, tu vas devoir faire comme ça :
a) disons que dans n se trouve le numéro de ligne que tu as vérifié au préalable
b) dans char *fic : le nom du fichier :


char string_call[200];// tu peux faire plus fin en prenant la taille
//exacte de la chaine, mais 200 seront en tout cas suffisant en statique

sprintf(string_call, ""head -%d %s > %s && tail -$(( `wc -l %s | tr -s ' ' | cut -d' ' -f"2"`-%d )) %s >>%s && mv %s %s", (n-1) , fic, tmp,fic,n,fic, tmp, tmp, fic);

//et là tu fais l'appel système
system(string_call);


En y regardant à deux fois, finalement c ptete plus propre en C ;p

Voilà... Dis moi si ça tourne ;p
@++
Vous hésitez entre Linux et Windows?
Vous voulez dépenser du temps ou de l'argent ?
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
emili
 
t genial au fait mon adresse c'est
nhtiti@voila.fr et non pas hntiti désolé!!!
jpe pas tester chez moi jai pas encore installé linux sa ne saurai tardé!!!!!
j'essairai mardi a la fac et jte dirais sa merci encore pour le temps que tu prends a aider et a chercher.
a+ merci encore Batmap
0
batmat Messages postés 1871 Statut Membre 114
 
De rien, mais c batmaT (pas un p :) )

@++

Vous hésitez entre Linux et Windows?
Vous voulez dépenser du temps ou de l'argent ?
0
emili
 
O désolé BatmaT
Bonne Soirée ;-)
0
batmat Messages postés 1871 Statut Membre 114
 
Enfin, la majuscule c'est pas obligé :) c'était juste pour insister dessus ;p
@++

Vous hésitez entre Linux et Windows?
Vous voulez dépenser du temps ou de l'argent ?
0
emili
 
Ok batmat,j'avais compris.
O fait c'est quoi le";p".
0
batmat Messages postés 1871 Statut Membre 114
 
Je vais pas t'apprendre ce qu'est un smiley qd meme ;-p (tu le vois ptete mieux avec le nez :-) que sans le nez :) :p )

@++

Vous hésitez entre Linux et Windows?
Vous voulez dépenser du temps ou de l'argent ?
0