首页 >> 资讯 > 甄选问答 >

问c 语言 fscanf 函数使用 文件读取详解

2026-11-08 10:55:19

答

c 语言 fscanf 函数是 stdio 头文件提供的格式化读取函数,核心功能是从已经打开的文件流里面,按照指定格式规则读取数据,并且把读到的数据存入对应的变量地址,它和 scanf 逻辑几乎一样,区别是 scanf 读取来源是键盘标准输入,fscanf 读取来源是 FILE 指针指向的文件,函数返回值是成功匹配并且赋值的数据项个数,如果读到文件末尾会返回 EOF,这个返回值非常重要,一般用来做循环读取判断,很多初学者写文件读取死循环,就是没有判断 fscanf 返回值,没有识别文件结束标记。之所以要用 fscanf,是因为文本文件里面的数据是按文本形式保存,比如数字字符串混合排版,普通 fgetc fgets 只能按字符或者整行读取,想要自动识别整数浮点数字符串,就需要 fscanf 依靠格式控制符自动解析,适合读取配置文件 数据清单这类结构化文本。实际使用第一步引入 stdio.h 头文件,第二步用 fopen 打开文件,拿到 FILE 指针,一定要判断打开是否成功,第三步定义接收数据的变量,准备好格式控制字符串,第四步调用 fscanf 传入 FILE 指针 格式串 变量地址,第五步根据返回值判断读取是否成功,循环读取多行数据,第六步读取完成之后调用 fclose 关闭文件流,最后做好异常处理,比如格式不匹配的时候文件指针会停留在出错位置,后续读取全部错乱,这点一定要在程序里面做容错处理。

一 函数原型

int fscanf (FILE stream, const char format, ...)

参数说明

stream 已经打开的文件指针,由 fopen 返回

format 格式控制字符串,和 scanf 格式符规则一致

后面可变参数 全部是变量的内存地址,也就是必须加取地址符 &

返回值 成功赋值项数量,读取失败或者到达文件末尾返回 EOF

二 常用格式控制符清单

% d 读取十进制整数

% f 读取单精度浮点数

% lf 读取双精度浮点数

% c 读取单个字符,不会跳过空格回车

% s 读取字符串,遇到空格回车制表符就停止

% x 读取十六进制整数

%% 匹配文件里面百分号本身

三 基础代码示例

include

int main()

{

FILE fp;

int num;

float val;

fp = fopen("data.txt", "r");

if(fp == NULL)

{

printf("文件打开失败\n");

return -1;

}

while(fscanf(fp, "%d %f", &num, &val) == 2)

{

printf("%d %.2f\n", num, val);

}

fclose(fp);

return 0;

}

四 核心重点原理

1 空白匹配规则 格式串里面的空格,可以自动跳过文件里面任意数量空格 回车 换行符,这个特性非常适合读取每行固定格式文本

2 格式不匹配问题 如果文件实际内容和格式控制符不一致,fscanf 会停止匹配,文件位置指针停留在出错位置,后面继续读取都会异常,这是 fscanf 最常见 bug 来源

3 % s 读取限制 % s 读取字符串遇到空白就终止,如果文件里面一行字符串本身带空格,不能直接使用 % s,需要改用其他读取方式

4 文件指针移动 fscanf 每成功读取一段数据,文件读写指针自动向后移动,不需要手动调用 fseek

5 类型匹配 读取 double 必须用 % lf,如果误用 % f 会出现数据错乱,这个是高频错误点

五 fscanf 和 scanf 对比表

对比项目c 语言 fscanf 函数使用scanf
读取数据源FILE 文件流键盘标准输入 stdin
函数首参数需要传入文件指针不需要文件指针
返回值含义成功赋值项数量或者 EOF成功赋值项数量或者 EOF
主要用途读取文本文件结构化数据控制台交互输入
错误排查还要额外排查文件打开失败只需要排查键盘输入格式

六 进阶注意事项

1 读取混合类型数据的时候,一定要提前确认文件原始排版,逗号 冒号这类分隔符,需要写进格式控制字符串里面,比如 fscanf (fp,"% d,% f",&a,&b),对应文件内容是数字逗号浮点数

2 不要用 fscanf 读取二进制文件,fscanf 是文本解析函数,二进制文件请使用 fread

3 循环读取推荐判断返回值等于预期项数,不要单纯判断不等于 EOF,因为中途格式错误的时候返回值会小于预期项数,不等于 EOF,会造成无限循环

4 读取大文件的时候 fscanf 解析速度比 fread 慢,性能要求高的场景需要考虑替换方案

【常见问题】

问题 1 c 语言 fscanf 函数使用的时候为什么会出现死循环

回答 1 c 语言 fscanf 函数使用出现死循环,一般是文件里面某一行数据格式和格式控制符不匹配,fscanf 读取失败但是还没有到达文件末尾,返回值不是 EOF,如果循环条件只判断不等于 EOF,程序就会卡在错误位置反复读取,使用 c 语言 fscanf 函数使用的时候,循环条件应当判断返回值等于预期读取项数量。

问题 2 c 语言 fscanf 函数使用读取 double 变量格式符写 % f 可以吗

回答 2 c 语言 fscanf 函数使用读取 double 类型变量,不能写 % f,必须使用 % lf,% f 对应的是 float 类型,如果混用,c 语言 fscanf 函数使用的时候会出现内存数据错乱,打印出来数值异常,这是 c 语言 fscanf 函数使用高频错误。

问题 3 c 语言 fscanf 函数使用可以读取二进制文件吗

回答 3 c 语言 fscanf 函数使用是文本格式化解析函数,不适合读取二进制文件,二进制文件里面是原始字节,没有文本数字字符,c 语言 fscanf 函数使用解析会出错,二进制读取应当使用 fread 函数。

【免责申明】

本内容 c 语言 fscanf 函数使用讲解仅用于编程学习参考,不同操作系统编译器对 fscanf 容错行为存在细微差别,正式项目开发请遵循 ANSI C 标准并增加完整异常校验,因照搬示例代码造成文件读取错误数据错乱,使用者自行承担相关责任。

 

相关阅读

最新文章