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 Ph Husson (site web personnel) . Évalué à 1.
# fopen(file,"wb");
Posté par Anonyme . Évalué à 6.
# fopen()
Posté par Antoine Büsch . Évalué à 4.
ex: fopen("mon fichier", "rw+b");
[^] # Re: fopen()
Posté par doublehp (site web personnel) . Évalué à 0.
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 Damien Caliste (site web personnel) . Évalué à 1.
[^] # Re: fopen()
Posté par Florent C. . Évalué à 2.
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 doublehp (site web personnel) . Évalué à 0.
[^] # Re: fopen()
Posté par Florent C. . Évalué à 2.
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 TazForEver . Évalué à 1.
Suivre le flux des commentaires
Note : les commentaires appartiennent à celles et ceux qui les ont postés. Nous n’en sommes pas responsables.