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 :

lecture écriture dans un fichier


Sujet :

C++

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

    Informations forums :
    Inscription : Février 2006
    Messages : 2 155
    Points : 2 107
    Points
    2 107
    Par défaut 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 : 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 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 : 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 (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 : 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
     
    #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"....

  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 : 42
    Localisation : France, Pyrénées Atlantiques (Aquitaine)

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

    Informations forums :
    Inscription : Juillet 2005
    Messages : 9 810
    Points : 20 970
    Points
    20 970
    Par défaut
    A mon avis, il faudrait d'abord que tu utilises des vrais outils du C++, pas de calloc, des new, par de int** mais des passages de vecteurs par références, constantes si besoin, utilisation de cast corrects et pas de int(float()), ...

  3. #3
    Membre habitué Avatar de b Oo
    Profil pro
    Inscrit en
    Mai 2004
    Messages
    179
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2004
    Messages : 179
    Points : 185
    Points
    185
    Par défaut
    Salut,
    je voudrais savoir pourquoi tu fais un malloc et un free dans tes deux fonctions, alors que tu peux très bien prendre un tableau de int.
    Et en effet, si tu es en C++, fais des new et des delete, plus facile à utiliser en plus .
    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
    void sauvePDC (int **depart,int **arrivee, int a, float coeff_mul) {
    FILE *fichier = 0;
    int buf[4*a+1];
    buf[0] = a;
    for (int i=0 ; i<a ; i++) {
           buf[i+1] = static_cast<int> (floor(static_cast<float> ((depart[i][0])/coeff_mul) + 0.5);
           buf[i+a+1] = static_cast<int> (floor (static_cast<float> (depart[i][1])/coeff_mul) + 0.5);
           buf[i+2*a+1] = static_cast<int> (floor (static_cast<float> (arrivee[i][0])/coeff_mul) + 0.5);
           buf[i+3*a+1] = static_cast<int> (floor (static_cast<float> (arrivee[i][1])/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);
    }
    }
    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
    void chargePDC (int** depart, int** arrivee, int *a, float coeff_mul) {
    FILE* fichier = 0;
    int buf[4*NBPOINTS+1];
    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);
    } 
    *a =buf[0];
    for (int i=0; i<(*a); i++){
           depart[i][0] = static_cast<int> (floor(static_cast<float> ( buf[i+1]) * coeff_mul) + 0.5);
           depart[i][1] = static_cast<int> (floor(static_cast<float> (buf[i+(*a)+1]) * coeff_mul) + 0.5);
           arrivee[i][0] = static_cast<int> (floor(static_cast<float> (buf[i+2*(*a)+1]) * coeff_mul) + 0.5);
           arrivee[i][1] = static_cast<int> (floor(static_cast<float> (buf[i+3*(*a)+1]) * coeff_mul) + 0.5);
    }
    }
    

    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
    #define NBPOINTS 50
    /* Allocation dynamique de mémoire pour les points de contrôles */
    int **depart = new int [NBPOINTS];
    for (int i= 0;i<NBPOINTS;i++) {
           depart[i] = new int [2];
    }
    int **arrivee = new int [NBPOINTS];
    for (int i= 0;i<NBPOINTS;i++) {
           arrivee[i] = new int [2];
    }
     
    /*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);
    }
    for (int i = 0; i < NBPOINTS; ++i)
      delete [] depart[i];
    delete [] depart;
    b Oo

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

    Informations forums :
    Inscription : Février 2006
    Messages : 2 155
    Points : 2 107
    Points
    2 107
    Par défaut
    Citation Envoyé par Miles
    A mon avis, il faudrait d'abord que tu utilises des vrais outils du C++, pas de calloc, des new, par de int** mais des passages de vecteurs par références, constantes si besoin, utilisation de cast corrects et pas de int(float()), ...
    Tout à fait d'accord avec toi. Mais des int** représentait un moyen simple de décrire un tableau. Sans doute devrais-je utiliser des vector< pair < , > > puisqu'il stocke des coordonnées planes. OU bien alors boost::array est-il mieux indiqué???

  5. #5
    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 : 42
    Localisation : France, Pyrénées Atlantiques (Aquitaine)

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

    Informations forums :
    Inscription : Juillet 2005
    Messages : 9 810
    Points : 20 970
    Points
    20 970
    Par défaut
    boost::array n'est indiqué que si tu as un tableau de taille fixe, autrement, c'est à éviter.

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

    Informations forums :
    Inscription : Février 2006
    Messages : 2 155
    Points : 2 107
    Points
    2 107
    Par défaut
    Citation Envoyé par b Oo
    Salut,
    je voudrais savoir pourquoi tu fais un malloc et un free dans tes deux fonctions, alors que tu peux très bien prendre un tableau de int.
    Et en effet, si tu es en C++, fais des new et des delete, plus facile à utiliser en plus .
    b Oo
    C'est vrai... J'ai pas encore le reflexe C++ à fond. Je me contente souvent (à tort) de n'utiliser que la STL pour sa bonne gestion des listes et vecteurs, mais je m'arrete là.

    Merci b Oo.

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

    Informations forums :
    Inscription : Février 2006
    Messages : 2 155
    Points : 2 107
    Points
    2 107
    Par défaut
    Citation Envoyé par Miles
    boost::array n'est indiqué que si tu as un tableau de taille fixe, autrement, c'est à éviter.
    OK, alors comment faire autrement pour stocker une matrice plus intelligemment? la solution avec le pair est-elle correcte?

  8. #8
    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 : 42
    Localisation : France, Pyrénées Atlantiques (Aquitaine)

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

    Informations forums :
    Inscription : Juillet 2005
    Messages : 9 810
    Points : 20 970
    Points
    20 970
    Par défaut
    Oui, c'est tout à fait correct si c'est juste 2 coordonnées dans un tableau. Et donc pour le tableau, utilise un vector

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

    Informations forums :
    Inscription : Février 2006
    Messages : 2 155
    Points : 2 107
    Points
    2 107
    Par défaut
    Citation Envoyé par Miles
    Oui, c'est tout à fait correct si c'est juste 2 coordonnées dans un tableau. Et donc pour le tableau, utilise un vector
    C'est parti...

    Merci Miles!

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

    Informations forums :
    Inscription : Février 2006
    Messages : 2 155
    Points : 2 107
    Points
    2 107
    Par défaut
    Juste une petite question:
    Est-ce possible que l'écriture dans un fichier échoue "partiellement"? C'est à dire qu'on copie une partie, mais pas un autre?
    Je demande ça au cas où ce ne soit pas cette petite partie du programme qui plante!
    M'enfin, avec tout ce que vous m'avez corrigé, y'a des chances que ça aille mieux!

    @Miles : Pour le passage par référence dont tu parlais, est-ce qu'il vaut mieux que je continue avec un vector < pair <int, int> > tab, ou bien est-ce que créer une classe TabCoordonnees serait la bienvenue?

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

Discussions similaires

  1. [PERL]Prob lecture/écriture dans un fichier ".TXT"
    Par Magcom dans le forum Langage
    Réponses: 8
    Dernier message: 29/07/2010, 10h36
  2. lecture/écriture dans un fichier texte
    Par the watcher dans le forum Delphi
    Réponses: 23
    Dernier message: 15/05/2007, 10h57
  3. lecture/écriture dans un fichier
    Par benkunz dans le forum Langage
    Réponses: 3
    Dernier message: 10/04/2007, 11h35
  4. Réponses: 47
    Dernier message: 28/01/2007, 19h39
  5. [PERL] Problème lecture/écriture dans un fichier
    Par LE NEINDRE dans le forum Langage
    Réponses: 4
    Dernier message: 17/08/2005, 13h15

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