Forum Clubic

C probleme d'ecriture de fichier en binaire - bug dans l'ecriture d'un fichier binaire

Bonjour.
Alors voila, j’ai un gros probleme en C et j’espere que vous allez pouvoir m’aider parce que je trouve aps la solution. Il s’agit d’ecrire un fichier en binaire sur disque (un fichier pgm format raw). Le code ci dessous ne fonctionne pas sous Windows, mais très bien sous Unix/Linux. Je comprends vraiment pas !


  /* ouverture fichier */
  if ((f = fopen(nom, "wb")) == NULL) // (j'ai essayé wc, wb+, rien n'y fait !)
    {
    fprintf(stderr, "Impossible d'ouvrir le fichier '%s'.\n", nom);
    return(FALSE);
    }
    .
    .
    ....
  /* ecriture des donnees */
  for(j=image->hauteur-1; j>=0; j--)
    for(i=0; i<image->largeur; i++)
      {
      if (image->mode == IMAGE_COULEUR)
        fprintf(f, "%c%c%c", image->buffer[(i+j*image->largeur)*4],
                 image->buffer[(i+j*image->largeur)*4+1],
               image->buffer[(i+j*image->largeur)*4+2]);
      else
        fprintf(f, "%c", image->buffer[(i+j*image->largeur)]);
      }

image->buffer[] est de type unsigned char.
Sous xp j’obtiens un morceau d’image décalé :??: , rien à faire !
Si vous pouvez m’aider, merci beacoup, j’aimerais bien bosser ailleurs qu’a la fac, en plus ecrire une image c’ets pas le but du TP, qui est plutot de faire de la detection de contours :slight_smile:

Regardes plutôt du côté de fwrite() au lieu de fprintf(), je soupçonne que ça vient de là.

marche po :frowning: Franchement je sais pas d’ou ca vient mai ca me casse les c… ce windows qui sait pas ecrire des caracteres dans l’ordre en en entier !

J’ai un truc en C qui fait du PGM, je sais pas s’il tourne sous Windows, mais dés que tu as mis le “b” normalement c’est bon.

Rappelle moi le format du pgm binaire?

(j’ai touché à du pgm ascii, mais pas du binaire)

Si ta machine Linux n’est pas un processeur x86 tu as surement un probléme de little indian / big indian.

et si tu fais directement fwrite(image->buffer, image->largeur*sizeof(unsigned char)*nombre_couleur, image->hauteur, f); ?

Bonne idée d’acidbao: le fprintf doit être pour le flux ASCII, et vu que tu écrit du binaire, ce serait plutôt fWrite: et l’encodage des carac différent entre linux et windows expliquerait le truc du décalage (au hasard: les retours chariots sur 2 caracs: 0x0D 0x0A). (le C est si loin pour moi…)

Je suis pas convaincu il a dit plus haut qu’il avait essayé avec fwrite, mais ce serait plus clair d’envoyer tout le buffer d’un coup (ou ligne par ligne si tu les parcours à l’envers) plutot que le parcourir pour écrire octet par octets. En plus fwrite est bufferisée en interne donc t’a pas à te soucier de la taille du buffer que tu passes.

Par contre je pense pas que ce soit un problème d’endianness, vu que c’est des octets qu’on manipule et pas des mots de 16/32/64bits.

Si ya décalage, faudrait peut être avoir le code complet pour voir comment tu écris l’en-tête.