2009-06-25 22 views

Respuesta

1

Usuario laalto es correcto, pero en Linux, la función que está buscando se llama fopencookie. Corrección de ejemplo laalto para Linux se traduce en:

int my_writefn(void *cookie, const char *data, int n) { 
    FILE **files = (FILE **)cookie; 
    fwrite(data, n, 1, files[0]); 
    return fwrite(data, n, 1, files[1]); 
} 

int noop(void) { return 0; } 
cookie_io_functions_t my_fns = { 
    (void*) noop, 
    (void*) my_writefn, 
    (void*) noop, 
    (void*) noop 
}; 

FILE *files[2] = ...; 

FILE *f = fopencookie((void *)files, "w", my_fns); 

// ... use f as you like ... 

Cuando se escribe a f, el sistema ejecutará su función my_writefn pasándole los datos que se pasa a fwrite. Para facilitar las cosas, es posible que también desea cambiar el búfer para su flujo de archivos a orientarse línea:

setvbuf(f, NULL, _IOLBF, 0); 

que amortigüe los datos pasados ​​a fwrite hasta que una nueva línea es la salida o cualquier Los datos se leen desde cualquier flujo adjunto a los procesos (por ejemplo, stdin). NOTA: debe llamar al sevbuf después de fopencookie pero antes de que se escriban datos en la transmisión.

Utilizo el buffering de línea porque normalmente uso fopencookie para redirigir stderr a syslog, o sobre un socket de red, y el procesamiento de datos orientados a líneas es más fácil y más eficiente.

1

Puede implementar algo similar a la funcionalidad de tee con boost::iostreams.

+0

¿Tiene un ejemplo para C? Porque eso es estrictamente C++;) – Skurmedel

+0

lo siento probablemente no – stefanB

2

No estoy seguro si es lo que quiere, pero la 'tee' en Unix hace algo similar.

+0

Así que el chico "C++" se modificó, pero se modded por sugerir que "construir en el trabajo de los demás". Eso no está bien ... – Roboprog

4

Lo primero que me vino a la mente fue también "camiseta". Por lo tanto, vamos a combinar C y la cáscara con popen:

FILE * multi_out; 

multi_out = popen("tee file1.out > file2.out", "w"); 
/* error checks, actual work here */ 
pclose(multi_out); 
/* error checks here */ 

Como un intolerante Unix, he asumido que no está intentando esto en Windows.

+0

Ah, dijiste "Linux". Buen chico :-) – Roboprog

+0

De esta forma también podemos escribir en más de dos archivos. Solo el uso complicado de tee. árbitro. http://www.linuxandlife.com/2013/05/how-to-use-tee-command.html – JagsVG

6

Use funopen o fwopen y proporcione su propia función de escritura que se escribe en múltiples FILE* s.

Ejemplo:

FILE *files[2] = ...; 

FILE *f = fwopen((void *)files, my_writefn); 

// ... use f as you like ... 

int my_writefn(void *cookie, const char *data, int n) { 
    FILE **files = (FILE **)cookie; 
    fwrite(data, n, 1, files[0]); 
    return fwrite(data, n, 1, files[1]); 
} 

(Gestión de errores omite.)

Tenga en cuenta que funopen y fwopen son BSD y no en Linux estándar. No sé si hay un equivalente compatible con Linux.

+0

Aparentemente, no. No están en páginas man (al menos en mi sistema). – jackhab

+0

funopen está en BSD y Mac OS X. En Linux, use fopencookie. – mark4o

+0

@ mark4o: Gracias por la información. @Jack: Parece que la implementación con fopencookie() sería bastante similar. No estoy actualizando mi respuesta aquí, pero debería tener algunos consejos para seguir adelante. – laalto

Cuestiones relacionadas