簡體   English   中英

fprintf的組合函數和用c / c ++編寫

[英]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()從文件流中獲取文件描述符。

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

您可以使用sprintfsnprintf打印到char *緩沖區,然后使用write 要從FILE *變量獲取文件描述符,可以使用fileno 但是,從文件描述符到FILE *沒有可移植的方法:您可以使用fdopenFILE *與有效的文件描述符相關聯

另外,最新的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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM