C++ fscanf() 从文件读取格式化输入
fscanf() 原型
int fscanf(FILE* stream, const char* format, ...);
fscanf()
函数从文件流中读取数据并将值存储到相应的变量中。
它定义在 <cstdio>
头文件中。
fscanf() 参数
stream
:用于读取数据的输入文件流。format
:指向以空字符结尾的字符串的指针,该字符串指定如何读取输入。它由以 % 开始的格式说明符组成。
格式字符串包含以下部分:
非空格字符
(除 % 之外),每个字符都消耗输入流中的一个相同字符。如果流中的下一个字符不等于该字符,则函数可能失败。空格字符
:所有连续的空格字符被视为单个空格字符。此外,'\n'、'\t' 和 ' ' 被视为相同。转换规格说明符
:遵循以下格式:- 初始的 % 字符,指定开始
- 可选的 *,称为抑制赋值字符。如果存在此字符,
fscanf()
不会将结果赋值给任何接收参数。 - 可选的正整数,指定最大字段宽度。它指定
fscanf()
在执行当前转换规格时允许消耗的最大字符数。 - 可选的长度修饰符,指定接收参数的大小。
- 转换格式说明符。
格式说明符 | 描述 |
---|---|
% | 匹配字面上的 % |
c | 匹配单 个字符或多个字符。如果定义了宽度,则匹配恰好宽度字符。 |
s | 匹配连续的非空格字符。如果定义了宽度,则匹配恰好宽度字符或直到找到第一个空格为止。 |
[set] | 匹配给定字符集中非空的字符序列。如果 set 开头有 ^,则匹配不在集合中的所有字符。 |
d | 匹配十进制整数。 |
i | 匹配整数。 |
o | 匹配无符号八进制整数。 |
X 或 x | 匹配无符号十六进制整数。 |
u | 匹配无符号十进制整数。 |
A 或 a, E 或 e, F 或 f, G 或 g | 匹配浮点数。 |
n | 返回到目前为止读取的字符数。 |
p | 匹配实现定义的字符序列,定义一个指针。 |
因此,格式说明符的一般格式为:%[*][width][length]specifier
…
: 其他额外参数用于接收数据。它们按照格式说明符的顺序出现。
fscanf() 返回值
- 成功时,
fscanf()
函数返回成功赋值的接收参数数量。 - 如果在第一个接收参数被赋值之前发生匹配失败,返回零。
- 如果在第一个接收参数被赋值之前发生输入失败,返回 EOF。
示例:fscanf() 函数如何工作
#include <cstdio>
int main()
{
FILE *fp;
char name[50];
int age;
fp = fopen("example.txt", "w");
fprintf(fp, "%s %d", "Tim", 31);
fclose(fp);
fp = fopen("example.txt", "r");
fscanf(fp, "%s %d", name, &age);
fclose(fp);
printf("你好 %s,你的年龄是 %d 岁\n", name, age);
return 0;
}
当你运行程序时,可能的输出将是:
你好 Tim,你的年龄是 31 岁