首页 > 编程笔记

C语言fscanf():从文件中格式化读取数据

fscanf() 是 C语言标准库中的函数,定义在<stdio.h>头文件中。

fscanf() 用于从指定文件格式化读取数据,函数的原型如下:

int fscanf(FILE *stream,const char *format[,argument...]);

参数

1、stream

文件指针,指向要读取的目标文件。

2、format

由格式说明、空白字符与非空白字符构成。

1) 格式说明:指示了参数 argument 的输入格式,它由 % 开头,后面跟格式字符,格式字符前也可以有其他修饰符。格式说明的一般格式如下。
%[*][width][modifiers]格式字符
其中,格式字符及说明如下表所示。

格式字符 说明
c 单个字符
d 或 i 十迸制整数
e、E、f、g、G 浮点数
u 无符号十进制整数
o 无符号八进制整数
x 或 X 无符号十六进制整数
s 字符串
p 内存地址
[...] 匹配指定的字符,可以用连字符 - 表示某个范围内的字符,例如 %[a-z] 表示读取 abc...xyz 范围内的字符、%[0-9] 表示读取 012...789 范围内的字符等
[^...] 不匹配指定的字符,可以用连字符 - 表示某个范围内的字符,例如 %[^0-9] 表示匹配除十进制数字以外的所有字符,遇到十进制数字就停止读取。

格式字符前面的修饰符及说明如下表所示。

修饰符 说明
* 跳过读入的数据,不存入对应的参数 argument 中
width 指定输入数据所占用的宽度
modifiers 指定由 d、i、x、X、0、u、e、f、g 说明的字符的大小
h:短整型或无符号短整型
l:长整型或无符号长整型或双精度浮点型
L:长双精度类型

2) 空白字符:可以使 fscanf() 函数忽略输入的一个或多个空白字符。空白字符可以是空格、制表符或换行符。实际上,fscanf() 函数读入空白字符但是并不存储它们。

3) 非空白字符:fscanf() 函数读入并删除与该字符相同的字符。如果读入的字符与格式控制中的非空白字符不匹配,则停止读入。

3、argument

变量地址列表,用来存放读取的数据,与 format 指向的格式字符一一对应。

返回值

如果调用成功,则函数返回实际读取的字符个数;如果读取操作失败,则返回 EOF。

实例

下面是一个 C语言 fscanf() 函数的示例程序,从名为 "input.txt" 的文件中读取三个整数,并打印它们的总和。
#include <stdio.h>

int main() {
    FILE *file = fopen("input.txt", "r");
    if (file == NULL) {
        printf("无法打开文件!\n");
        return 1;
    }

    int a, b, c;
    if (fscanf(file, "%d %d %d", &a, &b, &c) == 3) {
        printf("读取的整数: %d, %d, %d\n", a, b, c);
        printf("总和: %d\n", a + b + c);
    } else {
        printf("读取失败或格式不正确!\n");
    }

    fclose(file);
    return 0;
}
在这个示例中,我们尝试从 "input.txt" 文件中读取三个整数。如果成功,我们打印它们的值和总和;否则,我们打印一个错误消息。

总结

fscanf() 函数的作用与 scanf() 函数类似,区别在于 fscanf() 函数从指定的文件中格式化读取数据,而 scanf() 函数则通过键盘格式化读取数据。

fscanf() 函数经常与 fprintf() 函数配合使用,使用 fscanf() 函数读取文件中的数据时,必须保证写入文件的格式与读取文件的格式一致,否则会发生读取数据错误。

推荐阅读