Lecture de fichier binaire structuré

Signaler
Messages postés
4
Date d'inscription
samedi 7 juin 2003
Statut
Membre
Dernière intervention
8 mars 2005
-
cs_nico20000
Messages postés
4
Date d'inscription
samedi 7 juin 2003
Statut
Membre
Dernière intervention
8 mars 2005
-
Bonjour,

j'ai besoin de lire dans un fichier binaire dont l'entête
ressemble à ceci: (traduite en hexa)
Properties gc90063 num FTPLocal le 17/11/2003
Je dois récupérer la chaine gc90063 et la date.

Ensuite le fichier est organisé de la façon suivante:
0A 00 00 00 00 0B 00 01 02 03
----- -- -- -- ----- -- -- --
Heure E1 E2 E3 Heure E1 E2 E3

On a l'heure en minute sur les 2 premiers octets, suivi de
3 entiers entre 0 et 255 sur les 3 octets suivants.

J'ai créé une structure :

struct RECORDS
{
short heure_en_min;
char cpt1;
char cpt2;
char cpt3;
};

Comment puis-je lire le fichier binaire pour récupérer le
header puis les différents enregistrements ?

6 réponses

Messages postés
2837
Date d'inscription
lundi 11 août 2003
Statut
Modérateur
Dernière intervention
16 décembre 2006
10
:big) Neodante :big)

Juste pour t'aider un peu on ouvre un fichier en binaire avec l'attribut "rb" (lecture) ex:
fopen("toto.dat", "rb");
Ensuite un petit malloc et un fread() avec un size(struct RECORDS) pour la taille (la quantité est à 1!) et la fonction te placera tes données directement dans ta jolie structure que tu n'auras plus qu'à lire !
Exemple d'un bout de code pour lire des fichiers (de Tomb Raider) :

// Allocating memory for textiles (num_textiles * 256 * 256)
m_file_header->textile8 = new tr2_textile8[m_file_header->num_textiles];
// Load textiles
for (register ubit32 i = 0; i < m_file_header->num_textiles; ++i)
fread(&m_file_header->textile8[i], sizeof(tr2_textile8), 1, m_fp);

J'espère que t'as compris le principe ! :big)

@+
Messages postés
2837
Date d'inscription
lundi 11 août 2003
Statut
Modérateur
Dernière intervention
16 décembre 2006
10
:big) Neodante :big)

A oui juste au passage si tu n'avais pas remarqué : tr2_texttile8 est une structure tout comme RECORS !
@+
Messages postés
4
Date d'inscription
samedi 7 juin 2003
Statut
Membre
Dernière intervention
8 mars 2005

Merci.

Quand j'écris dans le fichier, il y a 6 octets au lieu de 5 ?!?

L'execution du prg ci dessous donne :
21116Number of items read = 25
Contents of buffer =

la taille du struct fait 6 octets !
Pourquoi pas 5 octest ?

struct RECORDS // Declare PERSON struct type
{
unsigned short heure_en_min;
char entrees;
char sorties;
char indetermines;
};

int main( void )
{
FILE *stream;
short i, numread, numwritten;
RECORDS enreg[50] = { 0,char('0'),char('0'),char('0')};

if( (stream = fopen( "fread.out", "w+b" )) != NULL )
{
for ( i = 0; i < 50; i++ )
{
enreg[i].heure_en_min = (unsigned short)(100 + i);
enreg[i].entrees = (char)(1);
enreg[i].sorties = (char)(2);
enreg[i].indetermines = (char)(3);
}

/* Write 25 characters to stream */
numwritten = fwrite( enreg,sizeof(enreg) , 50, stream );
//printf( "Wrote %d items\n", numwritten );
printf ("%d",sizeof(enreg[1].heure_en_min));
printf ("%d",sizeof(enreg[1].entrees));
printf ("%d",sizeof(enreg[1].sorties));
printf ("%d",sizeof(enreg[1].indetermines));
printf ("%d",sizeof(enreg[1]));
fclose( stream );
}
else
printf("Problem opening the file\n");
if( (stream = fopen( "fread.out", "r+b" )) != NULL )
{
/* Attempt to read in 25 characters */
numread = fread( enreg, sizeof(RECORDS), 25, stream );
printf( "Number of items read = %d\n", numread );
printf( "Contents of buffer = %.25n\n", enreg );
fclose( stream );
}
else
printf( "File could not be opened\n" );
}
Messages postés
2837
Date d'inscription
lundi 11 août 2003
Statut
Modérateur
Dernière intervention
16 décembre 2006
10
:big) Neodante :big)

Fais des sizeof (char), sizeof(struct RECORDS) et non pas sizeof(variable) ... tout devrait rentrer dans l'ordre.
Normalement ton code marche ... du moins pour moi :approve) !
@+
Messages postés
1905
Date d'inscription
mercredi 22 janvier 2003
Statut
Membre
Dernière intervention
17 septembre 2012
2
Salut,
Pour la struct qui fait 6 octet au lieu de 5 c'est normal, c'est a cause de l'alignement des données.
En fait, le cpu ne manipule que des word (16bits) et lors de la compilation, le compilateur va rajouter un octet a ta structure pour qu'elle fasse 6 octets, soit 3*2 word, pour respecter ces regles d'alignements.
Messages postés
4
Date d'inscription
samedi 7 juin 2003
Statut
Membre
Dernière intervention
8 mars 2005

merci beaucoup !

je me suis servi de la fonction fseek pour me repositionner au bon offset à chaque lecture.

En tout cas merci à tous !!!!