Quelle est la différence entre fmemopen et open_memstream?

Lors de la lecture de la documentation GNU sur les stream de chaînes, j’ai trouvé deux fonctions similaires qui font des choses très similaires:

FILE * fmemopen (void *buf, size_t size, const char *opentype) FILE * open_memstream (char **ptr, size_t *sizeloc) 

A la lecture de la documentation, il semble que open_memstream soit utilisé pour ouvrir un stream de sortie et fmemopen pour une entrée. Ce qui m’attire, c’est l’argument de type opentype que vous pouvez transmettre à fmemopen .

La page de manuel de linux explique :

Si buf est spécifié comme NULL, alors fmemopen () alloue dynamicment une taille de tampon de octets de long. Ceci est utile pour une application qui veut écrire des données dans un tampon temporaire, puis les relire. Le tampon est automatiquement libéré lorsque le stream est fermé. Notez que l’appelant n’a aucun moyen d’obtenir un pointeur sur le tampon temporaire alloué par cet appel (mais consultez open_memstream () ci-dessous).

Alors, quel serait l’intérêt d’utiliser open_memstream si fmemopen peut gérer l’ouverture d’un stream d’entrée / sortie?

Avec fmemopen , le tampon est alloué à l’ouverture ou avant l’ouverture et ne change pas de taille plus tard. Si vous y écrivez, vous devez savoir quelle sera la taille de votre sortie avant de commencer. Avec open_memstream le tampon augmente à mesure que vous écrivez.

Le FILE* pour open_memstream est en écriture seule

POSIX http://pubs.opengroup.org/onlinepubs/9699919799/functions/open_memstream.html

Ces fonctions sont similaires à fmemopen () sauf que la mémoire est toujours allouée dynamicment par la fonction et que le stream est ouvert uniquement pour la sortie.

Il y a donc une seconde différence en dehors de l’allocation dynamic: le fichier est ouvert uniquement pour l’écriture.

Et comme vous ne pouvez pas modifier les indicateurs des stream ouverts, vous ne devriez pas pouvoir lire le stream.

Cependant, il semble que certaines implémentations pourraient permettre ceci: Puis-je lire le stream produit par open_memstream ()?