C语言流输入和输出函数

本文详细介绍了C语言中的流输入和输出函数,包括向任何流输出字符串的函数、变长参数列表的处理、文件结尾和错误指示器的检查、字符输入输出、行输入输出、块输入输出以及文件定位函数的使用。还提到了特定的输入输出函数如、和等,以及如何处理文件的错误和结尾状态。
摘要由CSDN通过智能技术生成

printfscanf)、putsgets)和putchargetchar)是分别向标准流输出(由标准流读入)字符串、一行字符和单个字符的函数。除了这些函数,C语言也提供了面向任何流的输入和输出函数。

fprintf函数

fprintf函数的原型为:

int fprintf(FILE *stream, const char *format, ...);

该函数向stream流输出字符串。与printf函数唯一的不同只是增加了一个参数:访问输出流的文件指针,支持向任何流输出字符串。

可变长度实参

<stdarg.h>中提供了三个宏va_start, va_argva_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++)
  {
    
  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值