[英]A combined function for fprintf and write in c/c++
在C / C ++中,有一個'write()函數,它允許我寫入文件或套接字,我只是相應地傳入文件描述符)。 並且有一個fprintf()允許我做fprintf(myFile,“你好%d”,名字); 但它只適用於文件。
有沒有api允許我這兩個? 即能夠讓我打印格式,並能夠在寫入文件或套接字之間切換?
謝謝。
當然:只需在套接字上使用fdopen
來創建一個FILE*
流,並適當地使用fprintf
。
在C中,在POSIX-ish機器上(您必須使用'write()'),您可以使用:
fdopen()
從文件描述符創建文件流。 fileno()
從文件流中獲取文件描述符。 在使用匹配的文件描述符之前,您需要注意在適當的時候刷新文件流。
您可以使用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
,因為你可能得到了你不想要的東西。 :-)
你可以這樣做,也許:
#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;
}
推廣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;
}
`
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.