| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 790 人关注过本帖, 1 人收藏
标题:求大神指导,关于fscanf函数用法,晕了。
只看楼主 加入收藏
shanexia
Rank: 1
等 级:新手上路
帖 子:36
专家分:0
注 册:2013-11-17
结帖率:40%
收藏(1)
已结贴  问题点数:20 回复次数:10 
求大神指导,关于fscanf函数用法,晕了。
fscanf、fprintf函数都是格式化输入输出,都是对文件的输入输出操作。

它们的用法如下:
fscanf(文件指针,格式字符串,输入表列);
fprintf(文件指针,格式字符串,输出表列);
例如:
    fscanf(fp1,"%d%s",&i,s);
    fprintf(fp2,"%d%c",j,ch);


对以上例子分析,我的理解是,fscanf函数是从stdin 即键盘输入中获取数据到fp1,fprintf则对*fp2输出到stdout,所以fscanf(stdin)必与fprintf(fp)结合起来用,而fscanf(fp)必与fprintf(stdout)结合起来用。为此,我专门翻了下书,书上的例子貌似也是这样,但是我又查看了下,百科上可以直接运用fscanf和fprintf函数对文件指针进行操作。所以,我困惑了。

这两个函数不像fread 和 fwrite函数明确指定了文件流向。

我就搞不懂fscanf 以及 fprintf函数文件流向是什么样的,从哪儿流到哪儿?

谢谢大神回答。ps:翻了很多书,但是云里雾里。
搜索更多相关主题的帖子: 字符串 键盘 
2014-04-09 17:34
TonyDeng
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:贵宾
威 望:304
帖 子:25859
专家分:48889
注 册:2011-6-22
收藏
得分:7 
帶f開頭的這類函數,f表示文件流,都是從流中讀取數據的,所謂的“流”,就是數據流,磁盤文件是典型的流,其實這個概念從古老的磁帶機而來。而stdin/stdout是一種獨特的流(被映射到標準輸入輸出設備),scanf()/printf(),實際上就是省略了fp參數的fscanf()/fprintf(),因爲固定了此處的fp是stdin/stdout,用fscanf(stdin,……)或fprintf(stdout,……),就是scanf()/printf(),如果你翻看stdio.h頭文件,就能看到scanf()/printf()實際上是宏,它根本上就是fscanf()/fprintf()。

“流”數據,類似於水流,水流是水滴依次通過的,故這裡的數據也是依次串流進出的,不能跳躍,讀取或寫入數據之前,必須先把前面的讀了或寫入,就是這種流模式的基本特點。流數據有如水池(這個水池是有順序的,按灌入時的順序),數據緩衝區中的數據儲存在水池中,當讀寫的時候,就從水管中依次流出。如果你用杯子接水,接滿或不接了,水池中的水仍有存留,待下一个杯子來接——這就是scanf()總發生莫名其妙問題的原因,所謂清空緩存,也是這個道理(清不清視實際需要而定)。

[ 本帖最后由 TonyDeng 于 2014-4-9 18:02 编辑 ]

授人以渔,不授人以鱼。
2014-04-09 17:50
shanexia
Rank: 1
等 级:新手上路
帖 子:36
专家分:0
注 册:2013-11-17
收藏
得分:0 
回复 2楼 TonyDeng
那么fscanf是从fp文件里读取数据到i,s还是  从i s读取数据到 fp文件呢?重点是我不知道流向,从哪个文件读取,然后将数据流放到哪个文件?
2014-04-09 20:27
TonyDeng
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:贵宾
威 望:304
帖 子:25859
专家分:48889
注 册:2011-6-22
收藏
得分:0 
以下是引用shanexia在2014-4-9 20:27:44的发言:

那么fscanf是从fp文件里读取数据到i,s还是  从i s读取数据到 fp文件呢?重点是我不知道流向,从哪个文件读取,然后将数据流放到哪个文件?

前者。你參看函數的使用手冊啊,fscanf()的參數,是從流對象fp中讀取數據,賦値給後面的各個接收變量,與scanf()的用法是一樣的。scanf()祗是把標準輸入設備stdin作為fp!

