在C / C ++中,有一个'write()函数可以让我写入文件或套接字,我只是相应地传入文件描述符)。并且有一个fprintf()允许我做fprintf(myFile,“你好%d”,名字);但它只适用于文件。
有没有api允许我这两个? 即能够让我打印格式并能够在写入文件或套接字之间切换?
谢谢。
答案 0 :(得分:4)
当然:只需在套接字上使用fdopen
即可创建FILE*
流,并正确使用fprintf
。
答案 1 :(得分:4)
在C中,在POSIX-ish机器上(您必须使用'write()'),您可以使用:
fdopen()
从文件描述符创建文件流。fileno()
从文件流中获取文件描述符。在使用匹配的文件描述符之前,您需要注意在适当的时候刷新文件流。
答案 2 :(得分:3)
您可以使用sprintf
或snprintf
打印到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;
}
`