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 :

[bug aléatoire] sauvegarde dans un fichier


Sujet :

C++

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre Expert
    Avatar de poukill
    Profil pro
    Inscrit en
    Février 2006
    Messages
    2 155
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : France

    Informations forums :
    Inscription : Février 2006
    Messages : 2 155
    Par défaut [bug aléatoire] sauvegarde dans un fichier
    Bonjour à tous!
    Je travaille sur un projet d'images où mon but est que l'utilisateur puisse placer des points sur l'écran, et les sauvegarder pour ne pas perdre son travail !
    Mon programme tourne en général au début, mais plante (les points ne se chargent plus, ou bien une partie disparaissent etc...)

    Suite à vos conseils, j'ai tout recodé en C++ pour éviter le mélange C/C++ pas beau, et surtout pour éviter les pointeurs!

    Dans ce petit projet, je place des points sur l'écran, je les sauve. Je ferme. Je rouvre. Je charge. Je replace des points, et ainsi de suite.
    Ce qui m'intrigue, c'est que je ne trouve pas de lien (même en fouillant). Tout ce que j'ai décelé, c'est que mon fichier de sauvegarde était parfois degradé (c'est à dire pas dans le format attendu )

    Pour info, mes Points De Controle sont déclarés en vector <pair> dans le programme principal. Pour sauvegarder mes points, j'écris dans le fichier "config.XY" où le premier int est le nombre de points.

    Voici les sources (parties utiles...)

    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
    
    void sauvePDC (const std::vector< std::pair <int, int> >& depart, const std::vector< std::pair <int, int> >& arrivee, float coeff_mul) {
    FILE *fichier = 0;
    int a = depart.size();
     
    int *buf = newint[4*a+1];
    buf[0] =a;
    std::vector < std::pair <int, int> >::const_iterator i;
     
    for (i=depart.begin(); i < depart.end(); i++) {
       int j= std::distance(depart.begin(), i);
         buf[j+1] =static_cast<int>( floor (static_cast<float> (i->first) /coeff_mul +0.5) );
         buf[j+a+1] = static_cast<int>( floor (static_cast<float> (i->second) /coeff_mul +0.5));
    }
    for (i=arrivee.begin(); i < arrivee.end(); i++) {
       int j= std::distance(arrivee.begin(), i);
         buf[j+2*a+1] = static_cast<int>( floor (static_cast<float> (i->first) /coeff_mul +0.5) );
         buf[j+3*a+1] = static_cast<int>( floor (static_cast<float> (i->second) /coeff_mul +0.5) );
    }
    fichier = fopen("config.XY", "w+");
    if (fichier != 0) {
         fwrite(buf, sizeof(int), 4*a+1, fichier);
         fclose(fichier);
    }
    else 
    {
         std::cerr << "erreur d'ouverture du fichier" ;
         std::exit(-1);
    }
    delete [] buf;
    }
    
    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
    void chargePDC (std::vector< std::pair <int, int> >& depart, std::vector< std::pair <int, int> >& arrivee, float coeff_mul) {
    FILE* fichier = 0;
    int *buf = newint [4*NBPOINTS+1];
    // on détruit les tableaux de points
    depart.clear();
    arrivee.clear();
    fichier = fopen("config.XY", "r");
    if (fichier != 0) {
         fread(buf,sizeof(int),4*NBPOINTS+1, fichier);
         fclose(fichier);
    }
    else 
    {
         std::cerr << "erreur d'ouverture du fichier" ;
         std::exit(-1);
    } 
    int nbelem =buf[0]; // le nombre de points présents dans le fichier
    for (int i=0; i<nbelem; i++){ 
         depart.push_back( std::make_pair ( static_cast<int> (floor (static_cast<float> (buf[i+1]) * coeff_mul + 0.5) ), static_cast<int> (floor (static_cast<float> (buf[i+1 + nbelem]) * coeff_mul + 0.5) ) ) );
         arrivee.push_back( std::make_pair(static_cast<int> (floor (static_cast<float> (buf[i+1 + 2*nbelem]) * coeff_mul + 0.5) ), static_cast<int> (floor (static_cast<float> (buf[i+1 + 3*nbelem]) * coeff_mul + 0.5) ) ) );
    }
    delete[] buf;
    }
    
    main.cpp
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    
    std::vector < std::pair <int, int> > depart, arrivee;
    
    /* Charge les points de controles*/
    if (main_disp.key == cimg_library::cimg::keyC) {
         chargePDC(depart,arrivee, coeff_mul);
         main_disp.key = 0;
    }
    /*Sauve les Points de Controle */
    if (main_disp.key == cimg_library::cimg::keyS) {
         sauvePDC (depart,arrivee, coeff_mul);
         main_disp.key = 0;
    }
    
    Ce code effectue t-il bien ce que je veux?
    Est-ce que l'écriture dans un fichier peut parfois échouer?
    Toutes vos remarques seront utiles !
    Merci à vous.

  2. #2
    Rédacteur

    Avatar de Matthieu Brucher
    Profil pro
    Développeur HPC
    Inscrit en
    Juillet 2005
    Messages
    9 810
    Détails du profil
    Informations personnelles :
    Âge : 43
    Localisation : France, Pyrénées Atlantiques (Aquitaine)

    Informations professionnelles :
    Activité : Développeur HPC
    Secteur : Industrie

    Informations forums :
    Inscription : Juillet 2005
    Messages : 9 810
    Par défaut
    Pourquoi il y a du fopen, sachant que tu ne voulais pas des pointeurs ??

  3. #3
    Membre Expert
    Avatar de poukill
    Profil pro
    Inscrit en
    Février 2006
    Messages
    2 155
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : France

    Informations forums :
    Inscription : Février 2006
    Messages : 2 155
    Par défaut
    C'est vrai, mais je voulais enlever les pointeurs là où ils pouvaient poser problèmes. Sauf contre-indication, il ne devrait pas y avoir d'erreur sur cette partie?
    Dois-je me servir des fstream comme dans la FAQ ?

  4. #4
    Membre Expert
    Avatar de hiko-seijuro
    Profil pro
    Inscrit en
    Mai 2004
    Messages
    2 011
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : France

    Informations forums :
    Inscription : Mai 2004
    Messages : 2 011
    Par défaut
    fopen est utilisé en c mais est ce qu'il est recommandé en C++ ? je crois pas (ptet grosse annerie lol)

    vaut mieux utiliser les streams oui je penses

  5. #5
    Membre Expert
    Avatar de poukill
    Profil pro
    Inscrit en
    Février 2006
    Messages
    2 155
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : France

    Informations forums :
    Inscription : Février 2006
    Messages : 2 155
    Par défaut
    Hé bien! Je viens de terminer mes tests après recodage, et c'est nickel...
    Je sais vraiment pas ce qui posait problème dans le code ci-dessus !
    Mais en tous cas, ça fonctionne!
    Avec en plus les avantages du C++ en terme de souplesse: pas besoin de connaitre le nombre de points, etc....

    Peut-être que le C++ n'aime pas le C ! (et encore moins les fopen ! )

    Merci à tous

  6. #6
    Rédacteur

    Avatar de Matthieu Brucher
    Profil pro
    Développeur HPC
    Inscrit en
    Juillet 2005
    Messages
    9 810
    Détails du profil
    Informations personnelles :
    Âge : 43
    Localisation : France, Pyrénées Atlantiques (Aquitaine)

    Informations professionnelles :
    Activité : Développeur HPC
    Secteur : Industrie

    Informations forums :
    Inscription : Juillet 2005
    Messages : 9 810
    Par défaut
    Félicitations

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

Discussions similaires

  1. [VB.Net] Comment sauvegarder dans un fichier XML ?
    Par totoranky dans le forum VB.NET
    Réponses: 3
    Dernier message: 16/03/2007, 11h32
  2. [VBA E] sauvegarde dans un fichier sur reseau
    Par zoumzoum59 dans le forum Macros et VBA Excel
    Réponses: 5
    Dernier message: 12/08/2006, 10h05
  3. Sauvegarder dans un fichier en C
    Par Gryzzly dans le forum C
    Réponses: 10
    Dernier message: 14/12/2005, 16h07
  4. Réponses: 2
    Dernier message: 16/06/2005, 14h48
  5. [JList] Lecture des données sauvegardées dans un fichier
    Par Myogtha dans le forum Composants
    Réponses: 7
    Dernier message: 10/06/2004, 21h05

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