授人以渔,不授人以鱼。
2014-04-09 20:49
TonyDeng
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:贵宾
威 望:304
帖 子:25859
专家分:48889
注 册:2011-6-22
收藏
得分:0 
學C,平時養成用fscanf()/fprintf()的習慣比用scanf()/printf()好,具體有何好處,將來你就知道了,主要是能夠輕易改變讀寫設備,而不受標準輸入輸出設備的局限,把從控制臺讀寫的操作瞬間轉變為向文件讀寫。

致於數據流的方向,像f*這樣的函數,是從流文件讀寫,還有s*類的、c*類的,很多,分別是像緩衝區和控制臺讀寫,方向視讀(scan)還是寫(print)而定,讀是從最前面的參數中取數給後面的參數,寫是從後面的參數取數到前面的參數。

順便提一下:這類末尾有f的函數,那個f是“格式”的意思,即format,是格式化讀寫。

授人以渔,不授人以鱼。
2014-04-09 20:59
shanexia
Rank: 1
等 级:新手上路
帖 子:36
专家分:0
注 册:2013-11-17
收藏
得分:0 
回复 5楼 TonyDeng
恩。谢谢大神指导。一句话就把我心中的疑惑解开了。我也问了好多人,都说不到点子上。
谢谢。
2014-04-09 21:20
shanexia
Rank: 1
等 级:新手上路
帖 子:36
专家分:0
注 册:2013-11-17
收藏
得分:0 
回复 2楼 TonyDeng
神!!
我想问一下,我什么时候才能修炼到您这样的境界?
您花了多长时间学习C语言啊?
2014-04-09 21:23
shanexia
Rank: 1
等 级:新手上路
帖 子:36
专家分:0
注 册:2013-11-17
收藏
得分:0 
我用scanf函数确实时常发生问题。
2014-04-09 21:27
fl8962
Rank: 11Rank: 11Rank: 11Rank: 11
等 级:贵宾
威 望:14
帖 子:539
专家分:2471
注 册:2012-10-17
收藏
得分:7 
回复 8楼 shanexia
临渊羡鱼,不如退而结网。你多久能达到他的水平,取决于你花多大的功夫。跟他学了多久有什么关系?

想抽苏烟了。
2014-04-09 22:31
TonyDeng
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:贵宾
威 望:304
帖 子:25859
专家分:48889
注 册:2011-6-22
收藏
得分:0 
這些是與語言無關的,不是學C就能懂的,因爲這些東西其實是計算機原理的知識,早期的計算機就是用這樣的輸入輸出設備,像紙帶穿孔機之類,數據祗能一個串著一個地流進流出,故C語言早期開發的函數都是這種模式,暸解了那些古老的歷史,就能知道這些函數為什麽是這個樣子,但在今時今日的環境,這些東西仍有多少保留下來、又有多少新的模式,是與時俱進的,不是學語言的時候學的。諸如scanf()/printf()這類庫函數,其實祗是前人寫好了一些有用的函數,並非語言本身就有的東西,後人如果覺得這些函數好用,用之可也,若覺不好用,另外找到好用的用就是了,若仍找不到好用的,就直接自己寫個好用的(學編程的最終目的就是自己能夠做工具自我生產和擴張)。沒有人說非要用標準庫的函數不可,更不是說什麽衹有用標準庫的東西才是正宗啥啥語言,諸如scanf()是標準的、scanf_s()是不標準的之類,都是放狗屁,K&R開創這門語言的初衷,並沒有後代徒子徒孫那麽食古不化,這門語言的精髓,就是它刻意不固定很多規則,甚至連內置的輸入輸出功能都沒有,正因爲沒有內置的輸入輸出,所以才允許無數的具體輸入輸出方案,都可納入此語言的供應庫中,這才是人家說C語言強大的正解——世界上根本就沒有什麽正宗的C語言,正如沒有正宗的《聖經》一樣。我要說的是,你即使花了巨大的精力弄懂了scanf()/printf()等等函數的用法,也不等於就是懂了這門語言,編程不是這樣學的。

[ 本帖最后由 TonyDeng 于 2014-4-10 18:11 编辑 ]

授人以渔,不授人以鱼。
2014-04-10 17:56
快速回复:求大神指导,关于fscanf函数用法,晕了。
数据加载中...
 
   



关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.036204 second(s), 7 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved