函式
<cstdio>

fprintf

int fprintf ( FILE * stream, const char * format, ... );
將格式化的資料寫入流
format 指向的 C 字串寫入 stream。如果 format 包含 格式說明符 (以%開頭的子序列),則 format 之後的附加引數將被格式化並插入到結果字串中,以替換它們各自的說明符。

format 引數之後,函式期望的附加引數數量至少等於 format 所指定的數量。

引數

stream
指向一個 FILE 物件的指標,該物件標識一個輸出流。
format
包含要寫入流的文字的 C 字串。
它可以選擇性地包含嵌入的 格式說明符,這些說明符將被後續附加引數中指定的值替換並按要求格式化。

格式說明符 遵循以下原型

%[flags][width][.precision][length]specifier

其中末尾的 specifier 字元 是最重要的組成部分,因為它定義了其對應引數的型別和解釋。
說明符輸出示例
d i有符號十進位制整數392
u無符號十進位制整數7235
o無符號八進位制610
x無符號十六進位制整數7fa
X無符號十六進位制整數 (大寫)7FA
f十進位制浮點數,小寫392.65
F十進位制浮點數,大寫392.65
e科學計數法 (尾數/指數),小寫3.9265e+2
E科學計數法 (尾數/指數),大寫3.9265E+2
g使用最短的表示法%e%f392.65
G使用最短的表示法%E%F392.65
a十六進位制浮點數,小寫-0xc.90fep-2
A十六進位制浮點數,大寫-0XC.90FEP-2
c字元a
s字串sample
p指標地址b8000000
n不列印任何內容。
相應的引數必須是指向signed int.
的指標。已寫入的字元數儲存在指向的位置。
%A%後跟另一個%字元將寫入一個單獨的%到流中。%

格式說明符 還可以包含子說明符:flagswidth.precisionmodifiers (按此順序),它們是可選的,並遵循以下規範

標誌描述
-在給定的欄位寬度內左對齊;右對齊是預設值 (參見 width 子說明符)。
+強制在結果前加上加號或減號 (+-),即使是正數也是如此。預設情況下,只有負數前面會帶有-符號。
(space)如果將要寫入的符號不存在,則在值之前插入一個空格。
#o, xX說明符一起使用時,對於非零值,結果前面會加上0, 0x或 0X或 0X 分別。
a, A, e, E, f, F, gG它強制寫入的輸出包含小數點,即使後面沒有更多的數字。預設情況下,如果沒有數字跟隨,則不寫入小數點。
0在指定填充時 (參見 width 子說明符),用零 (0) 而不是空格左填充數字。

寬度描述
(number)要列印的最少字元數。如果待列印的值比此數字短,則結果會用空格填充。即使結果更長,值也不會被截斷。
*width 不在 format 字串中指定,而是作為附加的整數值引數,放在需要格式化的引數之前。

.precision描述
.數字對於整數說明符 (d, i, o, u, x, X): precision 指定要寫入的最少數字位數。如果待寫入的值比此數字短,則結果會用前導零填充。即使結果更長,值也不會被截斷。precision0表示該值不寫入任何字元。0.
不寫入任何字元。對於a, A, e, E, fF說明符:這是小數點之後要列印的數字位數 (預設值為 6)。
不寫入任何字元。對於gG說明符:這是要列印的有效數字的最大位數。
不寫入任何字元。對於s: 這是要列印的最大字元數。預設情況下,會一直列印所有字元,直到遇到結束的空字元為止。
如果指定了句點但未明確指定 precision 的值,則假定為00
.*precision 不在 format 字串中指定,而是作為附加的整數值引數,放在需要格式化的引數之前。

length 子說明符修改資料型別的長度。這是一個圖表,顯示了在有和沒有 length 說明符時解釋對應引數的型別 (如果使用了不同的型別,則執行適當的型別提升或轉換,如果允許的話)。
說明符
長度d iu o x Xf F e E g G a Acspn
(無)intunsigned intdoubleintchar*void*int*
hhsigned charunsigned charsigned char*
hshort intunsigned short intshort int*
llong intunsigned long intwint_twchar_t*long int*
lllong long intunsigned long long intlong long int*
jintmax_tuintmax_tintmax_t*
zsize_tsize_tsize_t*
tptrdiff_tptrdiff_tptrdiff_t*
Llong double
注意,c說明符接受一個int(或 wint_t) 作為引數,但在格式化輸出之前執行到char值 (或wchar_t) 的適當轉換。

注意:黃色的行表示 C99 引入的說明符和子說明符。有關擴充套件型別的說明符,請參閱 <cinttypes>
... (附加引數)
根據格式字串,函式可能需要一系列附加引數,每個引數包含一個用於替換格式字串中格式說明符的值(或者,對於n).
,是指向儲存位置的指標)。這些引數的數量應至少與格式說明符中指定的值的數量一樣多。額外的引數會被函式忽略。

返回值

成功時,返回寫入的字元總數。

如果發生寫入錯誤,則會設定錯誤指示符ferror)並返回一個負數。

如果在寫入寬字元時發生多位元組字元編碼錯誤,errno 會被設定為EILSEQ並返回一個負數。

示例

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
/* fprintf example */
#include <stdio.h>

int main ()
{
   FILE * pFile;
   int n;
   char name [100];

   pFile = fopen ("myfile.txt","w");
   for (n=0 ; n<3 ; n++)
   {
     puts ("please, enter a name: ");
     gets (name);
     fprintf (pFile, "Name %d [%-10.10s]\n",n+1,name);
   }
   fclose (pFile);

   return 0;
}

此示例提示使用者輸入 3 次姓名,然後將它們寫入myfile.txt檔案,每行一個,固定長度 (總共 19 個字元 + 換行符)。
使用了兩個格式標籤
%d: 有符號十進位制整數
%-10.10s: 左對齊 (-), 最少十個字元 (10), 最多十個字元 (.10), 字串 (s).
假設我們輸入了John, Jean-FrancoisYoko這 3 個名字,myfile.txt將包含

Name 1 [John      ] 
Name 2 [Jean-Franc] 
Name 3 [Yoko      ]


有關格式化的更多示例,請參閱 printf

相容性

特定的庫實現可能支援額外的 說明符子說明符
這裡列出的說明符和子說明符是由最新的 C 和 C++ 標準 (均於 2011 年釋出) 支援的,但黃色的說明符和子說明符是在 C99 中引入的 (僅對 C++11 及以上版本的 C++ 實現是必需的),並且可能不被符合舊標準的庫所支援。

另見