Forum Programmation.c libc et retour chariot

Posté par  (site web personnel) .
Étiquettes : aucune
0
14
mar.
2005
Voici mon problème : je souhaite écrire du binaire dans un fichier, octet par octet, j'utilise donc fputc de la lib c (ou fwrite quand j'en ai plusieurs d'un coup sous la main). Sous UNIX, aucun problème, tout passe. Par contre en essayant de porter mon programme sous Windows, fputc et ses petits camarades (fwrite ou fprintf) remplace systématiquement 0x0a par le couple 0x0d-0x0a et mon binaire devient illisible par des programme tiers qui s'attendent à trouver 0x0a seulement.

Je pensais naïvement que fputc ou fwrite ne formataient pas leur sortie (au contraire de fprintf), mais à priori ils l'analysent et je ne vois pas comment faire pour écrire mon binaire tranquillement, si quelqu'un a une idée, je le remercie d'avance.

Voici ma « distribution » sous windows : CYGWIN_NT-5.1 1.5.12 et d'autre chiffres entre parenthèses.
  • # Et write?

    Posté par  (site web personnel) . Évalué à 1.

    Est-ce que ca fait pareil avec write? (Ca peut gener d'avoir un "int" à la place d'un FILE* mais bon tu peux toujours tester)
  • # fopen(file,"wb");

    Posté par  . Évalué à 6.

    Meme si sous unix le b n'a pas de consequence, sous certains OS, indiquer que l'on ouvre un fichier en mode binaire prend tout son sens.
  • # fopen()

    Posté par  . Évalué à 4.

    Mes souvenirs de C sont vieux, mais en utilisant le flag "b" lors de l'appel a fopen(), ca devrait ouvrir le fichier en mode binaire.

    ex: fopen("mon fichier", "rw+b");
    • [^] # Re: fopen()

      Posté par  (site web personnel) . Évalué à 0.

      ca c est le premier point ... le second est encore plus malicieux:

      un charactere sous MS-DOS ne fait que 7 bits (selon la norme ANSI-C ), alors que sous Linux (ANSI-C99, comme tous les systems 5 modernes) c est 8 bits. Si tu veux un code portable, il ne faut donc pas declarer des char mais des unsigned char qui eux font bien 8 bits.
      • [^] # Re: fopen()

        Posté par  (site web personnel) . Évalué à 1.

        Ok, merci beaucoup à vous, j'avais complètement oublié le flag 'b' quand on ouvre un fichier. Donc ça marche (d'autant mieux que j'écrivais déjà des unsigned char et non des char).
      • [^] # Re: fopen()

        Posté par  . Évalué à 2.

        N'importe quoi, mais alors n'importe quoi de n'importe quoi !

        Un unsigned char fait un byte, tout comme un char.

        C'est dans la norme du C.

        Maintenant, pour la taille du byte, c'est vrai que ça dépend de l'architecture, ça peut être 7, 8, 9, 16 bits, voire n'importe quoi d'autre.

        Rappelons que byte en anglais veut dire "multiplet", qu'un octet est un multiplet de 8 bits, et que octet en anglais se dit "octet" ...

        Et avant de dire des énormités pareilles, on révise la norme du C, merci.
        • [^] # Re: fopen()

          Posté par  (site web personnel) . Évalué à 0.

          je n ai jamais achete de bible du C, mais mon prof de ANSI-C m as toujours rabache qu un char sous DOS fesait 7 bits ... et que seul l unsigned char fesait 8 bits.
          • [^] # Re: fopen()

            Posté par  . Évalué à 2.

            Alors c'est ton prof qui devrait réviser :

            http://www.isty-info.uvsq.fr/~rumeau/fclc/fclc008.html#q_5(...)

            En C, sizeof(un_type) == sizeof(unsigned un_type) quel que soit le type utilisé.

            En effet, unsigned ne fait que dire qu'on utilise des valeurs non signées, allant de 0 à [valeur maximale possible sur ce nombre de bytes]. Tandis qu'en signed (par défaut, donc), on a un type signé, le type est obtenu grâce au complément à deux...

            Soit ton prof ne connaît pas ce qu'il enseigne, soit c'est toi qui a mal compris.

            Il t'a probablement dit que sous MS-DOS, un caractère n'était représentable que par la norme ASCII non étendue, qui encode les caractères sur 7 bits. Il reste donc un bit inutilisé pour contenir des caractères imprimables. La norme ASCII étendue va quant à elle jusqu'au 8e bit. Toujours est-il que les char sont sur un byte, quelle que soit la taille du byte sur cette architecture. C'est la définition du char qui veut cela, et c'est la base du langage C.
  • # normal

    Posté par  . Évalué à 1.

    fputc, c'est la famille des IO formatées. Utilise fwrite/fread, pas de problème. Ouvre en mode "b" (qui fait la différence sous Windows)

Suivre le flux des commentaires

Note : les commentaires appartiennent à celles et ceux qui les ont postés. Nous n’en sommes pas responsables.