用于文件描述符的“fprintf”函数(即int fd而不是FILE * fp)

时间:2010-11-22 14:43:44

标签: c file-io printf posix-api

也许我只是错过了它,但是没有一个函数等同于文件描述符的fprintf,或者甚至是在它们之间暂时翻转的方法吗?

5 个答案:

答案 0 :(得分:20)

您可以查看dprintf GNU扩展,而不是C或POSIX ):

  

函数dprintf()和vdprintf()   (如glibc2库中所见)   fprintf()和。的确切类似物   vfprintf(),除了它们输出到   文件描述符fd而不是a   给定流。

编辑正如你们几位评论中指出的那样,POSIX 2008标准化了这些功能。

答案 1 :(得分:6)

没有C或POSIX标准函数对文件描述符执行printf,但您可以使用POSIX标准FILE *将文件描述符“打开”为fdopen(int desc, const char *mode)。我不确定支持直接使用描述符的支持程度是多少,但我猜它可能会在你首先刷新缓冲区时起作用...

当然你可以使用类似vsprintf的东西来实现自己的,但显然你必须要处理缓冲。

答案 2 :(得分: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 *例程那样缓冲;我正在寻找更多的格式说明符和构建将写入文件描述符的字符数据的能力,而不是担心在写入数据时缓冲数据。

答案 3 :(得分:2)

不,没有标准,但两者做不同的事情。 fprinft,作为stdio的一部分,执行缓冲区读取和写入等操作,支持ungetc等。使用fd绕过所有这些并直接调用操作系统。

所以他们不可互换。如果没有别的话,在它们之间翻转就会搞乱stdio缓冲

答案 4 :(得分:2)

您可以将文件描述符打开为普通文件,fprintf()可以使用fdopen处理。