2010-11-22 3 views

ответ

17

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

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

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

+0

Спасибо! Очень интересно, понятия не имели, что они существуют. – 2010-11-22 15:01:39

+0

Я тоже. Поскольку это приложение будет работать только в Linux, это может быть то, что мне нужно. Кросс-платформенная совместимость не вызывает беспокойства, поэтому использование расширения GNU должно быть прекрасным. – Will 2010-11-22 15:11:51

+2

На странице руководства говорится, что они теперь находятся в POSIX.1-2008 – nategoose 2010-11-22 15:13:19

2

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

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

6

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

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

1

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

2

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

 Смежные вопросы

  • Нет связанных вопросов^_^