函数
<cstdio>

fscanf

int fscanf ( FILE * stream, const char * format, ... );
从流中读取格式化数据
stream读取数据,并根据format参数将数据存储到其他参数指向的位置。

附加参数应该指向已分配的对象,其类型由 format 字符串中相应的格式说明符指定。

参数

stream
指向一个FILE对象的指针,该对象标识要从中读取数据的输入流。
format
C语言字符串,包含一系列字符,这些字符控制从流中提取的字符如何被处理
  • 空白字符:函数将读取并忽略遇到的任何空白字符,直到遇到下一个非空白字符为止(空白字符包括空格、换行符和制表符——参见isspace)。格式字符串中的单个空白字符会匹配流中任意数量的空白字符(包括零个)并忽略它们。
  • 非空白字符,格式说明符(%)除外:任何不是空白字符(空格、换行符或制表符)或格式说明符(以%字符开头)的字符都会导致函数读取流中的下一个字符,将其与此非空白字符进行比较,如果匹配,则将其丢弃,函数继续处理format中的下一个字符。如果字符不匹配,函数将失败,返回并使流中剩余的字符保持未读取状态。
  • 格式说明符:以初始百分号(%)开头的序列表示一个格式说明符,用于指定要从stream中提取的数据的类型和格式,以及将其存储在其他参数指向的位置。

格式说明符fscanf遵循以下原型

%[*][宽度][长度]说明符

其中末尾的说明符字符是最重要的组成部分,因为它定义了提取哪些字符、它们的解释以及其对应参数的类型。
说明符描述提取的字符
i, u整数任意数量的数字,可选地前面有符号(+-).
十进制数字,默认为(0-9),但0前缀引入八进制数字(0-7),以及0x 十六进制数字 (0-f).
d十进制整数任意数量的十进制数字0-9),可选地前面有符号(+-).
o八进制整数任意数量的八进制数字(0-7),可选地前面有符号(+-).
x十六进制整数任意数量的十六进制数字0-9, a-f, A-F),可选地前面有0x或 0X,并可选地前面有符号(+-).
f, e, g浮点数一系列十进制数字,可选地包含小数点,可选地前面有符号(+-)并可选地后面跟着eE字符和十进制整数(或strtod支持的其他序列)。
符合C99标准的实现也支持十六进制浮点数格式,当其前面有0x0X时。
a
c字符下一个字符。如果指定了除1以外的宽度,则函数读取宽度个字符并将它们存储在作为参数传递的数组的连续位置中。末尾不会附加空字符。
s字符串任意数量的非空白字符,在遇到第一个空白字符时停止。一个终止的空字符会自动添加到存储序列的末尾。
p指针地址表示指针的字符序列。具体的格式取决于系统和库实现,但它与fprintf中格式化%p的格式相同。
[字符]扫描集括号内指定的任意数量的字符。
破折号(-),如果不是第一个字符,在某些库实现中可能会产生不可移植的行为。
[^字符]否定扫描集任意数量的字符,其中不包括括号内指定的任何字符
n计数不消耗输入。
stream读取的字符数存储在指向的位置。
%%A%后跟另一个%匹配单个%.
除了n之外,任何说明符至少应消耗一个字符。否则,匹配失败,扫描将在此处结束。

格式说明符还可以包含子说明符:星号*)、宽度长度(按此顺序),它们是可选的,并遵循这些规范
子说明符描述
*可选的起始星号表示数据将从流中读取但被忽略(即不存储在参数指向的位置)。
宽度指定当前读取操作中要读取的最大字符数(可选)。
长度之一hh, h, l, ll, j, z, t, L(可选)。
这会改变相应参数指向的存储的预期类型(见下文)。

这是一个图表,显示了存储输入(带或不带长度子说明符)的相应参数所期望的类型。
说明符
长度d iu o xf e g ac s [] [^]pn
(无)int*unsigned int*float*char*void**int*
hhsigned char*unsigned char*signed char*
hshort int*unsigned short int*short int*
llong int*unsigned long int*double*wchar_t*long int*
lllong long int*unsigned long long int*long long int*
jintmax_t*uintmax_t*intmax_t*
zsize_t*size_t*size_t*
tptrdiff_t*ptrdiff_t*ptrdiff_t*
Llong double*
注意:黄色行表示C99引入的说明符和子说明符。
... (附加参数)
根据 format 字符串,该函数可能需要一系列附加参数,每个参数都包含一个指向已分配存储空间的指针,其中提取的字符的解释将以适当的类型存储。
这些参数的数量至少应与格式说明符存储的值的数量相同。多余的参数会被函数忽略。
这些参数预计是指针:要将对常规变量的操作结果存储到其中,其名称应加上引用运算符fscanf)(请参阅示例)。&如果发生读取错误或在读取过程中到达了文件末尾,则会设置相应的指示符(feofferror)。如果任何一个在成功读取任何数据之前发生,则返回EOF

返回值

成功时,函数返回成功填充的参数列表项的数量。由于匹配失败、读取错误或到达文件结尾,该计数可能与预期的项数相符,也可能更少(甚至为零)。

EILSEQ

如果在解释宽字符时发生编码错误,函数会设置 errno此示例代码创建一个名为.

示例

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
/* fscanf example */
#include <stdio.h>

int main ()
{
  char str [80];
  float f;
  FILE * pFile;

  pFile = fopen ("myfile.txt","w+");
  fprintf (pFile, "%f %s", 3.1416, "PI");
  rewind (pFile);
  fscanf (pFile, "%f", &f);
  fscanf (pFile, "%s", str);
  fclose (pFile);
  printf ("I have read: %f and %s \n",f,str);
  return 0;
}

myfile.txt的文件,并向其中写入一个浮点数和一个字符串。然后,流被倒回,并使用读取两个值。最后,它产生一个类似于fscanf的输出。
I have read: 3.141600 and PI


兼容性

特定的库实现可能支持额外的说明符和子说明符。
此处列出的说明符和子说明符受最新的C和C++标准(均于2011年发布)支持,但黄色行中的说明符和子说明符是由C99引入的(仅在C++11及以后版本中被C++实现要求),并且可能不被符合旧标准的库支持。

另见