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 ?