fscanf 是 C 语言标准库 stdio 头文件里面的格式化读取函数,作用是从已经打开的文件流里面,按照指定格式字符串,把文件里的数据解析之后存入对应的变量地址,它和 scanf 用法逻辑非常相似,最大区别是 scanf 从键盘标准输入读取,fscanf 增加了第一个参数文件指针,从文件里面读取,函数返回值代表成功匹配并且赋值的数据项个数,如果读到文件末尾返回 EOF,很多初学者写文件读取程序出错,大多是忘记传文件指针,忘记变量取地址,或者格式串和文件实际内容不匹配,导致读取失败,这个函数在数据文件解析批量读数字读取文本表格类数据场景使用非常广泛,属于 C 语言文件操作核心函数。
函数原型与头文件
函数原型
int fscanf (FILE stream, const char format, ...)
头文件 stdio.h
参数说明
stream 已经通过 fopen 打开成功的文件指针,如果这个指针无效函数直接失败
format 格式控制字符串,和 scanf 的格式符规则一致,比如 d i f s c x 等
可变参数列表 接收读取结果的变量,必须传入变量的内存地址
返回值 成功读取赋值的项目数量,读取失败或者到达文件末尾返回 EOF,一般定义为负数值
核心格式符说明
| 格式符 | 读取数据类型 | 说明 |
|---|---|---|
| %d | 十进制整数 | 读取整型数据 |
| %f | 单精度浮点数 | 读取 float 类型 |
| %lf | 双精度浮点数 | 读取 double 类型 |
| %s | 字符串 | 读取连续非空白字符,遇到空格换行停止 |
| %c | 单个字符 | 可以读取空格换行等空白字符 |
| %x | 十六进制整数 | 读取十六进制数据 |
完整调用步骤
第一步 引入头文件 stdio.h
第二步 使用 fopen 打开目标文件,选择只读模式 r,判断 fopen 返回值是否为空,防止文件不存在打开失败
第三步 定义用来保存读取结果的变量
第四步 调用 fscanf,传入文件指针 格式字符串 变量地址
第五步 判断 fscanf 返回值,确认读取成功数量,循环读取的时候可以利用返回值或者 EOF 作为循环终止条件
第六步 读取完成之后调用 fclose 关闭文件流
基础示例代码逻辑
FILE fp = fopen ("data.txt", "r");
if (fp == NULL)
{
printf ("文件打开失败");
return 1;
}
int num;
fscanf (fp, "% d", &num);
fclose (fp);
循环批量读取写法
处理文件里面多行连续数据的时候,经常把 fscanf 放在 while 循环里面,典型写法
while (fscanf (fp, "% d", &num) != EOF)
{
处理读到的 num 数据
}
这个写法会一直读取,直到读到文件末尾,适合批量读取同类型数据。
重点易错点
第一 可变参数必须传地址,整型浮点变量前面要加取地址符 &,忘记 & 是最常见 bug,程序会出现随机崩溃或者数据异常
第二 格式字符串必须和文件内真实内容匹配,如果文件里面是逗号分隔数据,格式串就要写上逗号,比如 % d , % d,否则解析错位
第三 % s 读取字符串不会自动处理空格,遇到空白就停止,如果字符串本身带空格,不能直接用 % s
第四 fscanf 读取的时候会自动跳过空格换行制表符这类空白分隔符,但是格式串里面写的普通字符,必须和文件内容严格匹配
第五 读取失败之后文件指针位置会停留在出错位置,不会自动跳转到下一行,后续继续读取会持续出错
第六 fscanf 属于格式化解析,相比 fgets 逐行读取,容错能力偏弱,文件内容格式一旦变动就容易解析失败
fscanf 和 scanf 对比
| 对比项 | fscanf | scanf |
|---|---|---|
| 输入来源 | 文件流 | 键盘标准输入 stdin |
| 第一个参数 | FILE 文件指针 | 无,默认 stdin |
| 格式规则 | 完全一致 | 完全一致 |
| 返回值规则 | 一致 | 一致 |
整体来看,fscanf 本质就是把 scanf 的输入源从键盘改成文件,核心要点就是文件指针有效,变量传地址,格式串匹配文件内容,用返回值判断读取状态,适合结构化文本文件的数据读取,但是面对格式不稳定的文本,优先考虑 fgets 加 sscanf 组合方案,稳定性更好。
【常见问题】
问题 1 fscanf 函数返回 EOF 代表什么含义
回答 1 fscanf 函数返回 EOF 代表已经读到文件末尾,或者本次读取发生错误,循环读取文件的时候一般把这个返回值作为终止条件,是 fscanf 函数非常重要的返回特征。
问题 2 fscanf 函数读取变量为什么一定要加取地址符号
回答 1 fscanf 函数需要把读取的数据写入变量内存空间,所以 fscanf 函数调用的时候必须传入变量地址,也就是添加 &,如果不传地址,fscanf 函数无法正确写入数据,会引发程序异常。
问题 3 fscanf 函数和 scanf 函数主要差别是什么
回答 1 fscanf 函数是从文件流读取数据,第一个参数需要传入 FILE 文件指针,scanf 函数是从键盘标准输入读取,不需要文件指针,二者格式控制规则和返回值机制保持一致,这是 fscanf 函数最核心的区分点。
问题 4 fscanf 函数读取字符串遇到空格为什么会中断
回答 1 fscanf 函数里面 % s 格式符默认把空格换行制表符当成分隔符,所以 fscanf 函数读取字符串遇到空白字符就停止读取,想要读取带空格的整行文本不适合直接使用 % s。
【免责申明】
本文为 C 语言 fscanf 函数通用用法讲解,不同编译器标准库实现细节可能存在细微差异,实际开发请参考对应编译器官方文档,本文仅作为学习参考,不替代正式教材与课程教学内容。
本文来自作者[烟火生活识见]投稿,不代表万里行信息网立场,如若转载,请注明出处:https://www.wlx315.cn/shcs/202611/7752.html
评论列表(4条)
我是万里行信息网的签约作者“烟火生活识见”!
希望本篇文章《fscanf 函数的用法介绍 文件格式化读取详解》能对你有所帮助!
本站[万里行信息网]内容主要涵盖:生活百科,小常识,生活小窍门,知识分享
本文概览:fscanf 是 C 语言标准库 stdio 头文件里面的格式化读取函数,作用是从已经打开的文件流里面,按照指定格式字符串,把文件里的数据解析之后存入对应的变量地址,它和 scanf 用法逻辑非常相似,最大区别是 scanf 从键盘标准输入读取,fscanf 增加了第一个参数文件指针,从文件里面读取,函数返回值代表成功匹配并且赋值的数据项个数,如果读到文件末尾返回 EOF,很多初学者写文件读取程序出错,大多是忘记传文件指针,忘记变量取地址,或者格式串和文件实际内容不匹配,导致读取失败,这个函数在数据文件解析批量读数字读取文本表格类数据场景使用非常广泛,属于 C 语言文件操作核心函数。