亚洲免费av电影一区二区三区,日韩爱爱视频,51精品视频一区二区三区,91视频爱爱,日韩欧美在线播放视频,中文字幕少妇AV,亚洲电影中文字幕,久久久久亚洲av成人网址,久久综合视频网站,国产在线不卡免费播放

        ?

        C語言程序設(shè)計(jì)中文件操作部分的教學(xué)方法探討

        2017-02-27 01:22:20陳圣磊王紅霞劉林源
        計(jì)算機(jī)教育 2017年2期

        陳圣磊, 王紅霞, 劉林源

        (南京審計(jì)大學(xué) 電子商務(wù)系,江蘇 南京 211815)

        C語言程序設(shè)計(jì)中文件操作部分的教學(xué)方法探討

        陳圣磊, 王紅霞, 劉林源

        (南京審計(jì)大學(xué) 電子商務(wù)系,江蘇 南京 211815)

        學(xué)習(xí)C語言,不僅要求學(xué)生能夠掌握基本語法知識,學(xué)會寫程序,還應(yīng)該深入理解庫函數(shù)提供的功能是如何實(shí)現(xiàn)的,以達(dá)到與學(xué)過的語法知識融會貫通的目的。文章通過闡述在講解文件操作時(shí)如何呼應(yīng)已學(xué)過的知識點(diǎn),包括結(jié)構(gòu)體、函數(shù)和指針,從而加深對文件操作以及相應(yīng)語法知識點(diǎn)的理解。

        程序設(shè)計(jì);庫函數(shù);C語言;文件操作

        0 引 言

        C語言程序設(shè)計(jì)是計(jì)算機(jī)相關(guān)專業(yè)的一門學(xué)科基礎(chǔ)課,承擔(dān)著培養(yǎng)學(xué)生編程思想的重要任務(wù)。這門課程涵蓋了C語言的所有語法,包括數(shù)據(jù)類型與變量、流程控制結(jié)構(gòu)、數(shù)組、函數(shù)、指針和結(jié)構(gòu)體等。學(xué)習(xí)這些基本語法的目的有兩方面:一是學(xué)會寫程序;二是幫助學(xué)生讀懂庫函數(shù),深入理解庫函數(shù)提供的功能是如何實(shí)現(xiàn)的。第一個(gè)目的很容易理解,之所以提出第二個(gè)目的,是因?yàn)閹旌瘮?shù)的定義與調(diào)用涉及很多基本語法知識,在學(xué)習(xí)庫函數(shù)時(shí)如果能與這些語法點(diǎn)呼應(yīng)起來,就能達(dá)到融會貫通的目的。

        然而,目前的計(jì)算機(jī)教育對前一方面關(guān)注較多[13],而忽視了第二個(gè)方面。造成的結(jié)果是學(xué)生理解了流程控制、數(shù)組、函數(shù)和指針的用法,也能夠編寫簡單的程序,但是對程序的認(rèn)識僅限于教材上的例題,對庫函數(shù)提供的功能,如字符串處理、輸入輸出處理,理解不夠深入,未能把學(xué)過的語法知識學(xué)以致用,去理解這些函數(shù)。

        文件操作是在講解完基本語法后遇到的一個(gè)相對獨(dú)立的知識模塊,可以讓學(xué)生學(xué)會使用相關(guān)函數(shù)來處理文件讀寫的問題。那么在文件操作部分的教學(xué)中,不但要讓學(xué)生掌握如何使用這些函數(shù),還應(yīng)該把之前學(xué)習(xí)的語法貫穿到這些知識點(diǎn)中。

        1 文件類型

        我們一般使用文件類型FILE的方法是聲明FILE類型的指針變量,

        FILE* fp;

        當(dāng)同學(xué)們看到這句聲明時(shí),自然會想到FILE應(yīng)該是一個(gè)類型,那么這個(gè)類型究竟是怎么構(gòu)成的呢?

        其實(shí)教材對文件類型FILE講得比較清楚[4]333:每個(gè)被使用的文件都在內(nèi)存中開辟一個(gè)相應(yīng)的文件信息區(qū),用來存放文件的有關(guān)信息(如文件的名字、文件狀態(tài)及文件當(dāng)前位置等)。這些信息被保存在一個(gè)結(jié)構(gòu)體變量中,該結(jié)構(gòu)體的類型是由系統(tǒng)聲明的,取名為FILE。它的類型聲明為:

        從文件類型FILE的定義中,我們可以看到:

        (1)文件類型FILE是一個(gè)結(jié)構(gòu)體類型,由表示緩沖區(qū)大小、位置、讀寫控制等的字段組成,這可以呼應(yīng)到定義結(jié)構(gòu)體類型的語法。

        (2)FILE是用typedef定義的新類型,因此在使用FILE定義指針時(shí)不再需要struct關(guān)鍵字,這對應(yīng)到typedef關(guān)鍵字的用法。

        (3)上述定義是教材中給出的,我們還可以在VC++6.0中打開stdio.h文件,找到對FILE的定義:

        typedef struct _iobuf FILE;

        我們可以看到,在VC++6.0中,先定義了結(jié)構(gòu)體類型_iobuf,再由typedef關(guān)鍵字定義類型FILE。其中,字段_base表示緩沖區(qū)的開始位置,_ptr表示指針的指向,_bufsiz表示緩沖區(qū)的大小。

        因此,通過上述解釋,學(xué)生更容易理解FILE其實(shí)就是結(jié)構(gòu)體類型,這樣不僅加深了對FILE類型的理解,也通過這樣一個(gè)例子加深了對結(jié)構(gòu)體語法的理解。

        2 文件打開與關(guān)閉函數(shù)

        我們一般使用以下程序打開文件:

        其功能是按照只讀的方式打開文件,指針變量fp指向被打開的文件。除此之外,我們還可以對fopen函數(shù)作以下深層次的挖掘:

        (1)使用這個(gè)函數(shù)需要包含頭文件stdio.h。那么在講函數(shù)原型部分時(shí)說過,如果使用庫函數(shù),應(yīng)該使用#include指令包含相關(guān)的頭文件,如果使用用戶自定義的函數(shù),應(yīng)該添加對被調(diào)用函數(shù)的聲明。那么我們可以進(jìn)一步提出問題:這兩種方式之間有關(guān)聯(lián)嗎?頭文件中究竟是什么內(nèi)容呢?

        這里,我們可以在VC++6.0中打開頭文件stdio.h,查找fopen,結(jié)果發(fā)現(xiàn):

        _CRTIMP FILE * __cdecl fopen(const char *, const char *);

        其中,_CRTIMP是一個(gè)宏,表示使用動態(tài)C運(yùn)行時(shí)庫還是靜態(tài)連接的C運(yùn)行庫,__cdecl表示C語言默認(rèn)的函數(shù)調(diào)用方法,可以忽略。其余內(nèi)容就是函數(shù)的聲明了,返回值為FILE指針,兩個(gè)參數(shù)都是字符指針類型。

        通過查看頭文件,我們知道頭文件中其實(shí)就是函數(shù)的聲明。所以,所有的函數(shù)調(diào)用都需要函數(shù)聲明,只不過庫函數(shù)的聲明集中在頭文件中,因此只要用#include包含頭文件就可以了。

        (2)fopen函數(shù)的返回值為FILE指針類型。在函數(shù)部分講過返回指針值的函數(shù),但是比較簡略。返回指針值的函數(shù)涉及以下3個(gè)問題:

        ① 如果函數(shù)返回指針值,那么不能返回這個(gè)函數(shù)中局部變量的地址,因?yàn)榫植孔兞吭诤瘮?shù)調(diào)用結(jié)束時(shí)就釋放了,再引用這個(gè)地址就會帶來問題。比如:

        指針p指向funA函數(shù)中局部變量a,a的值為3,但是輸出*p的結(jié)果為4。這是由于在調(diào)用函數(shù)funA后,又調(diào)用函數(shù)funB,變量a的位置被重新分配變量b,b的值為4,所以此時(shí)輸出*p的結(jié)果為4。如果在主函數(shù)沒有調(diào)用funB,即刪除funB();這一行,則輸出*p的結(jié)果為3。由此可以看出,這種返回局部變量地址的做法存在很大的不確定性。其實(shí),上述程序在編譯時(shí)會產(chǎn)生警告:returning address of local variable or temporary(返回局部變量的地址)。因此,我們在編寫程序時(shí)應(yīng)當(dāng)避免這種情況。

        ② 被調(diào)用函數(shù)可以返回主調(diào)函數(shù)中變量的地址。教材[4]274例題8.25展示了這種情況,代碼如下:

        從上述代碼可以看出,search函數(shù)的參數(shù)pointer指向主函數(shù)中的二維數(shù)組score,返回值pt是基于pointer得到的一個(gè)地址,仍然指向二維數(shù)組score中的某個(gè)元素。因此這種情況通過參數(shù)傳遞數(shù)組名,返回的是主函數(shù)中數(shù)組里某個(gè)元素的地址,因此在子函數(shù)調(diào)用結(jié)束后不存在地址釋放的問題。要注意這種情況和①中程序是有區(qū)別的。

        ③ 函數(shù)fopen并沒有指針類型的參數(shù),那么為什么它返回指針類型的返回值就沒有問題呢?其實(shí)我們可以想象,fopen函數(shù)中應(yīng)該聲明一個(gè)FILE類型的變量,最后返回其地址。如果是普通局部變量,fopen函數(shù)返回時(shí)肯定會釋放的。那么什么樣的變量在函數(shù)結(jié)束時(shí)仍然不會釋放呢?我們在前面講過,??臻g變量會自動釋放,而堆空間變量是由程序員申請和釋放的,因此,這個(gè)變量就應(yīng)該是堆空間中動態(tài)分配的變量,由此呼應(yīng)到動態(tài)內(nèi)存分配的相關(guān)函數(shù)。

        可以想象,fopen函數(shù)的定義中應(yīng)該包含以下代碼:

        即該函數(shù)調(diào)用了malloc函數(shù),動態(tài)分配了sizeof(FILE)大小的空間,賦值給fp指針,最后返回fp的值。

        更進(jìn)一步,所有動態(tài)分配的空間都需要通過free函數(shù)釋放,那么在哪里調(diào)用free函數(shù)呢?我們強(qiáng)調(diào)在使用fopen函數(shù)打開文件進(jìn)行讀寫后,還應(yīng)該調(diào)用fclose函數(shù)關(guān)閉文件。因此可以想見,在fclose函數(shù)的定義中應(yīng)該包含以下代碼:

        因此,通過上述分析,學(xué)生不但掌握了打開關(guān)閉文件的方法,更深入理解了函數(shù)聲明、返回指針值的函數(shù)與動態(tài)內(nèi)存分配的相關(guān)問題。

        3 向文件讀寫字符串

        C語言允許通過函數(shù)fgets和fputs一次讀寫一個(gè)字符串,其中fgets函數(shù)的原型為[4]341:

        char* fgets(char *str, int n, FILE *fp);

        作用是從fp所指向的文件讀入一個(gè)長度為n-1的字符串,并在最后加一個(gè)‘

        无码久久精品蜜桃| 又大又粗又爽18禁免费看| 四川少妇大战4黑人| 国产激情久久99久久| 国产中文字幕亚洲综合| 国产视频一区二区在线免费观看| 精品无码无人网站免费视频| 无码人妻一区二区三区免费n鬼沢 人禽无码视频在线观看 | 男女真人后进式猛烈视频网站| 天天爽天天爽夜夜爽毛片| 亚洲伊人久久大香线蕉综合图片| 少妇特殊按摩高潮不断| 少妇免费av一区二区三区久久| 国产农村妇女精品一二区 | 阿v视频在线| 日韩一区三区av在线| 国产免费又爽又色又粗视频| 亚洲一本大道无码av天堂| 国产美女精品AⅤ在线老女人| 亚洲中文字幕一区二区在线| 亚洲欧美牲交| 精品人妻少妇一区二区不卡| 女优av福利在线观看| 国产三级久久精品三级91| 闺蜜张开腿让我爽了一夜| 麻豆久久五月国产综合| 亚洲国产天堂av成人在线播放| 影音先锋久久久久av综合网成人| 啪啪无码人妻丰满熟妇| 久久精品国产亚洲av大全相关| 五月婷婷开心五月播五月| 人妻精品久久无码区| a毛片全部免费播放| 国产一区二区精品久久呦| 红桃av一区二区三区在线无码av| 无码精品国产va在线观看| 亚洲av午夜成人片精品| av天堂手机免费在线| 天堂无码人妻精品av一区| 久久精品伊人无码二区| 亚洲精品国产av成拍色拍|