Forum Clubic

Copier un tableau de 128bit dans une structure

Bonjour,
J’ai une structure du style


typedef
struct {
char champ1[1]; 
char champ2[9];
char champ3[1];  
char champ4[13];
....
} mastruct; 
mastruct typeStruct;

Le total de de ma struct fait 128
 

je lit un fichier txt 128bit par 128, les données lu sont de le même ordre que mes champs struct


while(fread (buffer,sizeof(buffer),1,Fichier)){ // Lecture du fichier 128bit par 128

Ensuite j’ecrit mon buffer dans ma struct


memcpy(&typeStruct,buffer,sizeof(typeStruct));

Apparament, cela fonctionne, mais ensuite, qd je veux lire un de mes champs, je n’ai pas que les valeurs de mon champs mais tout


printf("%s",typeStruct.champs1)

Comment je peux accéder seulement au valeur de champs que je souhaite?

Merci

Le problème du printf( %s…") est qu’il va afficher tous les caractères d’une portion mémoire jusqu’à trouver le caractère ‘fin de chaine’.

avec l’expérience, j’aurais fait autrement.

ma structure ne contiendrait qu’un champ

typedef
struct {
char champ1[128]; 
} mastruct; 
mastruct typeStruct;

la lecture du fichier et le renseignement de la structure ne changerait pas.
Ensuite l’accès à un ‘champ’ spécifique de ma structure se ferait par une fonction

char * getChamp(int numero_champ , mastruct _struct)
{
 int ptr_deb = 0;
 int ptr_fin=0;
 char * res;
 switch(numero_champ)
 {
  case 1 : ptr_deb = 0; ptr_fin=1; break;
  case 2 : ptr_deb = 1; ptr_fin=9; break;
  ...
 }
  //+1 pour la taille correcte, et +1 pour le pointeur de fin de chaine
 *res = malloc((ptr_fin-ptr_deb+1+1)*(char*));
  for(int i = 0 ; i <= ptr_fin ; i++)
  {
   res[i] = _struct.champ1[i+ptr_deb];
  }
 res[(ptr_fin-ptr_deb+1+1)] = '\0';
 return res;
}

je ne crois pas que ce code fonctionne (problème sur les pointeurs). Je le mettrai plus dans une fiche ‘exemple de code’, que tu peux ensuite revoir pour le compléter/corriger.

i y a une autre possibilité pour copier une partie d’une chaine de caractère avec un déplacement du pointeur de départ puis la fonction strncpy.

Heu pourquoi ne pas conserver ta structure, et faire :

while(fread (mastruct, sizeof(mastruct),1,Fichier)){...}

Surtout si le fichier est strictement mappé sur le contenu de la structure (ie: tu as écrit le fichier à partir de ta structure…)


Et au passage, comme le souligne Jiheme44 sprintf("%s", x) ne fait que lire le contenu de x jusqu'à trouver un caractère NUL (\0).

Alors je ne peux pas directement ecrire

while(fread (mastruct, sizeof(mastruct),1,Fichier)){...}

car en realité j’ai plusieur structure de 128bit mais les champs difffère. Et au moment de la lecture, je ne sais pas encore dans quel structure la copier, d’ou mon

memcpy(&typeStruct,buffer,sizeof(typeStruct));

En ce qui concerne la “structure” de ma structure, je suis imposé par une norme, donc je ne peux pas y toucher.

Et c’est quoi le format du fichier ?