"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.