fwscanf ()- 使用宽字符从流中读取数据
格式
#include <stdio.h>
#include <wchar.h>
int fwscanf(FILE *stream, const wchar_t *format, argument-list);语言级别
ANSI
线程安全
是
语言环境敏感
此函数的行为可能受当前语言环境的 LC_CTYPE 和 LC_NUMERIC 类别影响。 如果在编译命令中指定了 LOCALETYPE (*LOCALEUCS2) 或 LOCALETYPE (*LOCALEUTF) ,那么它也可能受到当前语言环境的 LC_UNI_CTYPE 和 LC_UNI_NUMERIC 类别的影响。 当在编译命令上指定 LOCALETYPE (*CLD) 时,此功能不可用。 有关更多信息,请参阅 了解 CCSID 和语言环境。
集成文件系统界面
当在编译命令上指定 SYSIFCOPT (*NOIFSIO) 时,此功能不可用。
宽字符函数
有关更多信息,请参阅 宽字符 。
描述
fwscanf() 函数在 format所指向的宽字符串的控制下从 stream所指向的流中读取输入。 格式字符串指定可接受的输入序列以及如何将它们转换为赋值。 为了接收转换后的输入, fwscanf() 函数使用后续自变量作为指向对象的指针。
argument-list 中的每个自变量都必须指向具有对应于格式类型说明符的类型的变量。
如果该格式没有足够的自变量,那么行为未定义。 如果在保留自变量时格式耗尽,那么 fwscanf() 函数将对多余的自变量进行求值,否则将忽略这些自变量。
格式由零个或多个伪指令组成: 一个或多个空格宽字符; 普通宽字符 (既不是% 也不是空格宽字符); 或转换规范。 每个转换规范都由一个% 引入。
scanf() 函数的格式字符串相同的格式和函数,但以下情况除外:- %c (不带 l 前缀) 将一个或多个 wchar_t 字符 (取决于精度) 转换为多字节字符,就像调用
wcrtomb()一样。 - %lc 和 %C 将一个或多个 wchar_t 字符 (取决于精度) 转换为 wchar_t 数组。
- %s (不含 l 前缀) 将非空格 wchar_t 字符序列转换为多字节字符,就像调用
wcrtomb()函数一样。 数组包含结束空字符。 - %ls 和 %S 将 wchar_t 的数组 (包括结尾的空宽字符) 复制到 wchar_t 的数组。
如果数据来自 stdin,并且尚未覆盖 stdin ,那么假定数据使用作业的 CCSID。 根据格式规范的要求转换数据。 如果正在读取的文件未以文件方式 rb打开,那么可能会发生无效转换。
如果转换规范无效,那么行为未定义。 如果 fwscanf() 函数在输入期间迂到文件结束,那么将结束转换。 如果在 fwscanf() 函数读取与当前伪指令匹配的任何字符 (前导空格除外,在允许的情况下) 之前出现文件结束符,那么当前伪指令的执行将以输入失败结束。 否则,除非当前伪指令的执行因匹配失败而终止,否则以下伪指令 (除 %n 以外,如果有) 的执行因输入失败而结束。
除非伪指令匹配,否则 fwscanf() 函数将使尾部空格 (包括换行宽字符) 保持未读状态。 不能确定除通过 %n 伪指令以外的字面值匹配和禁止的分配是否成功。
返回值
fwscanf() 函数返回在早期匹配失败时分配的输入项数 (可以小于所提供的数目)。
如果在任何转换之前发生输入故障,那么 fwscanf() 函数将返回 EOF。
示例
#include <stdio.h>
#include <wchar.h>
#define MAX_LEN 80
int main(void)
{
FILE *stream;
long l;
float fp;
char s[MAX_LEN+1];
char c;
stream = fopen("myfile.dat", "r");
/* Read data from file. */
fwscanf(stream, L"%s", &s[0]);
fwscanf(stream, L"%ld", &l);
fwscanf(stream, L"%c", &c);
fwscanf(stream, L"%f", &fp);
printf("string = %s\n", s);
printf("long integer = %ld\n", l);
printf("char = %c\n", c);
printf("float = %f\n", fp);
return 0;
/***********************************************
If myfile.dat contains:
abcdefghijklmnopqrstuvwxyz 343.2.
The output should be:
string = abcdefghijklmnopqrstuvwxyz
long integer = 343
char = .
float = 2.000000
***********************************************/
}
Unicode 示例
#include <stdio.h>
#include <wchar.h>
#include <locale.h>
void main(void)
{
FILE *stream;
wchar_t buffer[20];
stream=fopen("unicode.dat","rb");
fwscanf(stream,L"%ls", buffer);
wprintf(L"The string read was :%ls\n",buffer);
fclose(stream);
}
/* If the input in unicode.dat is :
ABC
and ABC is in unicode which in hex would be 0x0041, 0x0042, 0x0043
then the output will be similar to:
The string read was :ABC
*/