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
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()?