Linux

emili -  
batmat Messages postés 1880 Date d'inscription   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++

9 réponses

  1. ousmane
     
    c'est un fichier C sous linux ou pas ?
    0
  2. batmat Messages postés 1880 Date d'inscription   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
    1. 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
    2. 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
  3. batmat Messages postés 1880 Date d'inscription   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
    1. 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
    2. 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
  4. batmat Messages postés 1880 Date d'inscription   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
  5. Vous n’avez pas trouvé la réponse que vous recherchez ?

    Posez votre question
  6. 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
  7. batmat Messages postés 1880 Date d'inscription   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
  8. emili
     
    O désolé BatmaT
    Bonne Soirée ;-)
    0
  9. batmat Messages postés 1880 Date d'inscription   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
    1. emili
       
      Ok batmat,j'avais compris.
      O fait c'est quoi le";p".
      0
  10. batmat Messages postés 1880 Date d'inscription   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