"fprintf" -подобная функция для файловых дескрипторов (т. е. int FD вместо FILE* fp)

может быть, я просто пропускаю его, но нет ли функции, эквивалентной fprintf для файловых дескрипторов, или даже способа временного флип-флопа между ними?

5 ответов


вы могли бы заглянуть в dprintf (расширения GNU, а не в C или POSIX):

функции dprintf () и vdprintf() (как найдено в библиотеке glibc2) точные аналоги fprintf() и vfprintf(), за исключением того, что они выводят на файловый дескриптор FD вместо данный поток.

редактировать как указали некоторые из вас в комментариях, POSIX 2008 стандартизировал эти функции.


нет стандартной функции C или POSIX, чтобы сделать printf на файловом дескрипторе, но вы можете "открыть" файловый дескриптор как FILE * С POSIX-standard fdopen(int desc, const char *mode). Я не уверен, насколько хорошо поддерживается возврат к использованию дескриптора напрямую, но я предполагаю, что это может сработать, если вы сначала очистите буфер...

конечно, вы можете реализовать свой собственный, используя что-то вроде vsprintf, но, очевидно, вам тогда придется заботиться о буферизации.


нет, это не стандарт, но они делают разные вещи. fprinft, как часть stdio, делает такие вещи, как чтение и запись буфера, поддерживает ungetc и т. д. Использование fd обходит все это и вызывает ОС напрямую.

таким образом, они не взаимозаменяемы. Флип-флоп между ними испортит буферизацию stdio, если ничего больше


для чего это стоит, начиная с 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 * процедуры делают; я больше искал спецификаторы формата и возможность создавать символьные данные, которые будут записаны в файловый дескриптор, а не беспокоиться о буферизации данных, как это пишется.


вы можете открыть файловый дескриптор как обычный файл, который может быть обработан fprintf() с fdopen.