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
*/