printf
(scanf
)、puts
(gets
)和putchar
(getchar
)是分别向标准流输出(由标准流读入)字符串、一行字符和单个字符的函数。除了这些函数,C语言也提供了面向任何流的输入和输出函数。
fprintf
函数
fprintf
函数的原型为:
int fprintf(FILE *stream, const char *format, ...);
该函数向stream
流输出字符串。与printf
函数唯一的不同只是增加了一个参数:访问输出流的文件指针,支持向任何流输出字符串。
可变长度实参
在<stdarg.h>
中提供了三个宏va_start
, va_arg
和va_end
以及一个类型va_list
。利用这些元素可以编写具有变长参数列表的函数。
具有变长参数列表的函数必须至少具有一个正常的形式参数,在最后一个正常形式参数的后边添加,...
。变长参数列表的声明形式为:
返回值类型 函数名(正常形式参数1,正常形式参数2,...);
在函数的定义中,首先使用va_list
声明变量,以支持访问在最后一个正常实际参数后面的实际参数:
va_list ap;
然后调用va_start
声明可变长度部分开始的位置:
va_start(ap, 最后一个正常形式参数名);
之后依次通过va_arg
获取可变参数:
可变参数的值 = va_arg(ap, 可变参数的类型);
在访问完成后,使用va_end
结束:
va_end(ap);
。
在调用时,会进行默认的参数类型提升,例如由字符型自动提升到整型,由float
型到double
型等。
vfprintf
函数
vfprintf
原型为:
int vfprintf(FILE *stream, const char *format, va_list arg);
可以在带有变长参数列表的函数内调用,支持对输出信息的包装。
/****************************************
* stream_fprintf.c *
* *
* C语言中文件流的输出和变长参数列表函数*
****************************************/
#include <stdio.h>
#include <stdarg.h>
#include <stdlib.h>
void Print(FILE* fp, char *msgtype, char* format, ...)
{
va_list vp;
va_start(vp, format);
fprintf(fp, "%s: ", msgtype);
vfprintf(fp, format, vp);
va_end(vp);
fprintf(fp,"\n");
}
int Sum(size_t n, ...)
{
va_list vp;
va_start(vp, n);
size_t i = 0;
int sum = 0;
while (i < n)
{
int num = va_arg(vp, int);
sum += num;
i++;
}
va_end(vp);
return sum;
}
int main()
{
FILE *fp = NULL;
fp = fopen("test.txt", "w");
int n;
Print(fp, "询问","输入整数的个数: ");
scanf("%d", &n);
Print(fp, "询问", "输入%d个整数: ", n);
int *nums = malloc(n * sizeof(int));
int i = 0;
for (; i < n; i++)
{