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 :

modification de la n ème ligne d'un fichier


Sujet :

C

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    Profil pro
    Inscrit en
    Avril 2007
    Messages
    92
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2007
    Messages : 92
    Par défaut modification de la n ème ligne d'un fichier
    Bonjour,
    Je cherche le meilleur moyen pour modifier la 20 ème ligne d'un fichier (le minimum d'effort car mon fichier est grand et sans écraser le reste du fichier).
    Cette modification sera faite plusieurs fois dans mon programme principal, donc je me suis dit que le meilleur moyen est :
    - ouverture en mode 'r+'
    - chercher l'adresse de ligne (chercher le nombre de ligne en comptant '/n' et utiliser ensuite ftell) : à faire une seule fois.
    - aller directement à la ligne considérer en utilisant 'fseek' et modifier la ligne en utilisant la commande 'fputc'. Ceci va endommager le reste de mon fichier et en plus je ne suis pas sur que l'adresse de la ligne ne va pas changer après autres traitements.

  2. #2
    Membre Expert
    Profil pro
    Développeur en systèmes embarqués retraité
    Inscrit en
    Mars 2006
    Messages
    952
    Détails du profil
    Informations personnelles :
    Localisation : France, Bas Rhin (Alsace)

    Informations professionnelles :
    Activité : Développeur en systèmes embarqués retraité
    Secteur : Industrie

    Informations forums :
    Inscription : Mars 2006
    Messages : 952
    Par défaut
    Salut,

    fseek sur un fichier texte donne un résultat indéterminé. De plus, il faudrait être sûr que la taille de la nouvelle ligne soit identique à la taille de l'ancienne. Si la taille est identique, tu peux ouvrir ton fichier en mode binaire et faire comme tu le penses. sinon...

    ... La méthode usuelle est une boucle qui lit ligne par ligne d'un fichier et écrit dans un autre, avec ton remplacement quelque part au milieu de la boucle. Quand c'est fini, on ferme les fichiers, on renomme l'ancien en '.bak' (en effaçant d'abord l'ancien '.bak' s'il existe) et on renomme le nouveau avec le nom de l'ancien. Cette procédure garantit que l'on puisse toujours récupérer le fichier. Ne perds pas de vue que "grand fichier" ne veut plus dire grand chose aujourd'hui.

    en gros:
    -ouverture 'toto.txt" en lecture
    -ouverture 'temporary.txt' en écriture
    - boucle qui lit une ligne de 'toto.txt', fait un traitement si le numéro de ligne est le bon et écrit la ligne (modifiée ou pas) dans 'temporary.txt'
    -fermeture 'toto.txt"
    -fermeture 'temporary.txt'
    -effacement de toto.bak' s'il existe
    - renommage 'toto.txt' -> 'toto.bak'
    - renommage 'temporary.txt' -> toto.text

    A+

    Pfeuh

  3. #3
    Expert confirmé

    Profil pro
    Inscrit en
    Janvier 2007
    Messages
    10 610
    Détails du profil
    Informations personnelles :
    Âge : 67
    Localisation : France

    Informations forums :
    Inscription : Janvier 2007
    Messages : 10 610
    Billets dans le blog
    2
    Par défaut
    Citation Envoyé par pfeuh Voir le message
    fseek sur un fichier texte donne un résultat indéterminé.
    non, pas en tant que tel...


    D'autre part, mis à part si on va remettre exactement le même nombre de caractères, on ne peut remplacer une ligne au milieu d'un fichier sans le réécrire complètement.

    Enfin la solution la plus simple si ce n'est pas obligatoirement en C et qu'on est sous unixoide est de faire un joli sed ...

  4. #4
    Membre confirmé
    Profil pro
    Inscrit en
    Avril 2007
    Messages
    92
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2007
    Messages : 92
    Par défaut
    Merci pour vos réponses.
    J'ai opté pour la réponse de pfeuh avec quelque modification : peuisque c'est uniquement le ligne 20 qui change alors j'écrit directement les lignes dans un nouveau fichier 'temporary.txt' (avec les modifications à apporter à la ligne 20). Je supprime ensuite l'ancien fichier 'toto.txt' et renomme 'temporary.txt' en 'toto.txt'.

    Je ne sais pas si c'est très pro. mais ça résoud mon problème.

    Bonne journée à tous

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Modification d'une ligne d'un fichier
    Par Olivier Regnier dans le forum Shell et commandes GNU
    Réponses: 3
    Dernier message: 20/03/2007, 15h29
  2. Modification de la hauteur des lignes d'un TCustomTree
    Par Mickey9683 dans le forum C++Builder
    Réponses: 4
    Dernier message: 30/08/2006, 08h59
  3. modification de données pour une ligne
    Par Skizo dans le forum Access
    Réponses: 5
    Dernier message: 12/05/2006, 11h05
  4. [LDAP]modification du mot de passe - ligne de commande
    Par sangei dans le forum API standards et tierces
    Réponses: 24
    Dernier message: 01/12/2005, 14h49
  5. Modification de lignes dans un fichier...
    Par Life Hunter dans le forum Langage
    Réponses: 11
    Dernier message: 25/08/2005, 01h37

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