2009-07-24 14 views
5

¿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++

+1

¿Qué idioma estás usando, C o C++? –

+0

Estoy usando C++ API que requiere un ARCHIVO * como argumento. –

+0

http://stackoverflow.com/questions/539537/memory-buffer-as-file/539608#539608 - ¿Eso ayuda? –

Respuesta

5

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.

+0

Muchas gracias, esto funciona: CreatePipe() + _open_osfhandle() + fdopen() –

6

No, no lo es. ARCHIVO es lo que se conoce como un tipo opaco: no tiene nada que pueda personalizar.

+0

Entonces, ¿cómo es que Windows puede manejar archivos en disco, archivos en la red, archivos virtuales, ...? Algunos aspectos deben ser personalizables. – xtofl

+1

Nombre uno entonces. El tipo de ARCHIVO no tiene miembros disponibles para el programador de la aplicación. –

+0

@xtofl: porque FILE * en Windows se asigna a HANDLE devuelto por CreateFile. FILE * no hace la "personalización" – MSalters

0

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.

+2

No quiere volver a escribir fputs(), quiere especializar FILE. O al menos esa es mi lectura. –

+0

si defino mis propios fputs(), cualquier llamada de fputs() pasará por mis fputs. –

1

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).

+0

¿Cómo funciona popen (0 aborda el problema? –

+0

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

+0

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. –

3

Si está compilando con la biblioteca GNU C se puede utilizar fmemopen (3):

fmemopen, abierta _ memstream, abierta _ wmemstream - memoria abierta como corriente

Cuestiones relacionadas