Partage
  • Partager sur Facebook
  • Partager sur Twitter

Lecture des fichiers en mode binaire

Fonction fread()

Sujet résolu
    18 avril 2006 à 1:47:28

    Bonjour,

    Je fait un programme avec la lib SDL et j'inscris dans un fichier la résolution de l'écran. Sur la première ligne, j'inscris la largeur et sur la deuxième, j'inscris la hauteur. Dans le cours de M@theo, il est dit qu'il faut ouvrir le fichier en mode binaire pour les nombres. J'ai recherché sur le net et j'ai trouvé la fonction fread. J'ouvre donc mon fichier en mode binaire mais je ne comprend pas comment utiliser fread même après avoir consulter cette desciption de la fonction.

    Voici donc la partie de code pour que vous puissiez m'aider :

        FILE *resolution = NULL; // Pointeur sur le fichier

        /* Variables stockant la résolution */
        int largeur = 800;
        int hauteur = 600;

        /* Ouverture du fichier en mode lecture seule binaire */
        resolution = fopen("options\\resolution.txt", "rb");
        if (resolution == NULL) // Si l'ouverture n'a pas réussie
        {

            /* On écrit que l'ouverture n'a pas réussie dans le fichier "stderr" */
            fprintf(stderr, "Impossible d'ouvrir le fichier \"resolution.txt\".");

            /* On met la résolution pas défaut (800 * 600) */
            largeur = 800;
            hauteur = 600;

        }
        else // Si elle a réussie
        {

            // Il manque la fonction fread ici

            fclose(resolution); // On ferme le fichier

        }


    Je vous remercie d'avance pour vos réponses.
    • Partager sur Facebook
    • Partager sur Twitter
      18 avril 2006 à 2:59:20

      Hello...

      Hum...là je vois que tu as nommé ton fichier resolution.txt, donc je présume que tu t'attends à voir ça si tu l'ouvres avec le notepad:

      Citation : resolution.txt

      800
      600


      Qu'on peut voir comme:

      Citation : resolution.txt

      800\n
      600\n
      eof


      Dans ce cas là, ce serait peut-être plus simple d'aller le lire "classiquement" comme un fichier texte, avec fgets, puis de convertir la chaine lue en int avec atoi ou strtol (voir)

      Je ne suis pas un expert en fichiers binaires, mais ce que j'en comprends c'est que c'est bien pour lire des blocs de données, il n'y a pas de notions de lignes mais plutôt de paquets de données, sous forme de chiffres, donc 800 par 600 serait possiblement représenté par:

      Citation : Hypothèse

      /8/0/0/6/0/0


      Ce qui, ouvert avec le notepad, donnerait des caractères bizarres.

      La partie "sauvegarde" et "lecture" du niveau de Sokoban du cours de M@teo pourrait, je pense, être traitée de cette façon, je vais m'y essayer dans ces prochains jours, pour voir ce que ça donne...

      En attendant, c'est l'heure de Monk, alors...Byebye :)
      • Partager sur Facebook
      • Partager sur Twitter
        18 avril 2006 à 3:34:19

        Merci. Je vais essayer ça lorsque j'en aurais le temps puis je dirai si sa marche ou pas. Les autres vous pouvez toujours donner votre avis.
        • Partager sur Facebook
        • Partager sur Twitter
          18 avril 2006 à 7:26:39

          Sinon t'as qu'à utiliser fscanf().
          fscanf(resolution, "%d\n%d", &largeur, &hauteur );
          • Partager sur Facebook
          • Partager sur Twitter
            18 avril 2006 à 9:09:25

            Citation : Félix

            Je fait un programme avec la lib SDL et j'inscris dans un fichier la résolution de l'écran. Sur la première ligne, j'inscris la largeur et sur la deuxième, j'inscris la hauteur. Dans le cours de M@theo, il est dit qu'il faut ouvrir le fichier en mode binaire pour les nombres.


            Ca me parait curieux. T'es sûr ? Les cas où on utilise le mode binaire sont plutôt rares et nécessitent des précautions draconiennes dus au problèmes de portabilité. A déconseiller aux débutants.

            En tout cas, pour ce que tu veux faire, il n'y a pas du tout besoin de fichier binaire. Un simple fichier texte suffit.

            Facile à spécifier :

            <data>
            <data>

            ou

            <data> <data>

            facile à créer : fprintf()
            facile à relire : fgets() + sscanf() ou strtol()...


            Citation : gpa_etsmtl


            Je ne suis pas un expert en fichiers binaires, mais ce que j'en comprends c'est que c'est bien pour lire des blocs de données, il n'y a pas de notions de lignes mais plutôt de paquets de données, sous forme de chiffres, donc 800 par 600 serait possiblement représenté par:

            Citation : Hypothèse

            /8/0/0/6/0/0



            Pas exactement. En fait, Il n'y pas de regle pré-établie. Le format binaire est dit 'transparent', c'est à dire que ce qui est dnas le fichier est exactement ce qu'on y a mis au bit près.. L'unité d'information est l'octet.

            Soit on fait un copie directe de la réprésentation mémoire et ça dépend fortement de la machine (donc ce n'est pas du tout portable)

            Soit on convient d'une repésentation portable, et on fait ce qu'il faut en lecture et en écriture pour respécter cette représentation indépendamment de la machine.

            Si on décide que le fichier binaire aura cette structure :

            +-----------------------------------------------+
            |15|14|13|12|11|10| 9| 8| 7| 6| 5| 4| 3| 2| 1| 0|
            +-----------------------------------------------+
            |                Largeur                        |
            +-----------------------------------------------+
            |                Hauteur                        |
            +-----------------------------------------------+

            Cela se traduit par une strucure en octet comme ceci :

            [0] MSB de Largeur
            [1] LSB de Largeur
            [2] MSB de Hauteur
            [3] LSB de Hauteur

            Exemple numérique : soit à encoder 800 et 600
            800 en hexa sur 16 bits donne 0x0320, donc il y aura 0x03 en [0] et 0x20 en [1]
            600 en hexa sur 16 bits donne 0x0258, donc il y aura 0x02 en [1] et 0x58 en [2]

            Le codage est relativement simple :

            unsigned int largeur = 800;
            unsigned int hauteur = 600;

            fputc((largeur >> (8 * 1)) & 0xFF, fp); /* [0] */
            fputc((largeur >> (8 * 0)) & 0xFF, fp); /* [1] */

            fputc((hauteur >> (8 * 1)) & 0xFF, fp); /* [2] */
            fputc((hauteur >> (8 * 0)) & 0xFF, fp); /* [3] */

            et le décodage est du même tonneau :

            unsigned int largeur = 0;
            unsigned int hauteur = 0;

            largeur |= (((unsigned) fgetc(fp)) << (8 * 1))  ; /* [0] */
            largeur |= (((unsigned) fgetc(fp)) << (8 * 0))  ; /* [1] */

            hauteur |= (((unsigned) fgetc(fp)) << (8 * 1))  ; /* [2] */
            hauteur |= (((unsigned) fgetc(fp)) << (8 * 0))  ; /* [3] */

            évidemment, il faut connaître les opérateurs binaires (bitwise operators). et c'est moins direct que ça, car il faut tester la fin de fichier avant d'utiliser la donnée... Mais le principe est là...
            • Partager sur Facebook
            • Partager sur Twitter
            Music only !

            Lecture des fichiers en mode binaire

            × 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