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 :

Écrire, modifier, supprimer dans les fichiers texte


Sujet :

C

  1. #1
    Membre à l'essai
    Homme Profil pro
    Inscrit en
    Novembre 2010
    Messages
    21
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Algérie

    Informations forums :
    Inscription : Novembre 2010
    Messages : 21
    Points : 17
    Points
    17
    Par défaut Écrire, modifier, supprimer dans les fichiers texte
    bonjour,
    voici mon problème, je suis sous Linux, j'aimerai bien savoir comment faire pour manipuler un fichier texte.
    j'aimerai savoir comment faire pour ajouter, modifier, supprimer du texte en langage C, par exemple sous des fonction.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    void supprimer( int ligne, int colonne, char quoi_supprimer )
    void modifier( int ligne, int colonne, char quoi_modifier )
    void ajouter( int ligne, int colonne, char quoi_ajouter )
    comment atteindre les ligne spécifique, les colonne spécifique, et comment supprimer ou modifier ou ajouter dans cette endroit spécifique.

    est-ce qu'il y a des bibliothèques et des fonctions qui font ça. fseek et lseek ne répondent pas à mon problème, ou est-ce moi qui n'a pas su les utiliser.

    merci.

  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 518
    Points
    41 518
    Par défaut
    Pour un fichier texte, comme pour tout fichier contenant des éléments de longueur variable sans index, tu n'as pas le choix: Tu dois tous lire toi-même en comptant les lignes (en les écrivant dans un fichier de sortie), en remplaçant la ligne voulue, etc.
    Puis tu pourras supprimer l'ancien fichier et renommer le nouveau.

    Pour l'ajout en fin de fichier, c'est plus simple: ouvre simplement le fichier en mode "append" (fopen("fichier.txt", "a")).
    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
    Membre expert
    Avatar de Metalman
    Homme Profil pro
    Enseignant-Chercheur
    Inscrit en
    Juin 2005
    Messages
    1 049
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 35
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Enseignant-Chercheur
    Secteur : Enseignement

    Informations forums :
    Inscription : Juin 2005
    Messages : 1 049
    Points : 3 532
    Points
    3 532
    Par défaut
    Je suis assez convaincu que tu n'as pas su les utiliser.
    Si des libs existent, elles utiliseront les seeks à coup sûr !

    Le problème que tu as, c'est que tu vois les fichiers comme des "lignes" qui constituent un "tableau".
    Ca n'est pas totalement faux sur certaines plateformes, et/ou dans certains cas... (mais tu ne croisera probablement jamais dans ta vie ces plateformes, et elles ne t'intéresseront probablement pas, ce qui est compréhensible).
    Bref, tu dois voir un fichier comme une suite d'octets, et uniquement comme cela !

    Ton fichier est un fichier texte, cela se rapprochera de ton cas !
    Pourquoi ? Car les lignes sont séparées par des '\n' !
    La solution que je peux te proposer, c'est d'utiliser fgetline pour avancer dans le fichier, ligne par ligne... puis de fseek, par rapport au point courant, pour avancer à la colonne que tu veux !

    Je me souviens avoir essayé ce que tu souhaites faire, mais sans succès (à l'époque j'étais novice). (EDIT : SANS passer par un fichier temporaire)
    Fais des tests avec les fgetline et fseek (en jouant avec le paramètre qui décale depuis le début du fichier, ou depuis le carcatère courant), et après tu pourras voir comment ajouter/modifier/supprimer

    Je crois que par défaut tu vas modifier... dans cette logique : pour supprimer, il faut sauter tout ce que tu ne veux plus, lire ce qui suit, et re-écrire en arrière.
    Pour ajouter du coup, il faut sauvegarder tout ce qui vient après, écrire ce que tu veux ajouter, puis recopier ce que tu as sauvegardé !

    EDIT : la solution de Medinoc du fichier temporaire à renommer est vraiment plus simple, et plus safe que ce que je te propose !
    Tu recopies tout jusqu'à la ligne à modifier, tu ajoutes ton texte "nouveau", puis tu recopies le contenu de l'ancien fichier
    --
    Metalman !

    Attendez 5 mins après mes posts... les EDIT vont vite avec moi...
    Les flags de la vie : gcc -W -Wall -Werror -ansi -pedantic mes_sources.c
    gcc -Wall -Wextra -Werror -std=c99 -pedantic mes_sources.c
    (ANSI retire quelques fonctions comme strdup...)
    L'outil de la vie : valgrind --show-reachable=yes --leak-check=full ./mon_programme
    Et s'assurer que la logique est bonne "aussi" !

    Ma page Developpez.net

  4. #4
    Membre à l'essai
    Homme Profil pro
    Inscrit en
    Novembre 2010
    Messages
    21
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Algérie

    Informations forums :
    Inscription : Novembre 2010
    Messages : 21
    Points : 17
    Points
    17
    Par défaut
    merci pour vos réponse, je vais voir avec la fonction fgetline et fseek et aussi pour utiliser les fichier temporaire.
    merci encore.

  5. #5
    Membre à l'essai
    Homme Profil pro
    Inscrit en
    Novembre 2010
    Messages
    21
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Algérie

    Informations forums :
    Inscription : Novembre 2010
    Messages : 21
    Points : 17
    Points
    17
    Par défaut
    rebonjour,
    pour fseek, c'est sure que je n'ai pas su l'utiliser, voici un code que je bloque avec.
    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
     
    #include <stdio.h>
     
    int main( int argc, char *argv[] )
    {
     FILE *fichier;
     fichier = fopen( "test.txt", "a" );
     if( fichier == NULL )
     {
      printf( "impossible d'ouvrir le fichier\n" );
     }
     fseek( fichier, 10, SEEK_SET );
     fprintf( fichier, "192.168.1.100" );
     fseek( fichier, 20, SEEK_SET );
     fprintf( fichier, "192.168.1.200" );
     
     return 0;
    }
    alors que "test.txt" a

    ip_addr
    dns_server
    mais quand j'execute le code ça fait ça:

    ip_addr
    dns_server
    192.168.1.100192.168.1.200
    j'aimerai bien que quelqu'un m'explique le probleme
    et pour fgetline je ne comprends pas sa syntaxe, il ne reponds pas sur qu'elle ligne en se trouve mais plutot:
    EACCES
    EBADF
    EINTR
    EIO
    EISDIR
    ENOMEM
    ENXIO
    EWOULDBLOCK
    que je ne trouve pas l'interet.

  6. #6
    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 518
    Points
    41 518
    Par défaut
    "a" n'est pas compatible avec fseek(). Tu voulais sûrement utiliser r+.

    Aussi, tu devras sans doute:
    • soit utiliser r+b et gérer les fins de ligne toi-même,
    • soit tout lire en utilisant ftell() pour créer un index

    car fseek() n'est pas garanti marcher avec des valeurs arbitraires en mode texte.
    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.

  7. #7
    Expert éminent sénior
    Avatar de Sve@r
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2006
    Messages
    12 631
    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 631
    Points : 30 865
    Points
    30 865
    Billets dans le blog
    1
    Par défaut
    Citation Envoyé par zamo.zd Voir le message
    rebonjour,
    "test.txt" a
    ip_addr
    dns_server
    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
    #include <stdio.h>
    
    int main( int argc, char *argv[] )
    {
     FILE *fichier;
     fichier = fopen( "test.txt", "a" );
     if( fichier == NULL )
     {
      printf( "impossible d'ouvrir le fichier\n" );
     }
     fseek( fichier, 10, SEEK_SET );
     fprintf( fichier, "192.168.1.100" );
     fseek( fichier, 20, SEEK_SET );
     fprintf( fichier, "192.168.1.200" );
    
     return 0;
    }
    Salut

    Attention à l'option "a" de fopen (merci Médinoc).

    De plus, si je compte bien ton fichier "test.txt" contient ceci
    ip_addr\ndns_server\n
    c'est à dire 19 octets (chaque "\n" symbolisant la fin de ligne ne faisant qu'un octet). En tout état de cause je vois mal fseek() te placer alors sur le 20° octet...
    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. Écrire une table dans un fichier texte
    Par Stepsbysteps dans le forum Langage SQL
    Réponses: 2
    Dernier message: 19/04/2013, 11h42
  2. Comment ouvrir, écrire et lire dans un fichier texte ?
    Par Aspic dans le forum Contribuez
    Réponses: 0
    Dernier message: 29/12/2010, 01h08
  3. Réponses: 9
    Dernier message: 21/04/2008, 16h13
  4. Compteur, écrire à la ligne dans un fichier texte
    Par pierrot10 dans le forum Langage
    Réponses: 5
    Dernier message: 24/11/2007, 16h21
  5. écrire un String dans un fichier texte
    Par Flagada dans le forum C++Builder
    Réponses: 4
    Dernier message: 22/01/2007, 17h49

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