Пользователь laalto правильный, но в Linux искомая функция называется fopencookie
. Исправление примера laalto для Linux приводит к:
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 ...
Когда вы пишете в f
, система выполнит вашу функцию my_writefn
, передав ей данные, которые были переданы в fwrite
. Чтобы упростить задачу, вы также можете изменить буферизацию для вашего файлового потока, чтобы она была ориентирована на строки:
setvbuf(f, NULL, _IOLBF, 0);
Это буферизует данные, передаваемые на fwrite
, до тех пор, пока не будет выведен символ новой строки или пока не будут считаны какие-либо данные из любого потока, присоединенного к процессам (например, stdin). ПРИМЕЧАНИЕ: вы должны вызвать sevbuf
после fopencookie
, но до того, как какие-либо данные будут записаны в поток.
Я использую строковую буферизацию, потому что я обычно использую fopencookie
для перенаправления stderr в системный журнал или через сетевой сокет, а обработка ориентированных на строки данных становится проще и эффективнее.