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++

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 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 : 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
    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 confirm� 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
    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 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
    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.

  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
    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�???

  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
    boost::array n'est indiqu� que si tu as un tableau de taille fixe, autrement, c'est � �viter.

  7. #7
    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
    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 : 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
    Oui, c'est tout � fait correct si c'est juste 2 coordonn�es dans un tableau. Et donc pour le tableau, utilise un vector

+ 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