fprintf的组合函数和用c / c ++编写

时间:2010-03-04 23:43:38

标签: c++ c

在C / C ++中,有一个'write()函数可以让我写入文件或套接字,我只是相应地传入文件描述符)。并且有一个fprintf()允许我做fprintf(myFile,“你好%d”,名字);但它只适用于文件。

有没有api允许我这两个? 即能够让我打印格式并能够在写入文件或套接字之间切换?

谢谢。

5 个答案:

答案 0 :(得分:4)

当然:只需在套接字上使用fdopen即可创建FILE*流,并正确使用fprintf

答案 1 :(得分:4)

在C中,在POSIX-ish机器上(您必须使用'write()'),您可以使用:

  • fdopen()从文件描述符创建文件流。
  • fileno()从文件流中获取文件描述符。

在使用匹配的文件描述符之前,您需要注意在适当的时候刷新文件流。

答案 2 :(得分:3)

您可以使用sprintfsnprintf打印到char *缓冲区,然后使用write。要从FILE *变量获取文件描述符,您可以使用fileno。但是,从文件描述符到FILE *没有可移植的方式:您可以移植fdopen 关联 FILE *和有效文件描述符。

此外,最新的POSIX标准指定dprintf,但GNU libc dprintf手册页有这样的说法:

  

这些函数是GNU扩展,而不是C或POSIX。显然,   名字被严重挑选。许多系统(如MacOS)都不兼容   称为dprintf()的函数,通常是printf()的一些调试版本,   也许还有像

这样的原型
void dprintf (int level, const char *format, ...);
     

其中第一个参数是调试级别(输出是   stderr)。此外,dprintf()(或DPRINTF)也是一个受欢迎的宏名称   用于调试printf。因此,可能最好在可移植的程序中避免使用此功能。

当然,libc手册页没有考虑到最新标准,但您仍然需要谨慎使用dprintf,因为您可能会得到一些您不想要的东西。 : - )

答案 3 :(得分:0)

你可以这样做,也许:

#include <stdarg.h>

int fdprintf(int fd, const char* fmt, ...) {
  char buffer[4096] = {0};
  int cc;
  va_list args;
  va_start(args, fmt);
  if ((cc = vsnprintf(buffer, 4096, fmt, args)) > 0) {
    write(fd, buffer, cc);
  }
  va_end(args);
  return cc;
}

答案 4 :(得分:0)

概括tusbar答案,并使其与visual studio一起使用,您可以尝试以下代码: `

int fdprintf(int fd, const char* fmt, ...) {
    int cc;
    va_list args;
    va_start(args, fmt);
    int len   = _vscprintf(fmt,args) + 1;
    char* buffer = new char[len];
    buffer[len] = 0;
    if ((cc = vsprintf_s(buffer, len-1, fmt, args)) > 0) {
        write(fd, buffer, cc);
    }
    va_end(args);
    delete[] buffer;
    return cc;
}

`