2010-07-19 26 views
2

J'essaye d'écrire un simple économiseur de fichier image TGA comme un exercice d'apprentissage en C++. Je base mon code sur un exemple de chargeur TGA qui déclare une structure pour l'en-tête, puis utilise fread() pour charger tout l'en-tête en une fois.Lors de l'écriture de struct dans un fichier, trop d'octets sont écrits

Mon programme ne fonctionne pas pour le moment, et il semble qu'il y ait deux octets supplémentaires écrits dans le fichier. J'ai imprimé la taille de ma structure et c'est deux octets trop grands (20 au lieu du 18 correct). Après un peu de lecture, je pense que le problème est lié à l'alignement et au remplissage des données (je ne suis pas très familier avec la façon dont les structures sont stockées).

Ma question est quelle est une bonne solution pour cela? Je suppose que je pourrais écrire les composants de la structure octet par octet, au lieu d'utiliser fwrite() pour écrire toute la structure en même temps, ce que je vais faire maintenant. J'ai supposé que si cela fonctionnait lors du chargement de l'en-tête, cela fonctionnerait également lors de l'écriture. Ma supposition était-elle incorrecte?

Répondre

4

Les compilateurs sont autorisés à insérer des octets de remplissage dans des structures, ce qui permet d'aligner les champs sur les adresses de mémoire appropriées.

La solution la plus simple consiste à demander au compilateur d '«emballer» la structure, ce qui signifie de ne pas insérer d'octets de remplissage. Cependant, cela rendra l'accès aux données à la structure plus lent, et les moyens de le faire dépendent du compilateur. Si vous voulez être portable et efficace, la seule façon de procéder est d'écrire les champs individuellement.

1

Il ne fonctionnait pas même lors du chargement. Vous avez deux options:

  1. Utiliser des directives spécifiques du compilateur (#pragma emballé, etc.) pour forcer votre structure de 18 octets.

  2. Ecrivez le code plus portable en utilisant des offsets et des pointeurs pour obtenir/définir les champs de tampon.

0

Les éléments d'une structure sont généralement disposés sur des limites de 4 octets.

Si vous avez des shorts ou des caractères dans votre structure, la structure est plus grande que la somme des tailles individuelles des éléments.