vfscanf ()- 读取格式化数据

格式

#include <stdarg.h>
#include <stdio.h>
int vfscanf(FILE *stream, const char *format, va_list arg_ptr);

语言级别

ANSI

线程安全

语言环境敏感

此函数的行为可能受当前语言环境的 LC_CTYPE 和 LC_NUMERIC 类别影响。 如果在编译命令中指定了 LOCALETYPE (*LOCALEUCS2) 或 LOCALETYPE (*LOCALEUTF) ,那么此行为也可能受当前语言环境的 LC_UNI_CTYPE 类别影响。 当在编译命令上指定 LOCALETYPE (*CLD) 时,此功能不可用。 有关更多信息,请参阅 了解 CCSID 和语言环境

描述

vfscanf() 函数将数据从流读取到由可变数目的自变量指定的位置。 vfscanf() 函数的工作方式与 fscanf() 函数一样,只是 arg_ptr 指向一个自变量列表,这些自变量的数目因程序中的调用而异。 这些参数应该由 va_start 针对每个调用进行初始化。 相反, fscanf() 函数可以具有自变量列表,但是在编译程序时,该列表中的自变量数目是固定的。

每个自变量都必须是一个指向变量的指针,该变量的类型与 format-string 中的类型说明符相对应。 format 具有与 scanf() 函数的格式字符串相同的格式和函数。

返回值

vfscanf() 函数返回已成功转换和分配的字段数。 返回值不包含已读取但未分配的字段。 如果未执行任何转换,那么对于尝试在文件结束时读取的操作,返回值为 EOF。 返回值 0 表示未分配任何字段。

示例

此示例打开文件 myfile 以进行输入,然后扫描此文件以查找字符串,长整数值和浮点值。
#include <stdio.h>
#include <stdarg.h>
 
int vread(FILE *stream, char *fmt, ...)
{
   int rc;
   va_list arg_ptr;
   va_start(arg_ptr, fmt);
   rc = vfscanf(stream, fmt, arg_ptr);
   va_end(arg_ptr);
   return(rc);
}

#define MAX_LEN 80
int main(void)
{
   FILE *stream;
   long l;
   float fp;
   char s[MAX_LEN + 1];
   char c;
   stream = fopen("mylib/myfile", "r");
   /* Put in various data. */
   vread(stream, "%s", &s[0]);
   vread(stream, "%ld", &l);
   vread(stream, "%c", &c);
   vread(stream, "%f", &fp);
   printf("string = %s\n", s);
   printf("long double = %ld\n", l);
   printf("char = %c\n", c);
   printf("float = %f\n", fp);
}
/*************** If myfile contains ************************
**************** abcdefghijklmnopqrstuvwxyz 343.2 ***********
********************** expected output is: *********************
string = abcdefghijklmnopqrstuvwxyz
long double = 343
char = .
float = 2.000000
*/

相关信息