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; }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
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; }
Ce code effectue t-il bien ce que je veux?
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; }
Est-ce que l'écriture dans un fichier peut parfois échouer?
Toutes vos remarques seront utiles !![]()
Merci à vous.
Partager