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 :

Remplacer une ligne dans un fichier


Sujet :

C++

  1. #1
    Membre expérimenté
    Profil pro
    Inscrit en
    Février 2004
    Messages
    1 824
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2004
    Messages : 1 824
    Points : 1 544
    Points
    1 544
    Par défaut Remplacer une ligne dans un fichier
    Bonjour à tous,


    Tout au long de mon application, je manipule un fichier via fstream.

    Je dois faire une méthode pour remplacer une ligne. Voici mon code :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
    std::string strNewValue = [...];
    myFile.seekg(std::ios::beg);
    std::string strLine;
    while(std::getline(myFile), srtLine)
    {
        if(CanModify(srtLine))
        {
            // Comment faire ici pour placer strNewValue à la ligne en cours ?
        }
    }

    Il y a bien la méthode de faire un stream séparée, de le remplir au fur et à mesure de la lecture en faisant un "copier/coller" si la modif ne se fait pas ou remplacer la ligne par la modif si besoin il y a mais bon, ça va être assez récurrent et je dois être performant...

    Quelqu'un a une idée ?


    Merci beaucoup,

    A bientôt
    "Heureusement qu'il y avait mon nez, sinon je l'aurais pris en pleine gueule" Walter Spanghero

  2. #2
    Membre expérimenté
    Avatar de coyotte507
    Profil pro
    Inscrit en
    Octobre 2006
    Messages
    1 327
    Détails du profil
    Informations personnelles :
    Âge : 33
    Localisation : France

    Informations forums :
    Inscription : Octobre 2006
    Messages : 1 327
    Points : 1 452
    Points
    1 452
    Par défaut
    Salut,

    dans la situation hypothétique ou les deux lignes (celle que tu veux remplacer et celle par laquelle tu veux la remplacer) ont exactement la même taille, tu peux, avec un fstream, écrire directement dans le fichier que tu lis, à la place des caractères déjà présents.

    A la limite tu peux faire en sorte de compléter certaines lignes par des espaces pour qu'elles aient toutes la même taille Mais s'il y a des tailles assez différentes c'est pas top!

    Ou alors, séparer le fichier en plusieurs autres fichiers, si ton fichier est trop gros et que la méthode du copier-coller n'est pas assez performante.

    Mais je ne sais pas quelles sont les conditions de travail

  3. #3
    Membre expérimenté
    Profil pro
    Inscrit en
    Février 2004
    Messages
    1 824
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2004
    Messages : 1 824
    Points : 1 544
    Points
    1 544
    Par défaut
    Bé ouais ça peut varier beaucoup. Je l'utilise pour enregistrer une série de données dans un fichier au format CSV...

    A chaque lecture de ligne, je stocke la position avant la lecture. Admettons je suis en position 50, je lit la ligne j'arrive en position 70, y'a pas une fonction permettant de supprimer les caractères entre 70 et 50 (revenir en arrière) ? Une fonction de backspace un truc comme ça.

    Merci pour ta réponse,

    A bientôt
    "Heureusement qu'il y avait mon nez, sinon je l'aurais pris en pleine gueule" Walter Spanghero

  4. #4
    Membre expérimenté
    Avatar de coyotte507
    Profil pro
    Inscrit en
    Octobre 2006
    Messages
    1 327
    Détails du profil
    Informations personnelles :
    Âge : 33
    Localisation : France

    Informations forums :
    Inscription : Octobre 2006
    Messages : 1 327
    Points : 1 452
    Points
    1 452
    Par défaut
    Je ne crois pas que tu peux "décaler" les caractères d'un fichier, ou alors ça revient à faire ta première méthode.

    On peut par contre tronquer le fichier ou écrire à la place des caractères directement..

    Enfin écrire et lire un fichier, ça ne prend pas autant de temps que ça, sûrement moins de temps que les algorithmes qu'il y a dans ton programme.

    Au pire, écrire dans un deuxième fichier prend autant de temps que de lire dans le premier, donc tu multiplies au plus le temps d'exécution par 2.

  5. #5
    Membre expérimenté
    Profil pro
    Inscrit en
    Février 2004
    Messages
    1 824
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2004
    Messages : 1 824
    Points : 1 544
    Points
    1 544
    Par défaut
    Ok ouais... ça me semble pas très propre c'est pour ça.

    Tout comme il y a le caractère de passage à la ligne, comme lorsque l'on appuie sur "entrer", j'aurai aimé qu'il y ai le caractère d'effacement du caractère précedent le curseur...

    Bon j'vais me débrouiller pour pas faire un truc trop tordu

    Merci à toi
    "Heureusement qu'il y avait mon nez, sinon je l'aurais pris en pleine gueule" Walter Spanghero

  6. #6
    Expert éminent sénior
    Avatar de koala01
    Homme Profil pro
    aucun
    Inscrit en
    Octobre 2004
    Messages
    11 614
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 52
    Localisation : Belgique

    Informations professionnelles :
    Activité : aucun

    Informations forums :
    Inscription : Octobre 2004
    Messages : 11 614
    Points : 30 626
    Points
    30 626
    Par défaut
    Salut,

    Il ne faut pas oublier que les fichiers sont, "par nature", "gravés dans le marbre"...

    On te dira qu'il est possible d'envisager, si la taille de la partie à changer est identique à celle de la partie de remplacement, d'envisager de travailler sur le cache du fichier, mais, dans la très grande majeure partie des cas, si tu dois modifier le contenu d'un fichier, soit tu peux te "contenter" de rajouter du contenu à la suite de l'existant ("concaténation" de contenu), soit, si les modifications à apporter apparaissent au grand n'importe où dans le fichier, le mieux reste toujours de "briser le moule" et de recommencer l'écriture complète...

    Maintenant, il peut sembler opportun d'envisager une gestion particulière des informations que tu veux faire apparaitre dans ton fichier, et de t'assurer de ne les enregistrer qu'une fois qu'elles ne seront plus modifiées, pour éviter les écritures inutiles

    Enfin, comme l'a si bien fait remarquer coyotte, le temps nécessaire à l'écriture dans un fichier reste malgré tout suffisamment limité pour que, en prenant la précaution élémentaire de ne pas faire la recommencer 20 fois inutilement, le fait de "réécrire" les informations ne devrait *normalement* pas présenter de problème majeur de performance...

    N'oublie pas que dans 95% des cas, une optimisation prématurée est la voie de tous les maux (et ca donne encore mieux en Anglais ).

    Une optimisation qui n'aura rien de prématuré pourra prendre la forme d'une réflexion accrue sur le moyen de déterminer nécessité de l'écriture, afin qu'elle ne se fasse pas inutilement, mais le fait de réfléchir à un moyen (d'office scabreux) pour apporter des modifications sans tout réécrire, alors que tu n'a aucune information à la base sur le fait que cette réécriture est effectivement gourmande en temps et ou en ressources représente bel et bien une tentative d'optimisation prématurée

    Une fois que, à force de tests, de bench et/ou d'autres profiling, tu auras la certitude que tu a affaire à un goulot d'étranglement dans ton comportement de modification des informations dans le fichier, il sera toujours temps de réfléchir au moyen d'améliorer cela
    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

  7. #7
    Membre expérimenté
    Profil pro
    Inscrit en
    Février 2004
    Messages
    1 824
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2004
    Messages : 1 824
    Points : 1 544
    Points
    1 544
    Par défaut
    Ok merci pour cette longue réponse.

    Du coup je compte charger les données dans un vector<std::string> et en cas de modification/suppression, je réécrit le fichier.
    Normalement ces opérations restant ponctuelles, ça devrait aller.

    Merci beaucoup,

    A bientôt
    "Heureusement qu'il y avait mon nez, sinon je l'aurais pris en pleine gueule" Walter Spanghero

Discussions similaires

  1. Remplacer une ligne dans un fichier texte !
    Par toulouz1 dans le forum VBScript
    Réponses: 23
    Dernier message: 19/07/2017, 10h26
  2. Commande pour remplacer une ligne dans un fichier.txt
    Par ludobspp dans le forum Tcl/Tk
    Réponses: 1
    Dernier message: 07/11/2013, 08h19
  3. [Batch] Remplacer une ligne dans un fichier modèle
    Par PAB/31/SAB dans le forum Scripts/Batch
    Réponses: 2
    Dernier message: 12/03/2010, 10h16
  4. Remplacer une ligne dans un fichier de configuration
    Par morgan47 dans le forum Langage
    Réponses: 3
    Dernier message: 08/09/2008, 13h15
  5. Remplacer une ligne dans un fichier ?
    Par FenX. dans le forum Shell et commandes GNU
    Réponses: 2
    Dernier message: 30/05/2008, 10h45

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