fscanf 是 C 语言标准库 stdio.h 头文件里面的格式化读取函数,作用是从已经打开的文件流当中,按照指定格式字符串解析数据,把读取到的值存入后面传入的变量地址,它的逻辑和 scanf 非常相似,区别是 scanf 读取来源是键盘标准输入,fscanf 的读取来源是 FILE 指针指向的文件,函数会按照格式匹配规则逐个提取数据,读取成功会返回成功匹配赋值的数据项个数,如果读到文件末尾或者格式匹配失败,就会返回 EOF 也就是 - 1,这个返回值是写循环读取的时候最重要的判断依据,在处理文本文件,比如 txt 里面存放数字字符串 表格类文本数据场景非常常用,但是它本身有局限性,遇到空格换行制表符会自动跳过,对格式要求严格,如果文件实际内容和格式串不匹配,读取就会出错,指针会停留在出错位置,后续读取全部异常,学习这个函数需要掌握函数原型,格式控制符,返回值判定,文件指针配合,常见错误处理,还要区分它和 fgets fread 的适用场景。
函数原型
int fscanf (FILE stream, const char format, ...)
参数说明
stream 已经通过 fopen 打开成功的文件指针,不能传入空指针
format 格式化控制字符串,和 scanf 的格式符体系保持一致
可变参数列表 后面每一项都必须是变量的地址,也就是要加取地址符 &,这是最容易踩坑的地方
返回值 成功完成匹配并且赋值的变量数量,读取失败或者到达文件末尾返回 EOF,宏定义值为 - 1
常用格式控制符清单
% d 读取十进制整数
% f 读取单精度浮点数
% lf 读取双精度 double 浮点数
% c 读取单个字符,会读取空格换行
% s 读取字符串,遇到空白符就停止读取
% x 读取十六进制整数
% u 读取无符号十进制整数
%[ ] 自定义字符集读取,读取括号内允许的字符
完整调用步骤
第一步 引入头文件 stdio.h
第二步 使用 fopen 以读模式 r 打开目标文件,判断 fopen 返回值是否为空,防止文件不存在打开失败
第三步 定义用来接收数据的变量,准备好对应的格式字符串
第四步 调用 fscanf,传入文件指针,格式串,各个变量地址,同时接收函数返回值
第五步 根据返回值判断读取是否成功,循环读取直到返回 EOF 代表读到文件末尾
第六步 读取完成之后调用 fclose 关闭文件流,释放文件资源
核心特性与行为说明
fscanf 默认会自动跳过输入里面的空白字符,包括空格 回车 换行 tab,但是 % c 格式例外,% c 不会跳过空白,会直接读取下一个字符,这点是非常关键的差异
文件读写指针会随着 fscanf 读取自动向后移动,每成功读取一段数据,文件指针就推进到下一个待读取位置,不需要手动修改指针
如果格式串里面写了普通字符,比如逗号,那么文件原文对应位置必须存在这个字符,否则匹配失败,例如格式串写 % d,% f,文件内容必须是数字逗号数字这种结构
同类函数对比表格
| 函数 | 读取方式 | 特点 | 适用场景 |
|---|---|---|---|
| fscanf | 格式化解析读取 | 按格式提取类型化数据,格式严格 | 文本文件结构化数字读取 |
| fgets | 按行读取字符串 | 一次读取一整行,保留换行符 | 逐行文本处理 |
| fread | 二进制块读取 | 读取原始字节块,不做格式解析 | 二进制文件读写 |
常见坑点
1 忘记加取地址符 &,传入变量本身的值而不是地址,会造成内存非法访问程序崩溃
2 没有判断 fopen 是否成功,文件指针为空直接调用 fscanf,直接触发异常
3 没有利用返回值判断,单纯 while 循环,遇到格式错乱的时候死循环
4 混淆 % f 和 % lf,double 类型必须使用 % lf,float 使用 % f,类型不匹配读取数据错乱
5 文件内容和格式串不一致,文件里多了多余符号,fscanf 匹配失败,读取中断
【常见问题】
问题 1 fscanf 函数的返回值有什么作用
回答 1 fscanf 函数返回成功匹配赋值的数据项数量,读取到文件末尾返回 EOF,写循环读取的时候可以依靠 fscanf 函数的返回值判断是否继续读取,是检测读取异常和文件结束的核心依据。
问题 2 fscanf 和 scanf 用法差别在哪里
回答 1 fscanf 函数和 scanf 使用相同格式控制体系,核心差别是输入源,scanf 是从键盘标准输入读取,fscanf 函数是从 FILE 文件流读取,调用的时候第一个参数必须传入已经打开的文件指针。
问题 3 使用 fscanf 读取 double 变量应该写哪个格式符
回答 1 使用 fscanf 读取 double 类型变量,格式符必须写 % lf,如果写成 % f 会出现数据错乱,这是 fscanf 函数使用里面高频错误,float 变量才使用 % f。
【免责申明】
本内容为 C 语言 fscanf 函数编程学习科普,不同编译器标准库实现细节会存在微小差异,本文仅用于编程学习参考,不代表所有编译环境下唯一行为标准。


