C stdio fscanf() 函数
示例
从文件读取字符串
FILE *fptr;
fptr = fopen("filename.txt", "r");
char output[50];
fscanf(fptr, "%49s", output);
printf("%s", output);
fclose(fptr);
定义和用法
The fscanf()
函数从文件中读取格式化数据并将其写入参数指定的内存位置,然后将位置指示器移动到它停止读取的文件位置。
The fscanf()
函数在 <stdio.h>
头文件中定义。
format 参数是一个字符串,描述了预期从文件中读取的数据格式。如果文件内容与格式不匹配,则函数会在第一次不匹配发生时停止读取。
格式说明符
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
- 必需。指示如何解释文件数据的字符或序列。可能的说明符列表如下表所示。
说明符列表
字符 | 说明符 | 描述 |
---|---|---|
i 或 u |
整数 | 读取数字序列并将其解释为整数。如果序列以“0x”开头,则它期望十六进制数字(0-9 和 A-F)。如果序列以“0”开头,则它期望八进制数字(0-7)。序列前面可以有符号(“+”或“-”)。 |
d |
十进制整数 | 读取数字序列(0-9)并将其解释为整数。序列前面可以有符号(“+”或“-”)。 |
o |
八进制整数 | 读取数字序列(0-7)并将其解释为八进制整数。序列前面可以有符号(“+”或“-”)。 |
x |
十六进制整数 | 读取数字序列(0-9 和 A-F)并将其解释为十六进制整数。它可以以“0x”开头。序列前面可以有符号(“+”或“-”)。 |
f 、e 、g 或 a |
浮点数 | 读取有效的字符序列并将其解释为浮点数。有效的序列至少包含一个数字,它可以以符号(“+”或“-”)开头,后面可以跟着小数点和小数位。还可以使用科学计数法(一个数字后跟“e”或“E”和一些数字)。 |
c |
字符 | 从文件中读取一个字符。如果指定了宽度,则读取该数量的字符。 |
s |
字符串 | 读取文件中直到下一个空格(空格、制表符、换行符)的所有字符。写入参数的值将附加一个额外的 \0 空终止字符。 |
p |
指针 | 读取表示指针地址的字符序列。 |
n |
无输入 | 没有从文件中读取任何内容。到目前为止已读取的字符数写入参数中。该参数必须是指向整数的指针。 |
% |
百分号 | 从文件中读取一个字符,期望为“%”符号。此说明符不与任何参数关联。 |
[characters] |
字符集 | 读取一个与characters中指定的字符之一匹配的字符。 |
[^characters] |
排除字符集 | 读取一个不在characters中指定的字符集中的字符。 |
有关如何使用格式说明符的示例,请参见下面的“更多示例”。
语法
fscanf(FILE * fptr, const char * format, arg1, arg2...);
参数值
参数 | 描述 |
---|---|
fptr | 必填。文件指针,通常由 fopen() 函数创建。 |
格式 | 必填。表示从文件中读取的数据格式的字符串。 |
arg1, arg2... | 可选。任意数量的其他参数,它们是指向可以写入值的内存的指针。 |
技术细节
返回值 | 一个 int 值,表示写入的参数数量。如果发生错误,则返回常量 EOF 。 |
---|
更多示例
示例
从包含序列“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);
示例
从文件中读取一个十六进制数并输出其十进制值
FILE *fptr;
fptr = fopen("filename.txt", "r");
int num;
fscanf(fptr, "%x", &num);
printf("%d", num);
fclose(fptr);
示例
在文件的下一个字符中搜索“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);