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

SL & STL C++ Discussion :

Ecriture, ofstream, remplacement de lignes


Sujet :

SL & STL C++

  1. #1
    Membre habitué Avatar de Bobybx
    Profil pro
    Inscrit en
    avril 2005
    Messages
    122
    Détails du profil
    Informations personnelles :
    Localisation : France, Gironde (Aquitaine)

    Informations forums :
    Inscription : avril 2005
    Messages : 122
    Points : 125
    Points
    125
    Par défaut Ecriture, ofstream, remplacement de lignes
    Bonjour,

    J'ai une question peut-être bête mais je suis bloqué :
    J'ai un fichier texte avec 3 lignes

    ligne 1
    ligne 2
    ligne 3

    Le contenu de ces lignes varient et sont totalement différents.
    Je souhaiterais effacer via ofstream la ligne 2 pour la remplacer par une ligne 4 d'une longueur différente.
    Je connais la position de la ligne 2 et place le curseur sur celle-ci grace à
    fichier.seekg(position);

    Comment effacer la ligne à cette position (ligne 2) en la remplaçant par une autre (ligne 4) sans toucher les autres lignes ??

    Merci d'avance.
    Have Fun
    Have Fun

  2. #2
    Expert éminent
    Avatar de Swoög
    Profil pro
    Inscrit en
    janvier 2003
    Messages
    6 045
    Détails du profil
    Informations personnelles :
    Âge : 33
    Localisation : France

    Informations forums :
    Inscription : janvier 2003
    Messages : 6 045
    Points : 8 181
    Points
    8 181
    Par défaut
    Quand on écrit dans un fichier ouvert en lecture/écriture, les carctère écrits remplacent automatiquement les précédents... tu as donc 2 choix :

    ta nouvelle ligne fait exactement le même nombre de caractère que la ligne 2 : tu peux réécrire directement sans problèmes...

    les deux lignes ont une longueur différente : il te faut charger tout le fichier, puis le réécrire en l'écrasant...

    parce que :
    si ta ligne est plus courte, que tu réécrit ta ligne par dessus puis que tu décales le reste, les derniers caractères de la dernière ligne du fichier seront en doubles puisqu'ils n'auront pas été réécrits

    si ta ligne est plus longue, il te faudra de toute façons charger la fin du fichier avant de réécrire...


    En conclusion, je pense que le choix le plus pratique et de charger tout ton fichier dans un string ou un vector<string> (par exemple) puis de tout réécrire ensuite...
    Rédacteur "éclectique" (XML, Cours PHP, Cours JavaScript, IRC, Web...)
    Les Règles du Forum - Mon Site Web sur DVP.com (Développement Web, PHP, (X)HTML/CSS, SQL, XML, IRC)
    je ne répondrai à aucune question technique via MP, MSN ou Skype : les Forums sont là pour ça !!! Merci de me demander avant de m'ajouter à vos contacts sinon je bloque !
    pensez à la balise [ code ] (bouton #) et au tag (en bas)

  3. #3
    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 : 36
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : avril 2003
    Messages : 10 651
    Points : 15 698
    Points
    15 698
    Par défaut
    Tu recopies tout dans un buffer temporaire en faisant ton remplacement lorsque tu arrives sur la ligne 2, puis tu écrases complétement l'ancien contenu du fichier avec ce buffer.

  4. #4
    Membre habitué Avatar de Bobybx
    Profil pro
    Inscrit en
    avril 2005
    Messages
    122
    Détails du profil
    Informations personnelles :
    Localisation : France, Gironde (Aquitaine)

    Informations forums :
    Inscription : avril 2005
    Messages : 122
    Points : 125
    Points
    125
    Par défaut
    En effet,

    j'ai réfléchi quelques temps après mon message que le fait que la ligne est une longueur différente me pose quelques soucis. j'ai trouvé un moyen pour que toutes les lignes à modifier ait la même longueur

    Je connais donc la position d'une ligne que je souhaite remplacer par une autre ligne de même taille, m'évitant ainsi de toucher aux autres.

    Comment faire ceci, (si c'est possible)

    Merci pour votre aide
    Have Fun

  5. #5
    Membre habitué Avatar de Bobybx
    Profil pro
    Inscrit en
    avril 2005
    Messages
    122
    Détails du profil
    Informations personnelles :
    Localisation : France, Gironde (Aquitaine)

    Informations forums :
    Inscription : avril 2005
    Messages : 122
    Points : 125
    Points
    125
    Par défaut
    Citation Envoyé par Laurent Gomila
    Tu recopies tout dans un buffer temporaire en faisant ton remplacement lorsque tu arrives sur la ligne 2, puis tu écrases complétement l'ancien contenu du fichier avec ce buffer.

    Cela m'amènerait à modifier ma ligne 3 écrite après la ligne 2, ce qui ne va pas.

    Je souhaite juste modifier la ligne 2 par une ligne de même taille exactement!
    Have Fun

  6. #6
    Expert éminent
    Avatar de Swoög
    Profil pro
    Inscrit en
    janvier 2003
    Messages
    6 045
    Détails du profil
    Informations personnelles :
    Âge : 33
    Localisation : France

    Informations forums :
    Inscription : janvier 2003
    Messages : 6 045
    Points : 8 181
    Points
    8 181
    Par défaut
    Citation Envoyé par Swoög
    Quand on écrit dans un fichier ouvert en lecture/écriture, les carctère écrits remplacent automatiquement les précédents... tu as donc 2 choix :

    ta nouvelle ligne fait exactement le même nombre de caractère que la ligne 2 : tu peux réécrire directement sans problèmes...
    Rédacteur "éclectique" (XML, Cours PHP, Cours JavaScript, IRC, Web...)
    Les Règles du Forum - Mon Site Web sur DVP.com (Développement Web, PHP, (X)HTML/CSS, SQL, XML, IRC)
    je ne répondrai à aucune question technique via MP, MSN ou Skype : les Forums sont là pour ça !!! Merci de me demander avant de m'ajouter à vos contacts sinon je bloque !
    pensez à la balise [ code ] (bouton #) et au tag (en bas)

  7. #7
    Membre habitué Avatar de Bobybx
    Profil pro
    Inscrit en
    avril 2005
    Messages
    122
    Détails du profil
    Informations personnelles :
    Localisation : France, Gironde (Aquitaine)

    Informations forums :
    Inscription : avril 2005
    Messages : 122
    Points : 125
    Points
    125
    Par défaut
    Citation Envoyé par Swoög
    Quand on écrit dans un fichier ouvert en lecture/écriture, les carctère écrits remplacent automatiquement les précédents... tu as donc 2 choix :

    ta nouvelle ligne fait exactement le même nombre de caractère que la ligne 2 : tu peux réécrire directement sans problèmes...
    je vais tester ça
    Have Fun

  8. #8
    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 : 36
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : avril 2003
    Messages : 10 651
    Points : 15 698
    Points
    15 698
    Par défaut
    Cela m'amènerait à modifier ma ligne 3 écrite après la ligne 2, ce qui ne va pas
    Pas compris ce que tu voulais dire.

    Je souhaite juste modifier la ligne 2 par une ligne de même taille exactement!
    Dans ton premier post tu dis le contraire.

    Je souhaiterais effacer via ofstream la ligne 2 pour la remplacer par une ligne 4 d'une longueur différente.

  9. #9
    Membre habitué Avatar de Bobybx
    Profil pro
    Inscrit en
    avril 2005
    Messages
    122
    Détails du profil
    Informations personnelles :
    Localisation : France, Gironde (Aquitaine)

    Informations forums :
    Inscription : avril 2005
    Messages : 122
    Points : 125
    Points
    125
    Par défaut
    Citation Envoyé par Laurent Gomila
    Pas compris ce que tu voulais dire.
    Dans ton premier post tu dis le contraire.
    J'ai rectifié mon 1er post, la ligne prenant la place de celle à modifier ont exactement la même taille maintenant.
    Have Fun

  10. #10
    Membre habitué Avatar de Bobybx
    Profil pro
    Inscrit en
    avril 2005
    Messages
    122
    Détails du profil
    Informations personnelles :
    Localisation : France, Gironde (Aquitaine)

    Informations forums :
    Inscription : avril 2005
    Messages : 122
    Points : 125
    Points
    125
    Par défaut
    euh... une question :

    Comment on utilise ofstream pour modifier "fichier.txt" à la position 64 par exemple ?

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    int position = 64;
    ofstream fichier( "fichier.txt" );
    fichier.seekg(position);
    fichier << "Une ligne\n";
    seekg ne fonctionne pas avec ofstream

    (je suis pas très bon, cela se voit non? )
    Have Fun

  11. #11
    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 : 36
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : avril 2003
    Messages : 10 651
    Points : 15 698
    Points
    15 698
    Par défaut
    seekg (seek get) c'est pour positionner le pointeur de lecture, pour l'écriture c'est seekp (seek put).

    Il faut également ouvrir ton fichier avec le flag ios::app pour qu'il ne soit pas effacé.

  12. #12
    Membre habitué Avatar de Bobybx
    Profil pro
    Inscrit en
    avril 2005
    Messages
    122
    Détails du profil
    Informations personnelles :
    Localisation : France, Gironde (Aquitaine)

    Informations forums :
    Inscription : avril 2005
    Messages : 122
    Points : 125
    Points
    125
    Par défaut
    Citation Envoyé par Laurent Gomila
    seekg (seek get) c'est pour positionner le pointeur de lecture, pour l'écriture c'est seekp (seek put).

    Il faut également ouvrir ton fichier avec le flag ios::app pour qu'il ne soit pas effacé.

    En effet, c'est mieux avec seekp

    Mais j'ai eu l'effet que je redoutais.
    Le code suivant m'efface mes lignes avant la position 64 me laissant 64 blanc avant et m'efface tout ce qui est après la ligne.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    int position = 64;
    ofstream fichier( "fichier.txt" );
    fichier.seekp(position);
    fichier << "Une ligne\n";
    Pourriez vous m'aider svp car là je suis incapable de supprimer la ligne à la poisition 64 sans toucher au reste.

    Merci de votre patience
    Have Fun

  13. #13
    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 : 36
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : avril 2003
    Messages : 10 651
    Points : 15 698
    Points
    15 698
    Par défaut
    Citation Envoyé par Laurent Gomila
    Il faut également ouvrir ton fichier avec le flag ios::app pour qu'il ne soit pas effacé.

  14. #14
    Membre habitué Avatar de Bobybx
    Profil pro
    Inscrit en
    avril 2005
    Messages
    122
    Détails du profil
    Informations personnelles :
    Localisation : France, Gironde (Aquitaine)

    Informations forums :
    Inscription : avril 2005
    Messages : 122
    Points : 125
    Points
    125
    Par défaut
    le flag ios::app ne sert-il pas ajouter à la suite ?

    si je fais le code suivant :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    int position = 164;
    ofstream fichier( "cpm.txt", ios_base::app );
    fichier.seekp(position);
    fichier << "Groupe Z\n";
    ma position ne sert à rien puisque l'écriture de ma ligne se fait après le fichier. Cela ne modifie en rien la ligne à la position 164.

    Est-ce que je fais une mauvaise manip?
    Have Fun

  15. #15
    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 : 36
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : avril 2003
    Messages : 10 651
    Points : 15 698
    Points
    15 698
    Par défaut
    le flag ios::app ne sert-il pas ajouter à la suite ?
    Si, mais on s'en fiche puisque tu changes de toute façon la position d'écriture. Ici il sert surtout à ne pas effacer le contenu du fichier.

    ma position ne sert à rien puisque l'écriture de ma ligne se fait après le fichier. Cela ne modifie en rien la ligne à la position 164.
    Ca me paraît bizarre, mais enfin bon je ne fais jamais ce genre de manip donc j'ai pu louper quelque chose.

  16. #16
    Membre habitué Avatar de Bobybx
    Profil pro
    Inscrit en
    avril 2005
    Messages
    122
    Détails du profil
    Informations personnelles :
    Localisation : France, Gironde (Aquitaine)

    Informations forums :
    Inscription : avril 2005
    Messages : 122
    Points : 125
    Points
    125
    Par défaut
    J'ai trouvé une piste qui va m'aider et cela grâce à l'aide apportée :

    c'est ios::in le flag qui permet de modifier la ligne à la position 164 sans toucher avant ou après.

    Je vais essayer d'exploiter cela.
    Je vous tiens au courant.
    Have Fun

  17. #17
    Membre habitué Avatar de Bobybx
    Profil pro
    Inscrit en
    avril 2005
    Messages
    122
    Détails du profil
    Informations personnelles :
    Localisation : France, Gironde (Aquitaine)

    Informations forums :
    Inscription : avril 2005
    Messages : 122
    Points : 125
    Points
    125
    Par défaut
    Je confirme le code :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    int position = 164;
    ofstream fichier( "fichier.txt", ios_base::in );
    fichier.seekp(position);
    fichier << "Groupe B";
    Cela me permet de modifier la ligne à la position 164 par "Groupe B" sans aucun impact sur les lignes précédentes et lignes suivantes.

    Merci !!!!!!!!!!!!!!!!!!!!!!!!!
    Have Fun

  18. #18
    Nouveau Candidat au Club
    Homme Profil pro
    Étudiant
    Inscrit en
    janvier 2021
    Messages
    1
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 30
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : janvier 2021
    Messages : 1
    Points : 1
    Points
    1
    Par défaut xkill : remplacer une ligne dans un fichier ofstream , ifstream
    Voici le code
    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
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
     
     
    #include <iostream>
    #include <fstream>
    #include <vector>                    //vector obligatoire pour le buffer
    using namespace std;
     
    int main()
    {
        vector<string> tableau;                   //cree un tableau vector
        string buffer;
     
     
        ifstream fichier("C:\\Users\\xkill\\Desktop\\chat.txt");   //lit le fichier
     
     
     
        while (!fichier.eof())                  //tu incere les lignes dans buffer avec un loop eof fin de fichier
        {
            fichier >> buffer;
            tableau.push_back(buffer);
        }
     
     
        string buffer_modifier = "xkill";        //tu cree la modife que tu veut dans ton vecteur tableau sachant quil y a que 3 ligne    0,1,2   
        tableau[2] = buffer_modifier;
     
     
        ofstream f("C:\\Users\\xkill\\Desktop\\chat.txt");    // tu réecrit par dessus le meme fichier
     
        int timer = 0;
        while (timer < 3)                                //loop 3  attention si tu depasse 3  overflow erreur de tampon car le vector a que 3
        {
            f << tableau[timer];
            f << "\n";
            timer = timer + 1;
        }
     
     
     
    //ps si tu veux une variable a la place de 3    tu crée un  int nombre_ligne au debut du main()  = 0,  et dans le while eof() tu rajoute en tout dernier nombre_ligne = nombre_ligne + 1;   nombre_ligne sera eglal au nombre de ligne dans le fichier et poura remplacer 3.
     
     
    xkill

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

Discussions similaires

  1. Ecriture fichier remplacement ligne
    Par iperkut dans le forum Langage
    Réponses: 6
    Dernier message: 19/05/2010, 11h13
  2. Remplacer une ligne d'un fichier texte
    Par mullinski dans le forum VB 6 et antérieur
    Réponses: 6
    Dernier message: 02/07/2006, 19h53
  3. Ecriture en fin de ligne
    Par kamshaa dans le forum Langage
    Réponses: 4
    Dernier message: 02/06/2006, 14h43
  4. Réponses: 9
    Dernier message: 22/05/2006, 13h21
  5. Remplacer une ligne dans une fichier
    Par norior dans le forum Langage
    Réponses: 1
    Dernier message: 18/01/2006, 13h25

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