C stdio fscanf() 函数

定义和用法

fscanf() 函数从文件中读取格式化数据,并将其写入由参数指定的内存位置,然后将位置指示器移动到停止读取的文件位置。

fscanf() 函数定义在 <stdio.h> 头文件中。

format 参数是一个字符串,描述了期望从文件中读取的数据格式。如果文件内容与格式不匹配,函数将在第一个不匹配点停止读取。

格式说明符

格式字符串可以包含格式说明符,这些说明符指定数据的哪些部分应写入参数。每个格式说明符对应于函数的一个附加参数。

格式说明符的形式为 %[*][width][length]specifier。方括号 [ ] 中的组件是可选的。

对每个组件的解释:

* - 可选。当存在时,格式说明符不对应于一个参数。

width - 可选。指定为此说明符读取的最大字符数。

length - 可选。一系列字符,用于更改参数的数据类型。它可以是以下之一:

hh 期望 char* 类型用于整数。
h 期望 short* 类型用于整数。
l

期望 long int* 类型用于整数;

期望 wchar_t* 类型用于字符和字符串;

期望 double* 类型用于浮点数。

ll 期望 long long int* 类型用于整数。
j 期望 intmax_t*uintmax_t* 类型用于整数。
z 期望 size_t* 类型用于整数。
t 期望 ptrdiff_t* 类型用于整数。
L 期望 long double* 类型用于浮点数。

specifier - 必需。一个字符或序列,指示如何解释文件数据。可能的说明符列表如下表所示:

说明符列表

字符 说明符 描述
iu 整数

读取一系列数字,并将其解释为整数。

如果序列以 "0x" 开头,则期望十六进制数字(0-9 和 A-F)。

如果序列以 "0" 开头,则期望八进制数字(0-7)。

序列前可能有符号("+" 或 "-")。

d 十进制整数

读取一系列数字(0-9),并将其解释为整数。

序列前可能有符号("+" 或 "-")。

o 八进制整数

读取一系列数字(0-7),并将其解释为八进制整数。

序列前可能有符号("+" 或 "-")。

x 十六进制整数

读取一系列数字(0-9 和 A-F),并将其解释为十六进制整数。

它可能以 "0x" 开头,序列前可能有符号("+" 或 "-")。

f, e, ga 浮点数

读取有效的字符序列,并将其解释为浮点数。

有效序列至少有一个数字,前面可能有符号("+" 或 "-"),后面可能跟有小数点和小数位。

也可以使用科学计数法(一个数字后跟 "e" 或 "E" 和一些数字)。

c 字符

从文件中读取一个字符。

如果指定了宽度,则读取该数量的字符。

s 字符串

读取文件中直到下一个空白字符(空格、制表符、换行符)的所有字符。

写入参数的值将附加一个额外的 \0 空终止字符。

p 指针 读取表示指针地址的一系列字符。
n 无输入

不从文件中读取任何内容。将到目前为止已读取的字符数写入参数。

参数必须是指向整数的指针。

% 百分号

从文件中读取一个字符,期望是 "%" 符号。

此说明符不与参数关联。

[characters] 字符集 读取与 characters 中指定的字符之一匹配的字符。
[^characters] 排除的字符集 读取不在 characters 中指定的字符集中的字符。

实例

例子 1

从文件中读取字符串:

FILE *fptr;

fptr = fopen("filename.txt", "r");

char output[50];
fscanf(fptr, "%49s", output);
printf("%s", output);

fclose(fptr);

例子 2

从包含序列 "1 + 2 = 3" 的文件中提取数字:

FILE *fptr;
fptr = fopen("filename.txt", "r");

int a, b, c;
fscanf(fptr, "%i + %i = %i", &a, &b, &c);
printf("a = %d \n", a);
printf("b = %d \n", b);
printf("c = %d \n", c);

fclose(fptr);

例子 3

从文件中读取一个十六进制数,并以十进制输出其值:

FILE *fptr;
fptr = fopen("filename.txt", "r");

int num;
fscanf(fptr, "%x", &num);
printf("%d", num);

fclose(fptr);

例子 4

文件的下一个字符中搜索 "x"、"y" 或 "z":

FILE *fptr;
fptr = fopen("filename.txt", "r");

char c;
int found = fscanf(fptr, " %[xyz]", &c);
if (found > 0) {
  printf("Found %c", c);
} else {
  printf("Character not found");
}

fclose(fptr);

语法

fscanf(FILE * fptr, const char * format, arg1, arg2...);

参数

参数 描述
fptr 必需。文件指针,通常由 fopen() 函数创建。
format 必需。表示期望从文件中读取的数据格式的字符串。
arg1, arg2... 可选。任意数量的附加参数,这些参数是指向可以写入值的内存的指针。

技术细节

返回:

返回 int 值,表示已写入的参数数量。

如果发生错误,返回常量 EOF