"fprintf" -подобная функция для файловых дескрипторов (т.е. int fd вместо FILE * fp)
Возможно, я просто пропустил его, но нет ли функции, эквивалентной fprintf для дескрипторов файлов, или даже способ временного переключения между ними?
Ответы
Ответ 1
Вы можете посмотреть dprintf
(расширения GNU, а не на C или POSIX):
Функции dprintf() и vdprintf() (как показано в библиотеке glibc2) точные аналоги fprintf() и vfprintf(), за исключением того, что они выводят на файловый дескриптор fd вместо заданный поток.
РЕДАКТИРОВАТЬ Как отметили некоторые из вас в комментариях, POSIX 2008 стандартизовал эти функции.
Ответ 2
Не существует стандартной функции C или POSIX (редактирование: до 2008 г.) для выполнения printf
для файлового дескриптора, но вы можете "открыть" файловый дескриптор как FILE *
с помощью стандартного POSIX fdopen(int desc, const char *mode)
Я не уверен, насколько хорошо поддерживается возврат к использованию дескриптора напрямую, но я предполагаю, что это может сработать, если вы сначала очистите буфер…
Конечно, вы можете просто реализовать свои собственные, используя что-то вроде vsprintf
, но, очевидно, вам придется позаботиться о буферизации.
Ответ 3
Для чего стоит, так как 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 *
; Я больше искал спецификаторы формата и возможность создавать персональные данные, которые будут записаны в дескриптор файла, а не беспокоиться о буферизации данных по мере их написания.
Ответ 4
Нет, нет стандартного, но они делают разные вещи. fprinft, как часть stdio, делает такие вещи, как чтение и запись буфера, поддерживает ungetc и т.д. Использование fd обходит все это и вызывает операционную систему напрямую.
Таким образом, они не взаимозаменяемы. Flip flopping между ними будет забивать stdio буферизацию, если ничего больше
Ответ 5
Вы можете открыть дескриптор файла как обычный файл, который может быть обработан fprintf()
с помощью fdopen.