fscanf 函数文档
函数概要:
fscanf 函数用于从指定文件中读取格式化字符串。
函数原型:
#include <stdio.h> ... int fscanf(FILE *stream, const char *format, ...);
参数解析:
1、stream 参数
该参数是一个 FILE 对象的指针,指定一个待操作的数据流。
2、format 参数
format 参数是一个格式化字符串,由格式化占位符和普通字符组成。
该格式化字符串指定如何处理读取到的数据:
· 空白字符:该函数将读取并忽略空白字符(空白字符包含空格、回车和制表符);
· 除了格式占位符(% 开头)外的非空白字符:指定函数必须从输入流中读取到的字符,如果读取不匹配,则函数调用失败,并从匹配失败处截断输入流;
· 格式化占位符(% 开头):用于指明获取的数据类型及位置。
格式化占位符的语法如下:
%[width][length]specifier
每一个格式化占位符均以 % 开始,以转换字符结束。
specifier(转换字符,必选)的内容及含义如下:
|
转换字符 |
含义 |
|
c |
读取一个字符 |
|
d |
读取一个十进制整数,前边可以加上符号(+ 或 -)表示正负 |
|
i |
1. 读取一个整数,前边可以加上符号(+ 或 -)表示正负 |
|
e |
读取一个以指数形式的单、双精度浮点数(小写 e) |
|
E |
同上(大写 E) |
|
f |
读取一个单、双精度浮点数(需要使用 lf),前边可以加上符号(+ 或 -)表示正负 |
|
g |
同 f、e、E |
|
G |
同上(指数显示大写 E) |
|
a |
读取一个十六进制的浮点数(以 0x 或 0X 开头) |
|
o |
读取一个八进制整数,前边可以加上符号(+ 或 -)表示正负 |
|
s |
读取一连串字符,直到遇到空白字符结束。 |
|
u |
读取一个无符号的十进制整数 |
|
x |
1. 读取一个十六进制整数,前边可以加上符号(+ 或 -)表示正负 |
|
p |
读取一个指针的值 |
|
[characters] |
1. 匹配中括号括起来的字符集 |
|
[^characters] |
1. 匹配除了中括号括起来的字符集 |
|
n |
1. 存放已经读取的字符个数 |
|
% |
表示匹配 % 自身 |
注1:除了 n,其他的每次读取都会至少消耗标准输入流中的一个字符。
注2:如果读取失败,则标准输入流截断于读取失败的位置。
星号(*)、width 和 length 是可选的。
· 星号(*)表示读取但忽略(读取但不保存);
· width 指定当前读取操作的最大字符数;
· length 是用于限定不同类型的宽度,具体请参考下表:
|
length |
d 或 i |
u、o 或 x |
f、e、g 或 a |
c、s、[] 或 [^] |
p |
n |
|
默认 |
int* |
unsigned int* |
float* |
char* |
void** |
int* |
|
hh |
signed char* |
unsigned char* |
signed char* |
|||
|
h |
short int* |
unsigned short int* |
short int* |
|||
|
l |
long int* |
unsigned long int* |
double* |
wchar_t* |
long int* |
|
|
ll |
long long int* |
unsigned long long int* |
long long int* |
|||
|
j |
intmax_t* |
uintmax_t* |
intmax_t* |
|||
|
z |
size_t* |
size_t* |
size_t* |
|||
|
t |
ptrdiff_t* |
ptrdiff_t* |
ptrdiff_t* |
|||
|
L |
long double* |
小甲鱼温馨提示:因为整理自官方文档,所以出现了很多暂时你还不认识的东东,不用怕,暂时忽视他们即可……
2、... 附加参数
该参数的个数由格式化字符串决定。
每个参数均为一个存储空间,并与面格式化字符串中占位符的类型和位置一一对应。
如果是一个普通的变量名,应在其名字前边加上 & 符号。
返回值:
如果函数调用成功,返回值是成功获取并填充到附加参数中的个数。
如果函数调用失败,返回值小于附加参数的个数(甚至是 0)。
如果读取到标准输入流的结尾处,则返回 EOF。
演示:
#include <stdio.h>
#include <stdlib.h>
int main(void)
{
FILE *fp;
int year, month, day;
if ((fp = fopen("file.txt", "r")) == NULL)
{
printf("打开文件失败!\n");
exit(EXIT_FAILURE);
}
fscanf(fp, "%d-%d-%d", &year, &month, &day);
printf("%d-%d-%d\n", year, month, day);
fclose(fp);
return 0;
}




