vfscanf_s、vfwscanf_svfscanf_s, vfwscanf_s

从流中读取格式化数据。Reads formatted data from a stream. 这些 vfscanf、vfwscanf 版本具有安全增强功能,如 CRT 中的安全功能所述。These versions of vfscanf, vfwscanf have security enhancements, as described in Security Features in the CRT.


int vfscanf_s(   
   FILE *stream,  
   const char *format,  
   va_list arglist  
int vfwscanf_s(   
   FILE *stream,  
   const wchar_t *format,  
   va_list arglist  


指向 FILE 结构的指针。Pointer to FILE structure.

窗体控件字符串。Format-control string.

变量参数列表。Variable argument list.

返回值Return Value

每个函数都将返回成功转换并分配的字段数;返回值不包括已读取但未分配的字段。Each of these functions returns the number of fields that are successfully converted and assigned; the return value does not include fields that were read but not assigned. 返回值为 0 表示没有分配任何字段。A return value of 0 indicates that no fields were assigned. 如果出现错误或在首次转换前达到文件流的结尾,则 vfscanf_svfwscanf_s 的返回值为 EOFIf an error occurs, or if the end of the file stream is reached before the first conversion, the return value is EOF for vfscanf_s and vfwscanf_s.

这些函数验证其参数。These functions validate their parameters. 如果 stream 是无效文件指针,或 format 是 null 指针,这些函数将调用无效参数处理程序,如参数验证中所述。If stream is an invalid file pointer, or format is a null pointer, these functions invoke the invalid parameter handler, as described in Parameter Validation. 如果允许执行继续,则这些函数将返回 EOF 并将 errno 设置为 EINVALIf execution is allowed to continue, these functions return EOF and set errno to EINVAL.


vfscanf_s 函数将从 stream 的当前位置将数据读取到 arglist 参数列表(如果有)提供的位置。The vfscanf_s function reads data from the current position of stream into the locations that are given by the arglist argument list (if any). 列表中的每个参数都必须为指向类型的变量的指针,该类型与 format 中的类型说明符对应。Each argument in the list must be a pointer to a variable of a type that corresponds to a type specifier in format. format 控制输入字段的解释,格式和函数与 scanf_sformat 参数相同;有关 format 的说明,请参阅格式规范字段:scanf 和 wscanf 函数format controls the interpretation of the input fields and has the same form and function as the format argument for scanf_s; see Format Specification Fields: scanf and wscanf Functions for a description of format. vfwscanf_svfscanf_s 的宽字符版本;vfwscanf_s 格式参数是宽字符字符串。vfwscanf_s is a wide-character version of vfscanf_s; the format argument to vfwscanf_s is a wide-character string. 如果在 ANSI 模式下打开流,则这些函数行为相同。These functions behave identically if the stream is opened in ANSI mode. vfscanf_s 当前不支持 UNICODE 流的输入。vfscanf_s doesn't currently support input from a UNICODE stream.

更安全的函数(带有 _s 后缀)与其他版本之间的主要区别在于,更安全的函数需要每个 cCsS[ 类型字段的以字符为单位的大小作为紧跟变量的参数进行传递。The main difference between the more secure functions (that have the _s suffix) and the other versions is that the more secure functions require the size in characters of each c, C, s, S, and [ type field to be passed as an argument immediately following the variable. 有关详细信息,请参阅 scanf_s、_scanf_s_l、wscanf_s、_wscanf_s_lscanf 宽度规范For more information, see scanf_s, _scanf_s_l, wscanf_s, _wscanf_s_l and scanf Width Specification.


大小参数的类型具有 unsigned,而不具有 size_tThe size parameter is of type unsigned, not size_t.

一般文本例程映射Generic-Text Routine Mappings

TCHAR.H 例程TCHAR.H routine 未定义 _UNICODE 和 _MBCS_UNICODE & _MBCS not defined 已定义 _MBCS_MBCS defined 已定义 _UNICODE_UNICODE defined
_vftscanf_s vfscanf_s vfscanf_s vfwscanf_s


函数Function 必需的标头Required header
vfscanf_s <stdio.h><stdio.h>
vfwscanf_s <stdio.h> 或 <wchar.h><stdio.h> or <wchar.h>

有关其他兼容性信息,请参阅 兼容性For additional compatibility information, see Compatibility.


// crt_vfscanf_s.c  
// compile with: /W3  
// This program writes formatted  
// data to a file. It then uses vfscanf_s to  
// read the various data back from the file.  

#include <stdio.h>  
#include <stdarg.h>  
#include <stdlib.h>  

FILE *stream;  

int call_vfscanf_s(FILE * istream, char * format, ...)  
    int result;  
    va_list arglist;  
    va_start(arglist, format);  
    result = vfscanf_s(istream, format, arglist);  
    return result;  

int main(void)  
    long l;  
    float fp;  
    char s[81];  
    char c;  

    if (fopen_s(&stream, "vfscanf_s.out", "w+") != 0)  
        printf("The file vfscanf_s.out was not opened\n");  
        fprintf(stream, "%s %ld %f%c", "a-string",  
            65000, 3.14159, 'x');  
        // Security caution!  
        // Beware loading data from a file without confirming its size,  
        // as it may lead to a buffer overrun situation.  

        // Set pointer to beginning of file:  
        fseek(stream, 0L, SEEK_SET);  

        // Read data back from file:  
        call_vfscanf_s(stream, "%s %ld %f%c", s, _countof(s), &l, &fp, &c, 1);  

        // Output data read:   
        printf("%s\n", s);  
        printf("%ld\n", l);  
        printf("%f\n", fp);  
        printf("%c\n", c);  


请参阅See Also

流 I/O Stream I/O
_cscanf_s、_cscanf_s_l、_cwscanf_s、_cwscanf_s_l _cscanf_s, _cscanf_s_l, _cwscanf_s, _cwscanf_s_l
fprintf_s、_fprintf_s_l、fwprintf_s、_fwprintf_s_l fprintf_s, _fprintf_s_l, fwprintf_s, _fwprintf_s_l
scanf_s、_scanf_s_l、wscanf_s、_wscanf_s_l scanf_s, _scanf_s_l, wscanf_s, _wscanf_s_l
sscanf_s、_sscanf_s_l、swscanf_s、_swscanf_s_l sscanf_s, _sscanf_s_l, swscanf_s, _swscanf_s_l
fscanf、_fscanf_l、fwscanf、_fwscanf_l fscanf, _fscanf_l, fwscanf, _fwscanf_l
vfscanf、vfwscanfvfscanf, vfwscanf