函数
<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++ 实现是必需的),并且可能不被符合旧标准的库所支持。

另见