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++)
{

本文详细介绍了C语言中的流输入和输出函数,包括向任何流输出字符串的函数、变长参数列表的处理、文件结尾和错误指示器的检查、字符输入输出、行输入输出、块输入输出以及文件定位函数的使用。还提到了特定的输入输出函数如、和等,以及如何处理文件的错误和结尾状态。
最低0.47元/天 解锁文章
1860

被折叠的 条评论
为什么被折叠?



