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 :

[fstream] Modification d'une ligne


Sujet :

C++

  1. #1
    Membre à l'essai
    Profil pro
    Inscrit en
    Mars 2010
    Messages
    3
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2010
    Messages : 3
    Par défaut [fstream] Modification d'une ligne
    Bonjour,

    J'ai un peu de mal à comprendre comment réécrire une ligne spécifique dans un fichier.

    Je tente de procédé de la facon suivante:

    Je fais une fonction qui me renvoi le nombre de caractere qu'il y a avant la ligne que je souhaite modifié.

    Je fais un seek avec le nombre de caractere en argument ( +1 pour chaque ligne, car je suis sous linux. pour le caractere de retour de ligne ).

    et j'écris ma chaine modifié.

    Est-ce la bonne façon de procédé ?

    Car je trouve ça pas forcement super propre, et mon code ne fonctionne pas, je n'écris pas au bonne endroit. ( c'est un problème de logique, donc ça vient de moi, mais je vais y arriver ).

    Auriez vous des conseils a me donner pour que je puisse faire ça de la meilleure facon possible.

    Merci d'avance.

  2. #2
    Expert éminent
    Avatar de koala01
    Homme Profil pro
    aucun
    Inscrit en
    Octobre 2004
    Messages
    11 644
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 53
    Localisation : Belgique

    Informations professionnelles :
    Activité : aucun

    Informations forums :
    Inscription : Octobre 2004
    Messages : 11 644
    Par défaut
    Salut,

    Le problème avec les fichiers, c'est... qu'ils sont "gravés dans le marbre"...

    En effet, à moins d'être totalement sur que la taille de la partie de remplacement à la taille de la partie à remplacer, toutes les modifications risquent soit de "laisser trainer" des trace de la partie remplacée (parce que la taille de la partie de substitution est inférieure à la taille de la partie remplacée), soit d'écraser des informations qui n'auraient jamais du être remplacées (parce que la taille de la partie de substitution et supérieure à la taille de la partie remplacée).

    Si tu veux modifier un fichier, le plus simple est donc de "briser le moule", c'est à dire... d'effacer le fichier et de le réécrire.

    Deux solutions s'offrent à toi pour y arriver:
    • charger l'ensemble du fichier dans une structure adaptée, modifier les informations dans cette structure, et terminer en réécrivant le tout dans un fichier dont le nom est... le nom d'origine.
    • Lire les information "une à une" dans le fichier d'origine et les copier (après modification éventuelle) dans un fichier temporaire, puis supprimer le fichier d'origine et renommer le fichier temporaire en lui donnant le nom... du fichier d'origine
    Toute autre tentative aura de grandes chances d'être vouée à l'échec
    A méditer: La solution la plus simple est toujours la moins compliquée
    Ce qui se conçoit bien s'énonce clairement, et les mots pour le dire vous viennent aisément. Nicolas Boileau
    Compiler Gcc sous windows avec MinGW
    Coder efficacement en C++ : dans les bacs le 17 février 2014
    mon tout nouveau blog

  3. #3
    Membre à l'essai
    Profil pro
    Inscrit en
    Mars 2010
    Messages
    3
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2010
    Messages : 3
    Par défaut
    Voila une réponse qui à le mérite d'être claire. Merci bcp

    Je me demande comment font les librairies qui permettent de manipuler des fichiers ini par exemple. Je suppose qu'elles ne réécrivent pas le fichier en entier... mais simplement à l'emplacement des valeurs de clef.

    En tout cas merci encore, je vais donc modifié mon code et arrêté de vouloir faire un truc qui semble impossible.

  4. #4
    Membre émérite
    Profil pro
    Inscrit en
    Mai 2006
    Messages
    780
    Détails du profil
    Informations personnelles :
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations forums :
    Inscription : Mai 2006
    Messages : 780
    Par défaut
    Citation Envoyé par error403 Voir le message
    Voila une réponse qui à le mérite d'être claire. Merci bcp

    Je me demande comment font les librairies qui permettent de manipuler des fichiers ini par exemple. Je suppose qu'elles ne réécrivent pas le fichier en entier... mais simplement à l'emplacement des valeurs de clef.

    En tout cas merci encore, je vais donc modifié mon code et arrêté de vouloir faire un truc qui semble impossible.
    Je pense qu'elles font comme tout le monde, elles lisent le fichier et remplissent une structure en mémoire ( une std::map par exemple ) qui permet d'accéder rapidement à toutes les données. Ensuite, si elles doivent réécrire le fichier, elles prennent leur structure en mémoire, parcourent les éléments et réécrivent le fichier ligne par ligne.

  5. #5
    Expert éminent
    Avatar de koala01
    Homme Profil pro
    aucun
    Inscrit en
    Octobre 2004
    Messages
    11 644
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 53
    Localisation : Belgique

    Informations professionnelles :
    Activité : aucun

    Informations forums :
    Inscription : Octobre 2004
    Messages : 11 644
    Par défaut
    Citation Envoyé par error403 Voir le message
    Voila une réponse qui à le mérite d'être claire. Merci bcp

    Je me demande comment font les librairies qui permettent de manipuler des fichiers ini par exemple. Je suppose qu'elles ne réécrivent pas le fichier en entier... mais simplement à l'emplacement des valeurs de clef.
    Bien au contraire...

    Il faut comprendre que le fichier ini (ou de tout autre fichier similaire) n'est là que... pour assurer la persistance de données entre deux utilisations de l'application.

    S'il fallait, en cours d'application, commencer à lire dans le fichier ini chaque fois que l'on a besoin d'une des valeurs qui s'y trouve, on n'arrêterait pour ainsi dire pas de... lire et relire dans le fichiers.

    Or, l'accès aux données d'un fichier est le type d'accès le plus lent que l'on trouve sur un ordinateur (exception faite des connexions réseau de mauvaise qualité).

    Une application qui irait lire dans un fichier en permanence serait donc particulièrement lente

    L'idée est donc de lire le fichier ini une bonne fois pour toutes et de garder les informations lues "quelque part en mémoire", et de sauvegarder ces données... juste avant de quitter l'application "pour de bon".

    A l'extrême limite, si tu as les autorisations pour, tu pourrais très bien envisager de supprimer purement et simplement le fichier ini une fois que l'application est lancée, et il devrait être réécrit "in extenso" au moment où tu confirme de vouloir quitter l'application, seul un éventuel flag indiquant qu'il a été modifié pouvant empêcher cette réécriture
    A méditer: La solution la plus simple est toujours la moins compliquée
    Ce qui se conçoit bien s'énonce clairement, et les mots pour le dire vous viennent aisément. Nicolas Boileau
    Compiler Gcc sous windows avec MinGW
    Coder efficacement en C++ : dans les bacs le 17 février 2014
    mon tout nouveau blog

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

Discussions similaires

  1. Modification d'une ligne d'un datagridview via checkbox
    Par DiamonDonald dans le forum Windows Forms
    Réponses: 7
    Dernier message: 08/04/2008, 23h42
  2. date auto si modification d'une ligne ou colonne
    Par chris81 dans le forum Excel
    Réponses: 2
    Dernier message: 16/10/2007, 07h40
  3. 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
  4. Réponses: 1
    Dernier message: 19/05/2006, 17h33
  5. Réponses: 3
    Dernier message: 03/04/2006, 10h42

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