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 donnée au milieu d'un fichier


Sujet :

C++

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Profil pro
    Inscrit en
    Mai 2004
    Messages
    19
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2004
    Messages : 19
    Par défaut Remplacer une donnée au milieu d'un fichier
    Bonjour,

    Je voudrais faire un code pour arranger un fichier texte dans lequel sont présentes des données en colonnes. Je souhaiterais changer certaines de ces données après les avoir controler c'est-à-dire que je balaye toutes les données de mon fichier en vérifiant à chaque fois si la donnée correspondent ou non à ce que veux. Si oui, je passe à la suivante. Si non, je l'efface et j'en rajoute une nouvelle.
    Je précise qu'une ligne n'est pas formatée pour faire taille constante.

    Pour moi, il y a 2 solutions :
    1/ J'ouvre un fichier vide et mon fichier à arranger et je recopie mon fichier dans le vide en changeant les données pas bonnes => solution simple mais pas élegante.

    2/ J'ouvre mon fichier et dès que je trouve une donnée pas bonne, je l'efface et je la remplace à la volée.

    Je voudrais mettre en place la 2° solution. Je pense que je vais jouer avec la classe fstream et notamment les pointeurs de position pour revenir en arrière dès que j'ai lu ma donnée erronée pour l'effacer mais déjà je ne même pas comment effacer la donnée erronée dans le fichier... Est-ce que ma donnée erronée va être écrasée si j'écris à son début ou est-ce qu'elle va être "poussée"?
    Pour ce qui est de l'effacement j'ai pensé à utiliser le code "8" (en base 10 et 16) qui correspond au backspace en ascii mais je ne sais pas si ça marchera.

  2. #2
    Rédacteur
    Avatar de Laurent Gomila
    Profil pro
    Développeur informatique
    Inscrit en
    Avril 2003
    Messages
    10 651
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Avril 2003
    Messages : 10 651
    Par défaut
    Contrairement à ce que tu penses, la solution 1/ est la meilleure. Ce sera plus élégant que plein de bidouilles avec des \b et des repositionnements dans le fichier.

  3. #3
    Membre averti
    Profil pro
    Inscrit en
    Mai 2004
    Messages
    19
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2004
    Messages : 19
    Par défaut
    oui c'est vrai que c'est la plus simple et vu que j'ai pas trop de temps à perdre, je vais sans doute l'utiliser mais j'aurais bien aimé savoir à titre de culture en C++ comment le faire avec la 2° méthode.

  4. #4
    Membre chevronné
    Inscrit en
    Novembre 2006
    Messages
    362
    Détails du profil
    Informations forums :
    Inscription : Novembre 2006
    Messages : 362
    Par défaut
    Citation Envoyé par Laurent Gomila
    Contrairement à ce que tu penses, la solution 1/ est la meilleure. Ce sera plus élégant que plein de bidouilles avec des \b et des repositionnements dans le fichier.
    oui c'est vrai que c'est la plus simple et vu que j'ai pas trop de temps à perdre
    La plupart du temps, ce n'est pas seulement la plus simple, mais aussi la meilleure (comme le dit Laurent Gomila).

    Si tu as à mettre en relation plusieurs valeurs de ton fichier, tu dois vouloir les manipuler en même temps, et pour cela, il est plus efficace de les charger toutes en mémoire dans un format que tu sais exploiter (c'est à dire sous forme entière si ce sont des entiers par exemple).

    En revanche, il est possible que la méthode 2 soit la seule possible à mettre en oeuvre, à condition que tu n'aie pas de relation à faire entre les éléments, si par exemple :
    - ton fichier est trop gros pour être chargé en mémoire
    - tu ne sais pas lire, interpréter, stocker ou reproduire une partie de ton fichier
    ...

    Deux exemples pour illustrer mon propos :
    Cas 1 : ton fichier est un tableau d'entier avec la somme à chaque ligne et tu veux vérifier les sommes :
    Exemple de fichier
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    Etape	A	B
    initial	0	0
    ajout	4	7
    somme	4	9
    ajout	8	14
    somme	13	25
    Dans un tel fichier, si tu veux remlacer les chiffres en gras pour avoir les bonnes sommes (9 devient 7, 13 devient 12, 14 devient 21) , le mieux est de tout charger en mémoire puis de tout réécrire. Sinon :
    - tu vas passer ton temps à faire des lectures / écritures de fichier et de conversions chaine de caractère -> entiers / entiers -> chaine de caractère. Donc ton gain de performances est contestable.
    - tu vas passer ton temps à faire des aller retour dans ton fichier. Donc ton gain de performances est contestable.
    - tu vas avoir du mal à fair évoluer ton code dans des cas simple, comme par exemple la demande : "reporter la somme finale d'une colonne en valeur initiale de la colonne suivante"

    Cas 2 : tu possède toute l'encyclopédia universalis dans un fichier texte, et tu veux remplacer les double quote (") par des simples quotes (').
    Dans ce cas là, il vaut mieux utiliser ta solution 2.

  5. #5
    Rédacteur
    Avatar de Laurent Gomila
    Profil pro
    Développeur informatique
    Inscrit en
    Avril 2003
    Messages
    10 651
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Avril 2003
    Messages : 10 651
    Par défaut
    A noter que si le traitement en question consiste simplement en des remplacements à base d'expressions régulières ou autre (comme le cas 2 de Feriaman), un langage de script sera plus adapté.

  6. #6
    Expert confirmé

    Inscrit en
    Novembre 2005
    Messages
    5 145
    Détails du profil
    Informations forums :
    Inscription : Novembre 2005
    Messages : 5 145
    Par défaut
    On n'enleve pas les donnees d'un fichier, on les remplace. Ce qui fait qu'en pratique les modifications d'un fichier texte se limitent au remplacement complet (ou a la rigueur a partir d'un endroit fixe) ou a l'ajout en fin.

    Si tu tiens reellement a tenter de le faire... le caractere ASCII concu pour remplacer les donnees supprimees, c'est DEL (0x7F) mais tu peux utiliser aussi NUL (0x00). Je n'essaierais pas avec d'autres, certainement pas BS est utilise dans certaines variantes nationales pour creer des caracteres complexes (' BS e donnant é par exemple).

  7. #7
    Membre averti
    Profil pro
    Inscrit en
    Mai 2004
    Messages
    19
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2004
    Messages : 19
    Par défaut
    Citation Envoyé par Jean-Marc.Bourguet
    On n'enleve pas les donnees d'un fichier, on les remplace. Ce qui fait qu'en pratique les modifications d'un fichier texte se limitent au remplacement complet (ou a la rigueur a partir d'un endroit fixe) ou a l'ajout en fin.

    Si tu tiens reellement a tenter de le faire... le caractere ASCII concu pour remplacer les donnees supprimees, c'est DEL (0x7F) mais tu peux utiliser aussi NUL (0x00). Je n'essaierais pas avec d'autres, certainement pas BS est utilise dans certaines variantes nationales pour creer des caracteres complexes (' BS e donnant é par exemple).
    Hum, bon je vais faire mon boulet mais pourrais-je avoir un petit exemple très court J'ai pas compris comment utiliser ces caractères.

    Sinon, je vais effectivement utiliser la méthode 1 parce que sinon j'ai pas fini mais ça reste intéressant je trouve de comprendre comment faire avec la méthode 2.

    PS pour Laurent Gomila : Je me trouve effectivement dans une version un peu plus compliquée du cas 2 de Feriaman mais mon programme ne fait pas que ça et le reste est écrit en c++.

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

Discussions similaires

  1. Remplacer une chaine de caractère dans un fichier texte.
    Par Empty_body dans le forum VBA Access
    Réponses: 1
    Dernier message: 19/01/2008, 11h16
  2. Remplacer une chaîne de caractères dans un fichier .hex
    Par subsix dans le forum Assembleur
    Réponses: 8
    Dernier message: 23/11/2006, 21h06
  3. Réponses: 4
    Dernier message: 18/07/2006, 16h31
  4. Réponses: 10
    Dernier message: 16/06/2006, 13h53
  5. Réponses: 7
    Dernier message: 27/09/2005, 11h54

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