Возможно, я просто пропустил ее, но не существует функции, эквивалентной fprintf для дескрипторов файлов, или даже способ временно флип-флоп между ними?Функция «fprintf» для файловых дескрипторов (т. Е. Int fd вместо FILE * fp)
ответ
Вы можете посмотреть в dprintf
(расширений GNU, а не в C или POSIX):
функций dprintf() и vdprintf() (как найти в библиотеке glibc2) являются точные аналоги fprintf() и vfprintf(), за исключением того, что они выводят в файловый дескриптор fd вместо данного потока.
EDIT Как указал на некоторые из вас в комментариях, POSIX 2008 стандартизированы эти функции.
Нет, не существует стандарта, но два делают разные вещи. fprinft, как часть stdio, делает такие вещи, как чтение и запись буфера, поддерживает ungetc и т. д. Использование fd обходит все это и вызывает ОС напрямую.
Таким образом, они не являются взаимозаменяемыми. Флип шлепающий между ними будет завинчивать STDIO буферизацию, если ничего другого
Там нет C или стандартная функция POSIX, чтобы сделать printf
на файловом дескрипторе, но вы можете «открыть» файловый дескриптор как FILE *
с POSIX стандарта fdopen(int desc, const char *mode)
, Я не уверен, насколько хорошо поддерживается возврат к использованию дескриптора напрямую, но я предполагаю, что это может сработать, если вы сначала очистите буфер ...
Конечно, вы могли бы просто реализовать свое собственное, используя что-то вроде vsprintf
, но очевидно, вам нужно позаботиться о буферизации.
Вы можете открыть файловый дескриптор как обычный файл, который может обрабатываться fprintf()
с fdopen.
Для чего это стоит, так как dprintf
не является функцией POSIX, можно использовать следующее, если портативность вопрос:
#include <stdio.h>
#include <stdlib.h>
#include <stdarg.h>
#include <unistd.h>
int
fdprintf (int fd, size_t bufmax, const char * fmt, ...)
{
char * buffer;
int n;
va_list ap;
buffer = (char *) malloc (bufmax);
if (!buffer)
return 0;
va_start (ap, fmt);
n = vsnprintf (buffer, bufmax, fmt, ap);
va_end (ap);
write (fd, buffer, n);
free (buffer);
return n;
}
Скорее всего хотели бы, чтобы проверить возвращаемое значение write
, но вы получите общая идея. Очевидно, что это не буферизуется, как и процедуры FILE *
; Я больше искал спецификаторы формата и возможность создавать персональные данные, которые будут записываться в дескриптор файла, а не беспокоиться о буферизации данных по мере их написания.
Спасибо! Очень интересно, понятия не имели, что они существуют. – 2010-11-22 15:01:39
Я тоже. Поскольку это приложение будет работать только в Linux, это может быть то, что мне нужно. Кросс-платформенная совместимость не вызывает беспокойства, поэтому использование расширения GNU должно быть прекрасным. – Will 2010-11-22 15:11:51
На странице руководства говорится, что они теперь находятся в POSIX.1-2008 – nategoose 2010-11-22 15:13:19