¿Cuál es la diferencia entre fmemopen y open_memstream?

2 minutos de lectura

avatar de usuario
camino de bryan

Mientras lee la documentación de GNU sobre corrientes de cadena Encontré dos funciones similares que hacen cosas muy similares:

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

Al leer la documentación, parece open_memstream debe usarse para abrir un flujo de salida y fmemopen para entrada Lo que me atrapa es el opentype argumento que puedes pasar a fmemopen.

el linux la página de manual explica:

Si buf se especifica como NULL, entonces fmemopen() asigna dinámicamente un tamaño de búfer en bytes de longitud. Esto es útil para una aplicación que desea escribir datos en un búfer temporal y luego volver a leerlos. El búfer se libera automáticamente cuando se cierra la secuencia. Tenga en cuenta que la persona que llama no tiene forma de obtener un puntero al búfer temporal asignado por esta llamada (pero vea open_memstream() a continuación).

Entonces, ¿cuál sería el punto de usar open_memstream si fmemopen puede manejar la apertura de un flujo de entrada/salida?

Con fmemopen, el búfer se asigna en la apertura o antes, y no cambia de tamaño más adelante. Si va a escribir en él, debe saber qué tan grande será su salida antes de comenzar. Con open_memstream el búfer crece a medida que escribe.

  • Ah, ya veo. Buena idea, la página del manual para fmemopen no tiene eso explícitamente establecido, pero ahora veo que está implícito.

    –Bryan Way

    24/04/2015 a las 21:26

avatar de usuario
Ciro Santilli Путлер Капут 六四事

los FILE* por open_memstream es de solo escritura

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

Estas funciones son similares a fmemopen() excepto que la memoria siempre se asigna dinámicamente por la función y la secuencia se abre solo para la salida.

Entonces, hay una segunda diferencia además de la asignación dinámica: el archivo se abre solo para escribir.

Y dado que no puede cambiar las banderas de las transmisiones abiertas, no debería poder leer desde la transmisión.

Sin embargo, parece que algunas implementaciones podrían permitir esto: ¿Puedo leer el flujo producido por open_memstream()?

¿Ha sido útil esta solución?