19

也许我只是想念它,但是对于文件描述符是否没有等效于 fprintf 的函数,或者甚至没有一种在它们之间临时翻转的方法?

4

5 回答 5

28

您可以查看dprintfGNU 扩展,不在 C 或 POSIX 中):

函数 dprintf() 和 vdprintf()(在 glibc2 库中找到)与 fprintf() 和 vfprintf() 完全类似,除了它们输出到文件描述符 fd 而不是给定流。

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

于 2010-11-22T14:45:59.040 回答
9

没有 C 或 POSIX(编辑:2008 年之前)标准函数可printf对文件描述符执行,但您可以FILE *使用 POSIX 标准“打开”文件描述符fdopen(int desc, const char *mode)。我不确定直接返回使用描述符的支持有多好,但我猜如果你先刷新缓冲区,它可能会起作用……</p>

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

于 2010-11-22T15:02:29.150 回答
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 *例程那样缓冲;我更多的是寻找格式说明符和构建将写入文件描述符的字符数据的能力,而不是担心在写入数据时缓冲数据。

于 2010-11-22T15:45:05.637 回答
2

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

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

于 2010-11-22T14:47:09.140 回答
2

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

于 2010-11-22T15:03:13.767 回答