浅谈scanf、fscanf、sscanf的使用和区别
下面浅谈了sscanf和fscanf的用法和自己的一些理解
文章目录
- 流
- fscanf的使用
- sscanf的使用
- 总结
函数的参数对比
(三个函数的头文件都是stdio.h)
流
讲三个函数前 先得明白流大概是个什么东西
我们写的程序经常要和硬件交流 常见的有 光盘 键盘 屏幕 软盘等
硬件不同 读写方式自然不同 沟通的方式也不同
那我们岂不是要学很多种"语言"
为了解决这种情况便出现了流 有点像水流 也有点像介质
于是我们便不用学那么多"语言"了 ,只用注意流这一种"语言"就行了!
(个人理解:可以理解成数据转为了流 各种硬件有自己理解流的方式,而我们使用时只要注意流 不用关心硬件怎么理解流)
流也分文件流、标准输入流、标准输出流等
流是个高度抽象的概念,使用的多了自然就有自己的理解
fscanf的使用
fscanf与scanf对比只多了一个FILE*的指针
fscanf(stdin,...)等同于scanf(...)
stdin是标准输入流 也就是键盘 本质也是一个文件流
fscanf的作用:从文件中读入数据 赋值给变量
例:
右边是文件里的信息…
运行结果:
注:避免从文件中读入中文 会出现乱码的情况
中文的编码不是单纯的ASCII码 中文有自己的编码标准
如果想要成功读取 就要改一下编码规则
这里以txt为扩展名的文件为例
把文本文件的UTF-8改为ANSI即可成功读取(这是大佬解决的,牛哇牛哇
)
前后两次的对比
上面的例子中给结构体成员赋值了 同理也可以给各种类型的变量赋值
官方一点:将文件中的数据格式化后输入
sscanf的使用
sscanf和scanf对比只多了一个buffer指针
官方点:从一个字符串中读入格式化的数据
简单点:从字符串中读入要的数据 (这也是为什么参数必须时字符指针的一个原因)
默认读入是从stdin中读入,在这读入来源改成了字符串而已.
问:ccl is a good man 提取出里面的每个单词(有很多办法实现切割,这里用sscanf试试)
别问ccl是谁
换个角度看:把a作为读入的来源 把数据读入了tmp五个数组里(初始化了五个tmp字符数组)
再举个例子
这里把字符串里的字符转为了数字,或者说初始化了三个tmp
sscanf常用操作传送门
总结
sscanf和fscanf不过是比scanf多了一个参数罢了
fscanf多了一个文件流 (stdin和stdout本质也是文件流)
sscanf多了一个字符指针
可以把这个不同的参数看作"源"
从源里面拿数据,再转换为其他类型的数据(格式化成别的类型的数据)
前提是数据类型合法
sscanf可以实现切割字符串等常见的字符串操作
fscanf可以让我们从文件中拿到想要的数据
言而总之,sscanf和fscanf让我们得到数据的方法多样化 毕竟原来你只能从键盘(stdin)输入数据
如果有启发的话,留个赞再走吧,这对我帮助很大!
不点?
李连旺874: 返回值没有介绍
mj_爱吃肉: 太用心了,加油加油
喜欢乙醇的四氯化碳: everything直接网上搜下载就行,下载好找到对应的文件删掉应该就可以了
FILMUSIC: 老师我也需要请问可以分享给我吗
喜欢乙醇的四氯化碳: 已纠正