跳到主要内容

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