"fprintf" -подобная функция для файловых дескрипторов (то есть int fd вместо FILE * fp) - PullRequest
15 голосов
/ 22 ноября 2010

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

Ответы [ 5 ]

20 голосов
/ 22 ноября 2010

Вы можете посмотреть dprintf ( расширения GNU, не в C или POSIX ):

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

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

6 голосов
/ 22 ноября 2010

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

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

3 голосов
/ 22 ноября 2010

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

2 голосов
/ 22 ноября 2010

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

2 голосов
/ 22 ноября 2010

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

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

...