Home C&C++函数库 c++ 语法 程序源码 Linux C库


fprintf

函数  <cstdio>

int fprintf ( FILE * stream, const char * format, ... );
将格式化的数据写入流
将 format指向的C字符串写入流。如果format包含格式说明符(以%开头的子序列), 则format后面的附加参数将被格式化并插入到结果字符串中,替换它们各自的说明符。

在format形参之后,函数至少提供与format指定的一样多的附加参数。

☲  参数


stream
指向标识输出流的FILE对象的指针.
format
包含要写入流的文本的C字符串。

它可以选择性地包含嵌入的格式说明符,这些格式说明符被随后的附加参数中指定的值替换, 并按照请求进行格式化。

格式说明符遵循这个原型:

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

其中,末尾的说明符字符是最重要的部分,因为它定义了类型和对应参数的解释:
说明符 输出 范例
d or 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或%f 392.65
G 使用最短的表示:%E或%F 392.65
a 十六进制浮点数,小写 -0xc.90fep-2
A 十六进制浮点数,大写 -0XC.90FEP-2
c 字符 a
s 字符串 sample
p 指针地址 b8000000
n 不打印任何东西.
对应的实参必须是指向signed int型的指针。
到目前为止写入的字符数存储在指定的位置。
% 后跟另一个%字符的%将向流写入单个%。 %
格式说明符还可以包含子说明符:flags、width、.precision和modifiers(按顺序), 这些都是可选的,并遵循以下规范:
flags 说明
- 在给定的字段宽度内左对齐;右对齐是默认值(参见宽度(width)子说明符)。
+ 对正数强制在结果前面加上一个正号或负号(+或-)。默认情况下,只有负数前面有-号.
(space) 如果不写符号,则在值之前插入一个空格。
# 与o, x或x指示符一起使用,对于不同于零的值,值前面分别有0,0x或0x。
与a, A, e, E, f, F, g或G一起使用,它强制输出包含一个小数点, 即使后面没有更多的数字。默认情况下,如果后面没有数字,则不写小数点。
0 当指定填充时,用0(0)左填充数字,而不是空格(参见宽度(width)子说明符)。
width 说明
(number) 要打印的最小字符数。如果要打印的值比这个数字短,结果将用空格填充。即使结果更大,该值也不会被截断。
* 宽度(width)不是在格式字符串中指定的,而是作为必须格式化的参数前面的一个附加整数值参数。
.precision 说明
.number 对于整数说明符(d, i, o, u, x, X) : 精度(precision)指定要写入的最小数字数。
如果要写入的值比这个数字短,结果将用前导零填充。即使结果较长, 该值也不会被截断。精度(precision)为0意味着不为值0写入字符。

对于a, A, e, E, f和F说明符 : 这是小数点后要打印的位数(默认是6)。

对于g和g说明符 : 这是要打印的最大有效位数。

对于s:这是要打印的最大字符数。默认情况下,将打印所有字符,直到遇到结束的空字符为止。

如果指定的周期没有明确的精度值,则假定为0。
.* 精度(precision)不是在格式字符串中指定的,而是作为必须格式化的参数前面的一个附加整数值参数。
长度子说明符修改数据类型的长度。这是一个图表,显示了用于解释有长度说明符和没有长度说明符的相应参数的类型 (如果使用不同的类型,如果允许,将执行相应的类型提升或转换):
说明符
length d i u o x X f F e E g G a A c s p n
(none) int unsigned int double int char* void* int*
hh signed char unsigned char signed char*
h short int unsigned short int short int*
l long int unsigned long int wint_t wchar_t* long int*
ll long long int unsigned long long int long long int*
j intmax_t uintmax_t intmax_t*
z size_t size_t size_t*
t ptrdiff_t ptrdiff_t ptrdiff_t*
L long double


注意,c说明符接受一个int(或wint_t)作为参数,但是在格式化输出之前执行到一个char值(或wchar_t)的适当转换。
注意:绿色行表示C99引入的说明符和子说明符。有关扩展类型的说明符,请参阅<cinttypes>。

... (additional arguments)
根据格式字符串的不同,函数可能需要一系列附加参数,每个参数都包含一个用于替换格式字符串中的格式说明符的值(或者一个指向存储位置的指针,对于n)。 这些参数的数量至少应该与格式说明符中指定的值的数量一样多。其他参数被函数忽略。

☉  返回值



如果成功,则返回所写的字符总数。

如果发生写错误,则设置错误指示符(ferror)并返回一个负数。

如果在写入宽字符时发生多字节字符编码错误,则将errno设置为EILSEQ并返回一个负数。

☣  示例



/* 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次name,然后将每个名称以固定长度(总共19个字符+换行符)写入myfile.txt。

使用了两种格式标签:
%d:有符号的十进制整数
%-10.10s:左对齐(-),最小10个字符(10),最大10个字符(.10),字符串(s)。
假设我们输入了John, Jean-Francois和Yoko这三个名字,myfile.txt将包含:

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


有关格式化的更多示例,请参见printf。

⇄  兼容性



特定的库实现可能支持附加的说明符和子说明符。
这里列出的是最新的C和c++标准(都是在2011年发布的)所支持的,但是绿色的是在C99中引入的 (自c++ 11以来只对c++实现有要求),并且可能不被符合旧标准的库所支持。

🍄  另请参阅



fscanf 从流读取格式化的数据(function )
printf 将格式化的数据打印到标准输出(function )
fwrite 将数据块写入流(function )
fputs 将字符串写入流(function )


联系我们 免责声明 关于CandCplus 网站地图