IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

 C Discussion :

Suppression d'une ligne dans un fichier


Sujet :

C

  1. #1
    Nouveau Candidat au Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Janvier 2019
    Messages
    2
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Haïti

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Janvier 2019
    Messages : 2
    Points : 1
    Points
    1
    Par défaut Suppression d'une ligne dans un fichier
    Bonjour à tous, je suis novice en programmation et j'ai besoin de supprimer une ligne dans un fichier, mais il faut qu'elle soit indiquée par l'utilisateur, c'est-à dire les caractères débutant la ligne à supprimer doit provenir d'une variable remplie par l'utilisateur, je n'arrive pas à le faire, merci déjà pour votre aide !!

  2. #2
    Expert éminent sénior
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 369
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 369
    Points : 41 519
    Points
    41 519
    Par défaut
    Déjà, il faut garder à l'esprit qu'on supprime rarement une ligne "sur place" dans un fichier. Soit on fait tout en RAM et on écrase directement le fichier avec les données modifiées, soit on suit l'approche "faire une copie traitée, puis renommer":
    1. On crée une copie qui ne contient pas la ligne en question
    2. On supprime l'ancien fichier
    3. On renomme le nouveau.


    Et pour faire cette étape 1, il faut un truc du genre:
    • Ouvrir le fichier source en lecture
    • Ouvrir le fichier destination en écriture
    • En boucle:
      • Lire une ligne du fichier source
      • Si elle ne commence pas par la variable remplie par l'utilisateur,
        • l'écrire dans le fichier destination
    • Fermer les deux fichiers
    SVP, pas de questions techniques par MP. Surtout si je ne vous ai jamais parlé avant.

    "Aw, come on, who would be so stupid as to insert a cast to make an error go away without actually fixing the error?"
    Apparently everyone.
    -- Raymond Chen.
    Traduction obligatoire: "Oh, voyons, qui serait assez stupide pour mettre un cast pour faire disparaitre un message d'erreur sans vraiment corriger l'erreur?" - Apparemment, tout le monde. -- Raymond Chen.

  3. #3
    Expert éminent sénior
    Avatar de Sve@r
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2006
    Messages
    12 687
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Oise (Picardie)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Février 2006
    Messages : 12 687
    Points : 30 980
    Points
    30 980
    Billets dans le blog
    1
    Par défaut
    Bonjour

    Le problème principal est que la notion de "ligne" est une notion "humaine". Un fichier, lui, ne connait pas la ligne. Il ne connait que des caractères qui se suivent de façon séquentielle.

    Et donc un fichier qui s'afficherait ainsi
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    Hello
    Le monde
    Tourne
    est en réalité stocké de cette façon: Hello\nLe monde\nTourne\n. Et donc supprimer la seconde ligne revient à transformer le fichier ainsi: Hello\nTourne\n Donc concrètement, à décaler les caractères suivants la ligne à supprimer et ce, jusqu'à la fin du fichier.

    D'où la remarque de Medinoc quand il dit qu'on fait rarement ce travail et qu'il vaut mieux alors passer par la création d'un second fichier.
    Mon Tutoriel sur la programmation «Python»
    Mon Tutoriel sur la programmation «Shell»
    Sinon il y en a pleins d'autres. N'oubliez pas non plus les différentes faq disponibles sur ce site
    Et on poste ses codes entre balises [code] et [/code]

  4. #4
    Nouveau Candidat au Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Janvier 2019
    Messages
    2
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Haïti

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Janvier 2019
    Messages : 2
    Points : 1
    Points
    1
    Par défaut
    Le probleme survient au moment de specifier le caractere debut de la ligne a supprimer, je n'arrive pas a le remplacer par la variable.
    voici mon code :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    void supprimer ()
    {
          int choix4, choix5,choix6;
            char del[1000]="", ligne[1000]="",fin[]="";
            FILE* Livres= NULL, *INFILE, *OUTFILE;
        printf("\nCet operation est irreversible!\n\n\nVoulez-vous supprimer tous les livres de votre biblio ou un seul ?\n\n1-Tous les livres\n\n2-Un seul\n\n0-Ne rien faire\n              ");
        scanf("%d",&choix4);
        system("cls");
        if (choix4==1)
        {
            printf("Vous allez tout supprimer de la bibliotheque !\nVoulez-vous continuer?\n\n1-Oui\n0-Non   ");
            scanf("%d", &choix5);
            system("cls");
            if (choix5==1)
            {
                 remove("container.gabriel");
                 printf("Tous les livres ont ete supprime!");
            }
     
            else
            {
                printf("\n\nRien n'a ete fait !");
            }
        }
        else if (choix4==2)
        {
      /* Saisie de l'enregistrement à supprimer */
     
             printf("Entrez le nom du livre que vous voulez supprimer :  \nPS: Veuillez bien orthographier le nom du livre !\n");
      scanf("%s",&del);
        system("cls");
        printf("\nCet operation est irreversible!\n\n\nVoulez-vous vraiment supprimer %s de votre bibliotheque ??\n\n1=Oui\n0=Non ",del);
        scanf("%d", &choix6);
        system("cls");
     
     
        if (choix6==1)
     
        {
            //Suppression du livre
            //On va creer un fichier temporaire
     
     
                 if ((INFILE = fopen("container.gabriel", "r")) == NULL)
            return EXIT_FAILURE;
     
        if ((OUTFILE = fopen("container_temp.gabriel", "w")) == NULL)
        {
            fclose(INFILE);
            return EXIT_FAILURE;
        }
     
      while (fgets(ligne, sizeof ligne, INFILE))
        {
     
            if (ligne[0] != "%s" ,del)
                fputs(ligne, OUTFILE );
        }
     
     
     
     
        fclose(INFILE);
        fclose(OUTFILE);
    remove("container.gabriel");
        rename("container_temp.gabriel", "container.gabriel");
     
     
     
        printf("\n\nLe livre qui a pour titre : %s a ete supprime !",del);
        }
        else
            {
                printf("\n\nRien n'a ete fait !");
            }
     
        }
     
            else
            {
                printf("\n\nRien n'a ete fait !");
            }
     
                    fclose(Livres);
    }
    Cela ne marche pas.

  5. #5
    Expert éminent sénior
    Avatar de Sve@r
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2006
    Messages
    12 687
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Oise (Picardie)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Février 2006
    Messages : 12 687
    Points : 30 980
    Points
    30 980
    Billets dans le blog
    1
    Par défaut
    Citation Envoyé par Gabolac Voir le message
    Le probleme survient au moment de specifier le caractere debut de la ligne a supprimer, je n'arrive pas a le remplacer par la variable.
    voici mon code : char del[1000]=""; if (ligne[0] != "%s" ,del)
    Effectivement, tu as atteint avec cette simple ligne un niveau d'exception !!!
    C'est con, dans un langage de haut niveau (ex Python) ça passait nickel. Mais pas en C.

    Donc
    1. le formatage "%s", "%d" etc est un formatage spécifique à la fonction printf(). Ce n'est pas du C, tu ne peux donc pas l'inclure dans une instruction "pure C".
    2. une comparaison de chaines ne peut pas se faire via l'opérateur "==" (ou "!=" ou tout autre opérateur natif du C) => revois ton cours sur les chaines
    3. tout comme on ne compare pas un tas de sable et un grain de sable, on ne compare pas une chaine (del) avec un caractère (ligne[0])


    Citation Envoyé par Gabolac Voir le message
    char del[1000]=""; scanf("%s",&del);
    Pas de "&" pour les chaines. C'est un peu la même raison qui fait qu'on ne peut pas les comparer de façon native.

    Sinon de façon plus générale: ton code mélange tout : la saisie, la suppression d'un livre, la suppression de tous les livres. C'est du fouilli complet. Et même s'il fonctionne un jour, il ne sera ni portable, ni modifiable (sera-t-il lisible ?)
    Essaye de découper. Tu as des choix à demander à l'utilisateur et des actions en fonction de ces choix. Module ton code. Une fonction dédiée au choix, rien qu'au choix. Tu pourras alors la faire évoluer pour gérer les choix incorrects, etc. Ensuite une autre dédiée à la suppression d'un livre. Tu pourras la tester en individuel jusqu'à ce qu'elle fonctionne sans te pourrir la vie avec tout le reste. Tu as la possibilité d'user et d'abuser de fonctions, utilise-la !!!

    Citation Envoyé par Gabolac Voir le message
    Cela ne marche pas.
    Oh ? Sérieux ???
    Mon Tutoriel sur la programmation «Python»
    Mon Tutoriel sur la programmation «Shell»
    Sinon il y en a pleins d'autres. N'oubliez pas non plus les différentes faq disponibles sur ce site
    Et on poste ses codes entre balises [code] et [/code]

Discussions similaires

  1. Suppression d'une ligne dans un fichier
    Par feldene dans le forum Langage
    Réponses: 9
    Dernier message: 29/07/2009, 12h26
  2. suppression d'une ligne dans un fichier XML EN VBA
    Par newcodeur dans le forum Macros et VBA Excel
    Réponses: 14
    Dernier message: 10/07/2008, 16h00
  3. Suppression d'une ligne dans un fichier txt
    Par EvaristeGaloisBis dans le forum VB 6 et antérieur
    Réponses: 2
    Dernier message: 21/07/2007, 17h58
  4. Réponses: 3
    Dernier message: 26/03/2006, 20h45
  5. [VB6]Suppression d'une ligne dans un fichier
    Par Tyrael62 dans le forum VB 6 et antérieur
    Réponses: 3
    Dernier message: 08/02/2006, 11h20

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo