«FPRINTF» - подобная функция для дескрипторов файлов (т.е. int fd вместо файла * fp)

StackOverflow https://stackoverflow.com/questions/4246588

  •  27-09-2019
  •  | 
  •  

Вопрос

Возможно, я просто скучаю по нему, но нет функции, эквивалентной 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() с участием ФДООН.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top