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 :

Problème avec ofstream et ios::app


Sujet :

SL & STL C++

  1. #1
    Membre habitué
    Inscrit en
    Octobre 2004
    Messages
    616
    Détails du profil
    Informations forums :
    Inscription : Octobre 2004
    Messages : 616
    Points : 164
    Points
    164
    Par défaut Problème avec ofstream et ios::app
    Bonsoir à tous, j'ai un petit problème, surement rien de méchant mais je n'arrive pas à le résoudre :/

    J'ai un objet de la classe ofstream que je cré avec en paramètre un fichiers, je remplis ensuite celui-ci en récupérant à un moment ( tellp() ) l'endroit ou je me trouve .

    Une fois mon fichier créer, je fait un close . Puis un open avec le meme nom de fichier avec en flag ( ios::out | ios::app ) et je veux me placer a l'endroit sauvegarder avant .
    Je vais donc un seekp(position,ios::beg,) mais mon programme écrit toujours a la fin de ce fichier.

    Je supose que ios::app ne permet simplement pas de se placer quelquepart avant dans le fichier ouvert . Mais alors comment faire ?
    ios:trunk va me récréer un fichier vierge et ca ne m'interesse pas.

    Je veux simplement ouvrir en écriture un fichier déja existant et ajouter du texte à un endroit ... mais la je sèche !

  2. #2
    Membre averti
    Avatar de David Fleury
    Profil pro
    Inscrit en
    Mars 2004
    Messages
    253
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2004
    Messages : 253
    Points : 307
    Points
    307
    Par défaut
    Bah, essaye sans le ios::app

    Sinon, tu devrais utiliser ios_base::app, ios_base::trunc,... au lieu de ios::

  3. #3
    Membre habitué
    Inscrit en
    Octobre 2004
    Messages
    616
    Détails du profil
    Informations forums :
    Inscription : Octobre 2004
    Messages : 616
    Points : 164
    Points
    164
    Par défaut
    Sans le ios::app le comportement par défaut est d'écraser le fichier si il existe deja; ios_base::app ne change rien .

    Edit: j'avais du zapper ios_base::ate , ca semble faire ce que je veux, ouvrir le fichier sans repositioner le curseur a la fin a chaque écriture, mais ca m'écrase quand même mon fichier O_o ( avec ou sans le seekp() )

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    		   FileStream_.open("Log/Log.xml", std::ios_base::out | std::ios_base::ate);
    			   FileStream_.seekp( WritingPos ,std::ios::beg);

  4. #4
    Membre habitué
    Inscrit en
    Octobre 2004
    Messages
    616
    Détails du profil
    Informations forums :
    Inscription : Octobre 2004
    Messages : 616
    Points : 164
    Points
    164
    Par défaut
    Une piste pourrâit être un flux ouvert en lecture/ ecriture ( fstream ), mais la encore le résultat n'est pas au rendez-vous . ( ou alors je m'y prend mal, je suspecte ma deuxième théorie ^^)

  5. #5
    Membre averti
    Avatar de David Fleury
    Profil pro
    Inscrit en
    Mars 2004
    Messages
    253
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2004
    Messages : 253
    Points : 307
    Points
    307
    Par défaut
    Voici un exemple qui fonctionne

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
     
    /*
    JE SUIS LE COMMENTAIRE A CHANGER
    g++ -O3 -o seekg seekg.cpp
    */
    #include <fstream>
    using namespace std;
    int main() {
        system( "cp -f seekg.cpp seekg.out" );
        fstream file( "seekg.out", ios_base::in |  ios_base::out | ios_base::ate );
        file.seekp( 3, ios_base::beg );
        file << "J'AI CHANGE LE COMMENTAIRE      ";
    }

  6. #6
    Membre habitué
    Inscrit en
    Octobre 2004
    Messages
    616
    Détails du profil
    Informations forums :
    Inscription : Octobre 2004
    Messages : 616
    Points : 164
    Points
    164
    Par défaut
    Je suis presque certain d'avoir testé cette combinaison ! Je retente ce soir et je poste les résultats, merci quoi qu'il en soit !

    edit: Le problème est que le résultat n'est toujours pas comme je l'espère, en fait ca inscrit bien les données aprés, mais ca efface tout

    ex:

    Au début j'ai

    blablabla
    <-- ma position d'écriture au 2nd passage -->
    blabla


    Et quand je réécrit j'ai :

    blalba
    MonNouveauText
    MonAutrenouveautexte


    Et c'est tout , en gros ca écrit par dessus alors que je voudrai "insérer" du texte simplement ... une idée pour contourner cela ?

  7. #7
    Membre averti
    Avatar de David Fleury
    Profil pro
    Inscrit en
    Mars 2004
    Messages
    253
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2004
    Messages : 253
    Points : 307
    Points
    307
    Par défaut
    as-tu essayer le code que je t'ai donné ?

    normalement pour que cela fonctionne il faut utiliser un fstream (et uniquement un fstream) ouvert avec les flag in, out et ate
    Sinon, je vois pas grand chose d'autre.

  8. #8
    Membre habitué
    Inscrit en
    Octobre 2004
    Messages
    616
    Détails du profil
    Informations forums :
    Inscription : Octobre 2004
    Messages : 616
    Points : 164
    Points
    164
    Par défaut
    Mon post précédent fait état des résultat avec le code que tu ma suggérer .

  9. #9
    Membre averti
    Avatar de David Fleury
    Profil pro
    Inscrit en
    Mars 2004
    Messages
    253
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2004
    Messages : 253
    Points : 307
    Points
    307
    Par défaut
    Désolé, je crois que j'ai mal lu le mot "insérer"...

    Je crois qu'il n'y pas de moyen standard pour insérer (mon exemple remplace).
    Il faudrait recréer un nouveau fichier à partir de celui d'origine en le modifiant.
    Une fois tout terminé, tu changes le nom pour écraser l'ancien fichier.

Discussions similaires

  1. Problème avec Ofstream
    Par azeglaoui dans le forum SL & STL
    Réponses: 18
    Dernier message: 12/10/2009, 21h17
  2. problème avec ofstream
    Par rodgeurette dans le forum SL & STL
    Réponses: 4
    Dernier message: 18/07/2007, 14h02
  3. problème avec ofstream::write
    Par b4u dans le forum SL & STL
    Réponses: 3
    Dernier message: 01/06/2006, 14h17
  4. [C++] Problème avec ofstream
    Par Mathieu.J dans le forum SL & STL
    Réponses: 4
    Dernier message: 27/03/2006, 12h51

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