¿Es posible crear en C/C++ mi propio flujo personalizado de tipo FILE (stdio.h) que se puede usar con fputs(), por ejemplo?tipo de archivo personalizado en C/C++
Respuesta
Si su "transmisión personalizada" no es algo que pueda representar con un descriptor de archivo o manejador de archivo, entonces no tendrá suerte. El tipo FILE
está definido por la implementación, por lo que no hay una forma estándar de asociar otras cosas con una.
Si puede obtener un descriptor de archivo C para lo que sea que intente escribir, puede llamar al fdopen
para convertirlo en FILE*
. No es estándar C o C++, pero lo proporciona Posix. En Windows, se deletrea _fdopen
.
Si está usando Windows y tiene un HANDLE
, puede usar _open_osfhandle
para asociar un descriptor de archivo con él, y luego usar _fdopen
desde allí.
¿Está realmente vinculado con fputs
? De lo contrario, reemplácelo por el uso de un C++ IOStream. Luego puede proporcionar su propio descendiente de std::basic_streambuf
, envolverlo en un std::ostream
y usar E/S estándar de C++ en él.
Muchas gracias, esto funciona: CreatePipe() + _open_osfhandle() + fdopen() –
No, no lo es. ARCHIVO es lo que se conoce como un tipo opaco: no tiene nada que pueda personalizar.
Entonces, ¿cómo es que Windows puede manejar archivos en disco, archivos en la red, archivos virtuales, ...? Algunos aspectos deben ser personalizables. – xtofl
Nombre uno entonces. El tipo de ARCHIVO no tiene miembros disponibles para el programador de la aplicación. –
@xtofl: porque FILE * en Windows se asigna a HANDLE devuelto por CreateFile. FILE * no hace la "personalización" – MSalters
Es posible. Pero debe vincular su aplicación con su versión de fputs(), etc. en lugar de las que vienen con las bibliotecas estándar. La mayoría de los compiladores se vinculan a las bibliotecas IO estándar de manera predeterminada. Tienes que descubrir cómo solucionarlo.
No quiere volver a escribir fputs(), quiere especializar FILE. O al menos esa es mi lectura. –
si defino mis propios fputs(), cualquier llamada de fputs() pasará por mis fputs. –
No hay una forma estándar con la interfaz FILE. Tenga en cuenta que el código C++ generalmente debe usar IOStream for IO, con la interfaz IOStream, escribir un streambuf personalizado es la solución a su problema.
Si puede eliminar la conformidad estándar, consulte la documentación de su implementación.
POSIX tiene una función popen() que crean una lectura FILE * de la salida o escribiendo a la entrada de un proceso;
POSIX tiene un fdopen() que puede crear un ARCHIVO * desde un descriptor de archivo;
Al menos para la libc GNU utilizada por Linux, existe la posibilidad de definir una transmisión C personalizada (consulte la sección "Programación de secuencias personalizadas de awn" en la documentación de información).
¿Cómo funciona popen (0 aborda el problema? –
No sabemos lo suficiente sobre el problema, solo sabemos que tiene que pasar un ARCHIVO * a una API. Organizar su programa en dos o más procesos podría ser un solución (generando un proceso que hace un popen() y luego llama a la API con el resultado, por ejemplo). – AProgrammer
Veo, gracias por la sugerencia, pero no puedo hacer eso. La API que uso también tiene un contexto como argumento y podría ser muy difícil aplicar esta solución. –
Si está compilando con la biblioteca GNU C se puede utilizar fmemopen (3):
fmemopen, abierta _ memstream, abierta _ wmemstream - memoria abierta como corriente
- 1. Tipo e ícono de archivo personalizado
- 2. Cómo registro un tipo de archivo personalizado en iOS
- 3. registrar un tipo de archivo personalizado en iOS
- 4. Detalles de call/cc
- 5. JavaScriptSerializer con tipo personalizado
- 6. Agregue un encabezado personalizado según el tipo de archivo
- 7. patrones "call-cc" en Scala?
- 8. Tipo personalizado python
- 9. C# Tipo de datos personalizado!
- 10. ¿Qué es call/cc?
- 11. Redondeo personalizado de tipo decimal en C#
- 12. PHP Mail, CC Field
- 13. ¿Cómo agregar un tipo de mime personalizado?
- 14. ¿Cómo cambian DP y CC en Piet?
- 15. Continuación (call/cc) en el Esquema
- 16. ¿Qué significa CC? = En un Makefile?
- 17. En makefiles, ¿qué significan CC y LD?
- 18. Tipo de Javascript de objeto personalizado
- 19. WPF Control personalizado: DependencyProperty de tipo Colección
- 20. ¿Cuáles son los códigos tales como CC, LD y CC [M] de salida al compilar el kernel de Linux?
- 21. AutoMapper convertidor de tipo personalizado no funciona
- 22. ¿Crear un tipo de datos XML personalizado?
- 23. Ordenando una lista de un tipo personalizado
- 24. Proceso de horquillas con CC .NET
- 25. Análisis de Haskell, Aeson y JSON en el tipo personalizado
- 26. mountainlion abril compilar carente de 'CC'
- 27. Configuraciones de aplicaciones de tipo personalizado en ASP.NET
- 28. Enum personalizado como tipo de configuración de aplicación en C#?
- 29. NSMetadataQuery ignorando el paquete de archivos personalizado tipo
- 30. Creando un archivo .config personalizado en asp.net
¿Qué idioma estás usando, C o C++? –
Estoy usando C++ API que requiere un ARCHIVO * como argumento. –
http://stackoverflow.com/questions/539537/memory-buffer-as-file/539608#539608 - ¿Eso ayuda? –