首页 > 宝藏问答 >

问 fscanf 函数的用法 C 语言文件读取

2026-11-06 23:26:42
最佳答案

答

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 函数编程学习科普,不同编译器标准库实现细节会存在微小差异,本文仅用于编程学习参考,不代表所有编译环境下唯一行为标准。