首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> 更多程式語言 >> 程式設計綜合問答

C 可變參數函數正確寫法:vfwprintf 格式化輸出

     編輯:程式設計綜合問答

錯誤代碼


void WriteLog(wchar_t *szLog, ...) {
    va_list arg_ptr;
    va_start(arg_ptr, szLog);
    fwprintf(fp, szLog, arg_ptr); // 錯誤:fwprintf 期望可變參數,非 va_list
    fwprintf(fp, L"\n\n\n");
    va_end(arg_ptr);
}

正確寫法


#include 
#include 
#include 

void WriteLog(FILE *fp, const wchar_t *fmt, ...) {
    va_list args;
    va_start(args, fmt);
    vfwprintf(fp, fmt, args); // vfwprintf 接受 va_list
    fwprintf(fp, L"\n\n\n");
    va_end(args);
}

// 調用
int main() {
    FILE *fp = fopen("log.txt", "a, ccs=UTF-8");
    WriteLog(fp, L"Hello %s, number %d", L"World", 42);
    fclose(fp);
    return 0;
}

關鍵區別

函數參數用途
fwprintf(FILE*, fmt, ...)直接可變參數
vfwprintf(FILE*, fmt, va_list)接受已封裝的 va_list
vsnwprintf(wchar_t*, size_t, fmt, va_list)寫入緩衝區,防溢出

完整日誌封裝示例


typedef enum { LOG_DEBUG, LOG_INFO, LOG_WARN, LOG_ERROR } LogLevel;

void LogWrite(LogLevel level, const wchar_t *fmt, ...) {
    static const wchar_t *prefix[] = {L"[DBG]", L"[INF]", L"[WRN]", L"[ERR]"};
    FILE *fp = fopen("app.log", "a, ccs=UTF-8");
    if (!fp) return;
    
    SYSTEMTIME st; GetLocalTime(&st);
    fwprintf(fp, L"%04d-%02d-%02d %02d:%02d:%02d %s ", 
        st.wYear, st.wMonth, st.wDay, st.wHour, st.wMinute, st.wSecond, prefix[level]);
    
    va_list args;
    va_start(args, fmt);
    vfwprintf(fp, fmt, args);
    va_end(args);
    
    fwprintf(fp, L"\n");
    fclose(fp);
}

**可變參數轉發必須用 v*printf 族函數**。va_list 是不可複製的一次性對象,**只能傳給 vfwprintf/vsnwprintf 等**,不能傳給 fwprintf/printf。記住:va_start → vfwprintf → va_end 三部曲。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved