Partage
  • Partager sur Facebook
  • Partager sur Twitter

Lecture dans un fichier

Lecture erronée

    23 septembre 2007 à 19:57:10

    Bonjour ! :)
    Je suis en train de codé une fonction qui lit le nombre de lignes et le nombre de colonnes dans un fichier et qui insére ensuite le contenu du fichier dans une matrice :

    1. #include "fichier.h"
    2. void ouvrirFichier(char* nom_fichier, int& nbLignes, int& nbColonnes, char** Matrice)
    3. {
    4.    ifstream fichier ; // Objet de type ifstream
    5.    fichier.open(nom_fichier); //Ouverture en lecture seule
    6.    //Lecture de la taille du fichier
    7.    fichier >> nbColonnes;
    8.    fichier >> nbLignes;
    9.    allegro_message("%d, %d", nbLignes, nbColonnes);
    10.    //Allocation du tableau par niveau
    11.    Matrice = new char*[nbColonnes];
    12.    for(int i=0; i< nbColonnes; i++)
    13.       Matrice[i] = new char[nbLignes];
    14.    //Initialisation des valeurs du tableau
    15.    for(int i=0; i< nbColonnes; i++)
    16.       for(int j=0; j< nbLignes; j++)
    17.          Matrice[i][j] = '0';
    18.    // Lecture du tableau, caractère par caractère
    19.    for(int j=0; j<nbLignes; j++)
    20.       for(int i=0; i<nbColonnes; i++)
    21.          fichier >> Matrice[i][j] ;
    22.    fichier.close(); //Fermeture du fichier
    23. }


    Le petit fichire texte :
    1. 10
    2. 8
    3. 0000000000
    4. 0000000000
    5. 0000000000
    6. 0000000000
    7. 0000000000
    8. 0000000000
    9. 0000000000
    10. 0000000000


    Mais lorsque je demande à l'ordinateur quels nombres il à entré dans nbLignes et nbColonnes (à l'aide de allegro_message, similaire à cout, sauf dans une fenêtre), il me dit 0, 320 o_O

    Je ne comprends pas ?
    Merci de votre aide ! ^^
    • Partager sur Facebook
    • Partager sur Twitter
      23 septembre 2007 à 20:10:41

      simplifi toi la vie :lol:

      1) va à la ligne (en lisant ligne par ligne ou à chaque '\n'
      2)indiquer la colone (lire caractere par caractere )
      3)puis enregistrer ^^
      • Partager sur Facebook
      • Partager sur Twitter
        23 septembre 2007 à 20:14:55

        nan nan, j'ai envie de faire comme ça :)

        Sinon, dans ma fonction où est déclaré mes variables nbLignes et nbColonnes, je les ais toutes deux initialisées à 0, et maintenant, j'ai dans allegro message 0, 0.
        Donc, cela prouve que mon fichier >> ***** ne fais rien :(
        • Partager sur Facebook
        • Partager sur Twitter
          23 septembre 2007 à 20:31:29

          1. void ouvrirFichier(char* nom_fichier, int& nbLignes, int& nbColonnes, char** Matrice)


          j'aurais plutôt mis
          1. void ouvrirFichier(const char* nom_fichier, int nbLignes, int nbColonnes, char** Matrice)

          1. //Lecture de la taille du fichier
          2.    fichier >> nbColonnes;
          3.    fichier >> nbLignes;


          ca ne lit pas la taille du fichier (ca lit 10 et 8)

          1. allegro_message("%d, %d", nbLignes, nbColonnes);

          ca renvoie un nombre à l'ecran?
          c'est une de tes fonctions?(si oui je voudrais bien l'a voir ^^
          parce qu'un cout serait mieux en console)

          en fait, je n'arrive pas à cerner ton raisonnement...
          • Partager sur Facebook
          • Partager sur Twitter
            23 septembre 2007 à 21:01:17

            Au fait, le fil conducteur de "mon" idée (elle n'est pas de moi), c'est que le programme lit le nombre de lignes et de colonnes du fichier.
            Ensuite, j'alloque la Matrice avec ces nombres (pour que la matrice ais le même nombre de lignes et de colonnes du fichier, pour que le niveau soit entièrement retranscrit). :)

            Je code mon jeu avec allegro, une librairie de developpement de JV, alternative à SDL (je la préfere, me demander pas pourquoi :-° )

            Si je met ton prototype de fonction, je ne pourrais pas "écrire" mes valeurs dans mes variables, donc cela serais inutile, et j'ai besoin de mes variables dans toutes mes fonctions :p

            Merci quand même :)
            • Partager sur Facebook
            • Partager sur Twitter
              24 septembre 2007 à 19:37:08

              1) au lieu de me faire un char** et 2 variables j'aurai créer une classe Matrice qui contient ça

              2) fait tes validation d'ouverture et de lectures.

              3) char * beurk... utilise les merveilleux outils de la STL : string

              1. bool lire_fichier( const std::string & nomFichier, Matrice & mat )
              2. {
              3.     int nombre_tampon;
              4.     std::string chaine_tampon;
              5.     std::ifstream ifs( nomFichier.c_str() );
              6.     // si le fichier n'est pas ouvert, rien ne sert de continuer
              7.     // On aurait pu faire un throw aussi
              8.     if( !ifs.is_open() )
              9.         return false;
              10.     if( !(ifs >> nombre_tampon) )
              11.         return false;
              12.     mat.setNbLignes( nombre_tampon);
              13.     if( !(ifs >> nombre_tampon) )
              14.         return false;
              15.     mat.setNbColonnes( nombre_tampon);
              16.     //...
              17. }


              Bon dans mon exemple il y a beacoup de répétition de "return false" mais au moins il y a validation. Personnellement j'aurais créer une fonction "int lire_un_nombre( ifstream & )" qui aurait lancé une exception en cas de mauvaise lecture.

              Bonne continuation en C++!
              • Partager sur Facebook
              • Partager sur Twitter

              Lecture dans un fichier

              × Après avoir cliqué sur "Répondre" vous serez invité à vous connecter pour que votre message soit publié.
              × Attention, ce sujet est très ancien. Le déterrer n'est pas forcément approprié. Nous te conseillons de créer un nouveau sujet pour poser ta question.
              • Editeur
              • Markdown