«FPRINTF» - подобная функция для дескрипторов файлов (т.е. int fd вместо файла * fp)
Вопрос
Возможно, я просто скучаю по нему, но нет функции, эквивалентной FPRINTF для файловых дескрипторов, или даже способ временно переворачиваться между ними?
Решение
Вы могли бы посмотреть в dprintf
(Расширение GNU, не в C или POSIX) :
Функции DPRINTF () и VDPRINTF () (как находятся в библиотеке GLIBC2) являются точными аналогами FPRINTF () и VFPrintf (), за исключением того, что они выводят в файловой дескриптор FD вместо данного потока.
РЕДАКТИРОВАТЬ Как указано нескольким из вас в комментариях, Posix 2008 стандартизировал эти функции.
Другие советы
Нет C или POSIX (редактировать: до 2008) стандартную функцию для выполнения printf
на файловом дескрипторе, но вы можете «открыть» файловый дескриптор как FILE *
с стандартом POSIX fdopen(int desc, const char *mode)
. Отказ Я не уверен, насколько хорошо поддержан, чтобы использовать непосредственное использование дескриптора, но я догадаюсь, что это может работать, если вы промываете буфер ...
Конечно, вы можете просто реализовать свои собственные, используя что-то вроде vsprintf
, но, очевидно, вы должны позаботиться о буферизации.
За то, что это стоит, так как 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 *
процедуры делают; Я смотрел больше для спецификаторов формата и возможность создания данных символов, которые будут записаны на файловый дескриптор, а не беспокоиться о буферизации данных, как оно написано.
Нет, там не так стандарт, но два делают разные вещи. FPRINFT, как часть Stdio, делает такие вещи, как буфер читают и пишет, поддерживает Ungetc и т. Д. Использование FD обходит все это и вызывает ОС напрямую.
Так что они не взаимозаменяемы. Перевернитесь между ними прикрутите буферизацию Stdio, если ничего другого
Вы можете открыть дескриптор файла как обычный файл, который можно обрабатывать fprintf()
с участием ФДООН.