Bonjour, voici mon problème, qui est un banal problème de sérialisation:
1. Je dois lire des données à partir d'un fichier ASCII, pour les ranger dans une structure.
2. Je dois écrire (après modification) les donnée de ma structure dans un autre fichier ASCII au même format.
Le format:
Ces données sont numériques et toutes à la queue-leu-leu, avec des champs de taille fixe en nombre d'octets, sans délimiteurs.
Exemple:
"123456720051109"
Champs/taille en octets/ type:
a / 1 / entier non signé 8bits
b / 2 / entier non signé 16bits
c / 4 / entier non signé 32bits
d / 8 / date
Ma question:
Comment aborder le problème pour ne pas faire quelque chose de trop rigide, ie. qui permette de modifier le format relativement facilement. L'écriture dans le fichier est simple, mais pour la lecture, je dois vérifier les valeurs (que ce sont bien des caractères numériques), les convertir en valeur numérique quand c'est nécessaire (comment ? je suis réellement obligé de créer des sous chaines à côté pour y copier les donner à donner à bouffer aux fonctions ato* et strto* ?)
Merci pour votre aide...
Si quelqu'un a des idées...
# En quel langage
Posté par dguihal . Évalué à 2.
[^] # Re: En quel langage
Posté par liberforce (site web personnel) . Évalué à 3.
bin en fait j'utilise l'API glib, et comme on m'a toujours conseillé de pas utiliser les fonctions type scanf, à cause des failles de sécurité qui peuvent en découler... alors c'est clair que j'ai pas tilté :-) .
Bon, c'est sûr, j'ai pas de pb de sécurité là, c'est qu'une petite appli, mais je voudrais éviter que ça arrive quand je serai sur quelque chose de plus conséquent...
J'ai cherché mais j'ai pas trouvé d'équivalent glib... je suppose qu'il n'y en a pas. En tout cas merci pour l'info.
[^] # Re: En quel langage
Posté par Anonyme . Évalué à 3.
Or si tu supposes que cette chaine dois recevoir une date de format JJMMAAAA et que quelqu'un s'amuse a modifer ton fichier pour remplacer la date par une chaine plus longue, tu te places dans la situation de depassement de buffer: tes donnees seront ecrites dans une zone memoire non allouee par ton application, autorisant l'execution eventuel de code ( je ne suis pas assez cale pour detailler le comment de cette execution)
la solution serait:
1) utiliser un buffer intermediaire de taille fixe : char *Buffer[BUFSIZ];
2) lire une ligne entiere en bouclant une serie de
fgets(Buffer,BUFSIZ,fp);
chaine=realloc(chaine,strlen(chaine)+strlen(Buffer)+1)
strncat(chaine,Buffer,strlen(Buffer));
jusqu'a ce que fgets retourne NULL (ne pas oublier de prendre les precautions necessaires avec realloc pour eviter un eventuel NOMEM)
3) lire tes trois premiers champs a coup de sscanf, verifier qu'ils ont bien ete lus et retranscrits dans leur variable respective, puis verifier que strlen(chaine)-1-2-4==8, c'est a dire que la taille de la chaine de caracteres censee representer ta date est bien de 8 octets
[^] # Re: En quel langage
Posté par liberforce (site web personnel) . Évalué à 2.
[^] # Re: En quel langage
Posté par dguihal . Évalué à 1.
[^] # Re: En quel langage
Posté par liberforce (site web personnel) . Évalué à 2.
Merci à tous pour vos conseils !
Suivre le flux des commentaires
Note : les commentaires appartiennent à celles et ceux qui les ont postés. Nous n’en sommes pas responsables.