Forum Programmation.c Parser un fichier ASCII

Posté par  (site web personnel) .
Étiquettes : aucune
0
9
nov.
2005
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  . Évalué à 2.

    En C, je pencherai pour un sscanf("%c%hd%d%s", .....)
    • [^] # Re: En quel langage

      Posté par  (site web personnel) . É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  . É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  (site web personnel) . É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  . É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  (site web personnel) . É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 !

Suivre le flux des commentaires

Note : les commentaires appartiennent à celles et ceux qui les ont postés. Nous n’en sommes pas responsables.