lecture écriture dans un fichier
Bonjour à tous,
Je programme sous VC++.net, et je fais un petit programme qui sauve des points d'une image, et qui permet aussi de les recharger lors d'une future session (pratique si on veut pas tout se retaper ;) ).
J'ai donc deux fonctions (inspirées du C, je suis de la vieille école):
*pour sauver les points
Code:
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 sauvePDC (int **depart,int **arrivee, int a, float coeff_mul) {
int *buf;
FILE *fichier = NULL;
buf = (int*) calloc (4*a+1,sizeof (int));
buf[0] = a;
for (int i=0 ; i<a ; i++) {
buf[i+1] = int (floor (float(depart[i][0])/coeff_mul) + 0.5);
buf[i+a+1] = int (floor (float(depart[i][1])/coeff_mul) + 0.5);
buf[i+2*a+1] = int (floor (float(arrivee[i][0])/coeff_mul) + 0.5);
buf[i+3*a+1] = int (floor (float(arrivee[i][1])/coeff_mul) + 0.5);
}
fichier = fopen("config.XY", "w+");
if (fichier != NULL) {
fwrite(buf, sizeof(int), 4*a+1, fichier);
fclose(fichier);
}
else
{
std::cerr << "erreur d'ouverture du fichier" ;
std::exit(-1);
}
free(buf);
}
|
*pour charger les points:
Code:
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 (int** depart, int** arrivee, int *a, float coeff_mul) {
FILE* fichier = NULL;
int *buf;
buf = (int*) calloc (4*NBPOINTS+1,sizeof (int));
fichier = fopen("config.XY", "r");
if (fichier != NULL) {
fread(buf,sizeof(int),4*NBPOINTS+1, fichier);
fclose(fichier);
}
else
{
std::cerr << "erreur d'ouverture du fichier" ;
std::exit(-1);
}
*a =buf[0];
for (int i=0; i<(*a); i++){
depart[i][0] = int(floor( float( buf[i+1]) * coeff_mul) + 0.5);
depart[i][1] = int(floor( float(buf[i+(*a)+1]) * coeff_mul) + 0.5);
arrivee[i][0] = int(floor( float(buf[i+2*(*a)+1]) * coeff_mul) + 0.5);
arrivee[i][1] = int(floor( float(buf[i+3*(*a)+1]) * coeff_mul) + 0.5);
}
free(buf);
}
|
*L'appel se fait via la fonction main.cpp, dont voici les bouts de code qui vous intéressent:
Code:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21
|
#define NBPOINTS 50
/* Allocation dynamique de mémoire pour les points de contrôles */
depart = (int**) calloc (NBPOINTS,sizeof(int*));
for (int i= 0;i<NBPOINTS;i++) {
depart[i] = (int*) calloc(2, sizeof(int));
}
arrivee = (int**) calloc (NBPOINTS,sizeof(int*));
for (int i= 0;i<NBPOINTS;i++) {
arrivee[i] = (int*) calloc(2, sizeof(int));
}
/*Sauve les Points de Controle */
if (main_disp.key == cimg_library::cimg::keyS) {
sauvePDC (depart,arrivee, a, coeff_mul);
}
/* Charge les points de controles*/
if (main_disp.key == cimg_library::cimg::keyC) {
chargePDC(depart,arrivee, &a, coeff_mul);
} |
Lors de mes tests, j'avais trouvé que mon système de sauvegarde dans ce config.XY fonctionnait correctement. Seulement, lorsque s'autres l'ont testé, ils m'ont rapporté des erreurs bizarres: les points parfois se retrouvait tous collés en haut de l'image. En effet, le fichier config.XY contenait alors beaucoup de 0...;)
Je n'ai pas réussi à identifier le problème, mais je ne programme surement pas depuis assez longtemps pour arriver à tout comprendre...
Merci d'avance pour votre aide.
P.S : j'ai bien lu la FAQ concernant la lecture/écriture de fichier, mais avant de tout recoder, je voulais d'abord vous "consulter". Comme je gère des images comme des matrices, et que j'ai pas voulu me lancer dans des vecteurs de vecteurs, je sais pas si c'est un bonne idée de jouer avec les "fstream"....