Retourner aux forums || Retourner au forum Programmation.c
Programmation.c : Parser un fichier ASCII
Posté par liberforce (Jabber id, page perso, ) le 09 novembre 20051. 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...
> Lire le message (6 commentaires, moyenne: 2,2).
En quel langage
En C, je pencherai pour un sscanf("%c%hd%d%s", .....)
-
[^]Re: En quel langage
Posté par liberforce (Jabber id, page perso, ) le 09/11/2005 à 11:08. (lien). Évalué à 3.euh... je suis dans programmation.c là :-)
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 Pierre Maziere () le 09/11/2005 à 11:37. (lien). Évalué à 3.le probleme de securite il existe pour le %s ou tu dois allouer un espace memoire de taille equivalente a la longueur de la chaine que tu vas rencontrer dans ton fichier.
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 (Jabber id, page perso, ) le 09/11/2005 à 12:24. (lien). Évalué à 2.y a pas un moyen de faire autrement, déjà utilser snscanf et peut être un préfixe genre %8s pour indiquer une longueur du champ de 8 ? Est ce possible ?
-
[^]Re: En quel langage
Posté par dguihal () le 09/11/2005 à 12:38. (lien). Évalué à 1.Un moyen un peu barbare pourrait être de tronquer ta lecture de fichier a 15 caracteres, comme ca pas de probleme de depassement de memoire
-
[^]Re: En quel langage
Posté par liberforce (Jabber id, page perso, ) le 09/11/2005 à 12:55. (lien). Évalué à 2.C'est pas si barbare que ça, le format est foutu comme ça... Je me demande encore qui a pu pondre une m***e pareille... Pour pondre un truc pareil, ils auraient autant pu le faire en format binaire...
Merci à tous pour vos conseils !
-
-
-
-
Revenir en haut de page || Retourner aux forums || Retourner au forum Programmation.c



Cette discussion est archivée, il n'est plus possible de laisser des commentaires.
Note : les commentaires appartiennent à ceux qui les ont postés. Nous n'en sommes pas responsables.