版權(quán)說(shuō)明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
C語(yǔ)言程序設(shè)計(jì)創(chuàng)建第一個(gè)C語(yǔ)言程序項(xiàng)目1“學(xué)生成績(jī)管理系統(tǒng)”中相關(guān)數(shù)據(jù)設(shè)計(jì)及簡(jiǎn)單處理項(xiàng)目2項(xiàng)目中學(xué)生成績(jī)的等級(jí)判定項(xiàng)目3項(xiàng)目中的設(shè)計(jì)數(shù)據(jù)處理及封面與菜單的初步項(xiàng)目4學(xué)生成績(jī)的分組匯總程序項(xiàng)目5利用數(shù)組完善項(xiàng)目中數(shù)據(jù)的處理項(xiàng)目6利用函數(shù)進(jìn)行項(xiàng)目的整體框架設(shè)計(jì)項(xiàng)目7利用結(jié)構(gòu)體實(shí)現(xiàn)項(xiàng)目項(xiàng)目8利用指針優(yōu)化項(xiàng)目項(xiàng)目9利用文件完善項(xiàng)目項(xiàng)目10項(xiàng)目10利用文件完善項(xiàng)目目標(biāo)TARGET知識(shí)目標(biāo)理解文件的概念。
掌握文件的基本操作。
掌握文本文件和二進(jìn)制文件的讀寫方法。
掌握文件的定位方法。目標(biāo)TARGET技能目標(biāo)學(xué)會(huì)使用文件進(jìn)行數(shù)據(jù)的存儲(chǔ)及處理。
能夠用文件完善學(xué)生成績(jī)管理系統(tǒng)。項(xiàng)目中學(xué)生數(shù)據(jù)的存儲(chǔ)和反復(fù)使用任務(wù)10.1任務(wù)10.1項(xiàng)目中學(xué)生數(shù)據(jù)的存儲(chǔ)和反復(fù)使用
任務(wù)描述
在學(xué)生成績(jī)管理系統(tǒng)中,所涉及的數(shù)據(jù)是比較大的,而每次運(yùn)行程序時(shí)都要通過(guò)鍵盤輸入數(shù)據(jù),非常麻煩。程序退出時(shí),數(shù)據(jù)也消失,數(shù)據(jù)只能保存在內(nèi)存中,不能長(zhǎng)期保存。
本任務(wù)使用外部存儲(chǔ)文件來(lái)保存數(shù)據(jù),實(shí)現(xiàn)對(duì)數(shù)據(jù)的存儲(chǔ)和讀取,能安全有效地長(zhǎng)期保存數(shù)據(jù),還能提供數(shù)據(jù)共享。任務(wù)分析案例9中的數(shù)據(jù)是存儲(chǔ)在內(nèi)存中的,當(dāng)程序結(jié)束運(yùn)行時(shí),這些數(shù)據(jù)全部消失。如果能將數(shù)據(jù)保存在文件中,將大大減少輸入工作量,而且輸出的結(jié)果也可以長(zhǎng)期保留。問(wèn)題的要點(diǎn)是:1)如何將內(nèi)存中的數(shù)據(jù)存儲(chǔ)在文件中。2)反之,如何從磁盤文件中的數(shù)據(jù)載入內(nèi)存。要完成上面的任務(wù),必須了解文件的基本概念,熟練掌握文件讀寫函數(shù)。1認(rèn)識(shí)文件Part◎文件的讀寫◎文件概述◎?qū)W生成績(jī)管理系統(tǒng)的數(shù)據(jù)存取文件概述
在內(nèi)存中,每個(gè)內(nèi)存單元都有一個(gè)地址,如在一個(gè)32位計(jì)算機(jī)的內(nèi)存中,內(nèi)存地址的編號(hào)按十六進(jìn)制從00000000-FFFFFFFF,共有232個(gè)內(nèi)存單元(字節(jié)),如果一個(gè)整型變量占據(jù)4個(gè)字節(jié),那么4個(gè)字節(jié)中編號(hào)最小的字節(jié)的地址即是該整型變量所占存儲(chǔ)單元的地址。通常我們把指向內(nèi)存存儲(chǔ)單元的地址叫指針。1.文件的概念文件是指存儲(chǔ)在外部介質(zhì)上的數(shù)據(jù)集合,為標(biāo)識(shí)一個(gè)文件,每個(gè)文件都必須有一個(gè)文件名,文件名的一般形式為:文件名.[擴(kuò)展名],其中擴(kuò)展名是可選的,并按類別命名,例如,C語(yǔ)言源程序的擴(kuò)展名是C,而可執(zhí)行文件的擴(kuò)展名是EXE等等。文件概述
在內(nèi)存中,每個(gè)內(nèi)存單元都有一個(gè)地址,如在一個(gè)32位計(jì)算機(jī)的內(nèi)存中,內(nèi)存地址的編號(hào)按十六進(jìn)制從00000000-FFFFFFFF,共有232個(gè)內(nèi)存單元(字節(jié)),如果一個(gè)整型變量占據(jù)4個(gè)字節(jié),那么4個(gè)字節(jié)中編號(hào)最小的字節(jié)的地址即是該整型變量所占存儲(chǔ)單元的地址。通常我們把指向內(nèi)存存儲(chǔ)單元的地址叫指針。2.文件類型(1)按文件的邏輯結(jié)構(gòu)分1)記錄文件:由具有一定結(jié)構(gòu)的記錄組成(定長(zhǎng)和不定長(zhǎng))。2)流式文件:由一個(gè)個(gè)字符(字節(jié))數(shù)據(jù)順序組成。文件概述
在內(nèi)存中,每個(gè)內(nèi)存單元都有一個(gè)地址,如在一個(gè)32位計(jì)算機(jī)的內(nèi)存中,內(nèi)存地址的編號(hào)按十六進(jìn)制從00000000-FFFFFFFF,共有232個(gè)內(nèi)存單元(字節(jié)),如果一個(gè)整型變量占據(jù)4個(gè)字節(jié),那么4個(gè)字節(jié)中編號(hào)最小的字節(jié)的地址即是該整型變量所占存儲(chǔ)單元的地址。通常我們把指向內(nèi)存存儲(chǔ)單元的地址叫指針。(3)按數(shù)據(jù)的組織形式分1)文本文件:也稱ASCII碼文件。這種文件在保存時(shí),每個(gè)字符對(duì)應(yīng)一個(gè)字節(jié),用于存儲(chǔ)對(duì)應(yīng)的ASCII碼。2)二進(jìn)制文件:不是保存ASCII碼,而是按二進(jìn)制的編碼方式來(lái)保存文件內(nèi)容。2.文件類型文件概述
在內(nèi)存中,每個(gè)內(nèi)存單元都有一個(gè)地址,如在一個(gè)32位計(jì)算機(jī)的內(nèi)存中,內(nèi)存地址的編號(hào)按十六進(jìn)制從00000000-FFFFFFFF,共有232個(gè)內(nèi)存單元(字節(jié)),如果一個(gè)整型變量占據(jù)4個(gè)字節(jié),那么4個(gè)字節(jié)中編號(hào)最小的字節(jié)的地址即是該整型變量所占存儲(chǔ)單元的地址。通常我們把指向內(nèi)存存儲(chǔ)單元的地址叫指針。3.文件的用途1)使程序與數(shù)據(jù)分離,數(shù)據(jù)文件的改動(dòng)不會(huì)引起程序的改動(dòng)。2)使數(shù)據(jù)共享,不同程序可以訪問(wèn)同一數(shù)據(jù)文件中的數(shù)據(jù)。3)程序運(yùn)行的中間數(shù)據(jù)或者結(jié)果數(shù)據(jù)可以長(zhǎng)期保存。文件概述
在內(nèi)存中,每個(gè)內(nèi)存單元都有一個(gè)地址,如在一個(gè)32位計(jì)算機(jī)的內(nèi)存中,內(nèi)存地址的編號(hào)按十六進(jìn)制從00000000-FFFFFFFF,共有232個(gè)內(nèi)存單元(字節(jié)),如果一個(gè)整型變量占據(jù)4個(gè)字節(jié),那么4個(gè)字節(jié)中編號(hào)最小的字節(jié)的地址即是該整型變量所占存儲(chǔ)單元的地址。通常我們把指向內(nèi)存存儲(chǔ)單元的地址叫指針。4.文件的處理方式1)緩沖文件系統(tǒng):又稱為標(biāo)準(zhǔn)文件系統(tǒng)或高級(jí)文件系統(tǒng),是目前常用的文件系統(tǒng),也是ANSIC建議使用的文件系統(tǒng)。系統(tǒng)自動(dòng)為正在使用的文件開辟內(nèi)存緩沖區(qū)??蓽p少主機(jī)和外部設(shè)備頻繁交換數(shù)據(jù)的次數(shù),緩沖文件系統(tǒng)的輸入輸出如下圖所示。文件概述
在內(nèi)存中,每個(gè)內(nèi)存單元都有一個(gè)地址,如在一個(gè)32位計(jì)算機(jī)的內(nèi)存中,內(nèi)存地址的編號(hào)按十六進(jìn)制從00000000-FFFFFFFF,共有232個(gè)內(nèi)存單元(字節(jié)),如果一個(gè)整型變量占據(jù)4個(gè)字節(jié),那么4個(gè)字節(jié)中編號(hào)最小的字節(jié)的地址即是該整型變量所占存儲(chǔ)單元的地址。通常我們把指向內(nèi)存存儲(chǔ)單元的地址叫指針。4.文件的處理方式2)非緩沖文件系統(tǒng)又稱為低級(jí)文件系統(tǒng),它提供的文件輸入輸出操作函數(shù)更接近于操作系統(tǒng),它不能自動(dòng)設(shè)置緩沖區(qū),而是由用戶根據(jù)所處理的數(shù)據(jù)大小在程序中設(shè)置,其輸入輸出示意圖如下圖所示。因此,非緩沖文件系統(tǒng)的操作與機(jī)器本身有關(guān),使用起來(lái)較為困難,但它節(jié)省內(nèi)存,執(zhí)行效率較高。文件概述
在內(nèi)存中,每個(gè)內(nèi)存單元都有一個(gè)地址,如在一個(gè)32位計(jì)算機(jī)的內(nèi)存中,內(nèi)存地址的編號(hào)按十六進(jìn)制從00000000-FFFFFFFF,共有232個(gè)內(nèi)存單元(字節(jié)),如果一個(gè)整型變量占據(jù)4個(gè)字節(jié),那么4個(gè)字節(jié)中編號(hào)最小的字節(jié)的地址即是該整型變量所占存儲(chǔ)單元的地址。通常我們把指向內(nèi)存存儲(chǔ)單元的地址叫指針。5.文件的定義一般情況下,要使用一個(gè)文件,系統(tǒng)將在內(nèi)存中為這一文件開辟一個(gè)“文件信息區(qū)”,用來(lái)存放文件的有關(guān)信息,如文件當(dāng)前的讀寫位置、緩沖區(qū)中未被處理的字符數(shù)、文件操作方式、下一個(gè)字符的位置、文件緩沖區(qū)的位置等。這些信息保存在一個(gè)結(jié)構(gòu)體中,該結(jié)構(gòu)體由系統(tǒng)定義的,定義在stdio.h的頭文件中。VisualC++6.0系統(tǒng)中具體定義形式為:文件概述
struct_iobuf{char*_ptr;/*文件輸入的下一個(gè)位置*/int_cnt;/*當(dāng)前緩沖區(qū)的相對(duì)位置*/char*_base;/*數(shù)據(jù)緩沖區(qū)的位置*/int_flag;/*文件狀態(tài)標(biāo)志*/int_file;/*用于有效性檢驗(yàn)*/int_charbuf;/*如無(wú)緩沖區(qū)不讀取字符*/int_bufsiz;/*緩沖區(qū)的大小*/char*_tmpfname;/*臨時(shí)文件名*/};typedefstruct_iobufFILE;文件概述
在內(nèi)存中,每個(gè)內(nèi)存單元都有一個(gè)地址,如在一個(gè)32位計(jì)算機(jī)的內(nèi)存中,內(nèi)存地址的編號(hào)按十六進(jìn)制從00000000-FFFFFFFF,共有232個(gè)內(nèi)存單元(字節(jié)),如果一個(gè)整型變量占據(jù)4個(gè)字節(jié),那么4個(gè)字節(jié)中編號(hào)最小的字節(jié)的地址即是該整型變量所占存儲(chǔ)單元的地址。通常我們把指向內(nèi)存存儲(chǔ)單元的地址叫指針。5.文件的定義C語(yǔ)言對(duì)文件的操作并不是直接通過(guò)文件名進(jìn)行的,而是根據(jù)文件名生成一個(gè)指向FILE結(jié)構(gòu)類型的指針。也就是首先定義一個(gè)FILE的指針,例如:FILE*fp;
通過(guò)fp使用結(jié)構(gòu)體變量中的文件信息訪問(wèn)文件。也就是說(shuō),C程序中是通過(guò)文件指針變量fp找到與它相關(guān)的文件的,通過(guò)該指針對(duì)文件進(jìn)行操作。注意:1)文件指針?biāo)傅氖且粋€(gè)名為FILE的結(jié)構(gòu)體類型,在頭文件stdio.h中定義,結(jié)構(gòu)體FILE的細(xì)節(jié)對(duì)一般用戶來(lái)說(shuō)并不重要,不必詳細(xì)了解FILE的具體組成結(jié)構(gòu)。2)經(jīng)過(guò)定義的文件指針,就可以用來(lái)指向一個(gè)文件。3)FILE類型及所有文件的讀寫函數(shù)和相關(guān)常量都定義在文件stdio.h中,因此在源程序的開頭要包含頭文件stdio.h。文件概述
在內(nèi)存中,每個(gè)內(nèi)存單元都有一個(gè)地址,如在一個(gè)32位計(jì)算機(jī)的內(nèi)存中,內(nèi)存地址的編號(hào)按十六進(jìn)制從00000000-FFFFFFFF,共有232個(gè)內(nèi)存單元(字節(jié)),如果一個(gè)整型變量占據(jù)4個(gè)字節(jié),那么4個(gè)字節(jié)中編號(hào)最小的字節(jié)的地址即是該整型變量所占存儲(chǔ)單元的地址。通常我們把指向內(nèi)存存儲(chǔ)單元的地址叫指針。6.文件的打開和關(guān)閉文件的讀寫操作之前,必須先打開文件;使用結(jié)束后,為了避免數(shù)據(jù)丟失,應(yīng)立即關(guān)閉文件。即文件的使用步驟一般為:首先打開文件,然后進(jìn)行文件的讀寫操作,最后關(guān)閉文件。文件的打開和關(guān)閉都是通過(guò)函數(shù)來(lái)實(shí)現(xiàn)的。文件概述
在內(nèi)存中,每個(gè)內(nèi)存單元都有一個(gè)地址,如在一個(gè)32位計(jì)算機(jī)的內(nèi)存中,內(nèi)存地址的編號(hào)按十六進(jìn)制從00000000-FFFFFFFF,共有232個(gè)內(nèi)存單元(字節(jié)),如果一個(gè)整型變量占據(jù)4個(gè)字節(jié),那么4個(gè)字節(jié)中編號(hào)最小的字節(jié)的地址即是該整型變量所占存儲(chǔ)單元的地址。通常我們把指向內(nèi)存存儲(chǔ)單元的地址叫指針。6.文件的打開和關(guān)閉(1)文件的打開C語(yǔ)言中,使用fopen()函數(shù)來(lái)打開文件。格式:FILE*fp;fp=fopen("文件名","操作方式");功能:以指定的操作方式打開一個(gè)文件。若文件正常打開,返回指向文件結(jié)構(gòu)體的指針;否則打開失敗,返回NULL。說(shuō)明:1)fopen()函數(shù)在執(zhí)行時(shí)返回一個(gè)FILE類型的指針,賦給一個(gè)文件指針變量fp,使fp與被打開的文件聯(lián)系起來(lái),而后對(duì)文件的讀寫操作就可以通過(guò)fp來(lái)進(jìn)行。2)“文件名”指要打開文件的文件名,若不在當(dāng)前目錄下,則要寫絕對(duì)路徑。3)“操作方式”是指對(duì)打開文件的訪問(wèn)形式,取值及含義如表所示。操作方式含義文件不存在時(shí)文件存在時(shí)r只讀(文本文件)出錯(cuò)正常打開w只寫(文本文件)建立新文件文件原有內(nèi)容丟失a添加(文本文件)建立新文件在文件原有內(nèi)容末尾追加rb只讀(二進(jìn)制文件)出錯(cuò)正常打開wb只寫(二進(jìn)制文件)建立新文件文件原有內(nèi)容丟失ab添加(二進(jìn)制文件)建立新文件在文件原有內(nèi)容末尾追加r+讀/寫(文本文件)出錯(cuò)正常打開w+寫/讀(文本文件)建立新文件文件原有內(nèi)容丟失a+讀/添加(文本文件)建立新文件在文件原有內(nèi)容末尾追加rb+讀/寫(二進(jìn)制文件)出錯(cuò)正常打開wb+寫/讀(二進(jìn)制文件)建立新文件文件原有內(nèi)容丟失ab+讀/添加(二進(jìn)制文件)建立新文件在文件原有內(nèi)容末尾追加文件概述
在內(nèi)存中,每個(gè)內(nèi)存單元都有一個(gè)地址,如在一個(gè)32位計(jì)算機(jī)的內(nèi)存中,內(nèi)存地址的編號(hào)按十六進(jìn)制從00000000-FFFFFFFF,共有232個(gè)內(nèi)存單元(字節(jié)),如果一個(gè)整型變量占據(jù)4個(gè)字節(jié),那么4個(gè)字節(jié)中編號(hào)最小的字節(jié)的地址即是該整型變量所占存儲(chǔ)單元的地址。通常我們把指向內(nèi)存存儲(chǔ)單元的地址叫指針。6.文件的打開和關(guān)閉例如:FILE*fp;fp=fopen("test.txt","r");上面代碼表示以讀方式打開當(dāng)前目錄下文件名為“text.txt”的文本文件。程序中一般會(huì)考慮作容錯(cuò)處理,常用的方法如下:if((fp=fopen("文件名","操作方式"))==NULL){printf("打開文件失?。?);exit(0);/*結(jié)束程序運(yùn)行*/}文件概述
在內(nèi)存中,每個(gè)內(nèi)存單元都有一個(gè)地址,如在一個(gè)32位計(jì)算機(jī)的內(nèi)存中,內(nèi)存地址的編號(hào)按十六進(jìn)制從00000000-FFFFFFFF,共有232個(gè)內(nèi)存單元(字節(jié)),如果一個(gè)整型變量占據(jù)4個(gè)字節(jié),那么4個(gè)字節(jié)中編號(hào)最小的字節(jié)的地址即是該整型變量所占存儲(chǔ)單元的地址。通常我們把指向內(nèi)存存儲(chǔ)單元的地址叫指針。6.文件的打開和關(guān)閉(2)文件的關(guān)閉使用完一個(gè)文件后,應(yīng)使用fclose()函數(shù)及時(shí)關(guān)閉。fclose()函數(shù)和fopen()函數(shù)一樣,原型也在stdio.h中,調(diào)用的一般形式為:fclose(文件指針);例如:fclose(fp);fclose函數(shù)也帶回一個(gè)值,當(dāng)正常完成關(guān)閉文件時(shí),fclose函數(shù)返回值為0(NULL),否則返回-1(EOF),EOF是stdio.h中定義的符號(hào)常量,值為-1。EOF也是文件結(jié)束的標(biāo)志。文件的讀寫
在內(nèi)存中,每個(gè)內(nèi)存單元都有一個(gè)地址,如在一個(gè)32位計(jì)算機(jī)的內(nèi)存中,內(nèi)存地址的編號(hào)按十六進(jìn)制從00000000-FFFFFFFF,共有232個(gè)內(nèi)存單元(字節(jié)),如果一個(gè)整型變量占據(jù)4個(gè)字節(jié),那么4個(gè)字節(jié)中編號(hào)最小的字節(jié)的地址即是該整型變量所占存儲(chǔ)單元的地址。通常我們把指向內(nèi)存存儲(chǔ)單元的地址叫指針。1.文本文件的讀寫C語(yǔ)言提供以字符方式讀寫文件的函數(shù)有:1)寫字符函數(shù)intfputc(charch,FILE*fp)2)讀字符函數(shù)intfgetc(FILE*fp)3)寫字符串函數(shù)intfputs(char*string,F(xiàn)ILE*fp)4)讀字符串函數(shù)char*fgets(char*string,intn,FILE*fp)文件的讀寫
在內(nèi)存中,每個(gè)內(nèi)存單元都有一個(gè)地址,如在一個(gè)32位計(jì)算機(jī)的內(nèi)存中,內(nèi)存地址的編號(hào)按十六進(jìn)制從00000000-FFFFFFFF,共有232個(gè)內(nèi)存單元(字節(jié)),如果一個(gè)整型變量占據(jù)4個(gè)字節(jié),那么4個(gè)字節(jié)中編號(hào)最小的字節(jié)的地址即是該整型變量所占存儲(chǔ)單元的地址。通常我們把指向內(nèi)存存儲(chǔ)單元的地址叫指針。1.文本文件的讀寫(1)寫字符函數(shù)寫字符函數(shù)fputc()的原型如下:intfputc(charc,FILE*fp)fputc()函數(shù)的一般形式如下:ch=fputc(ch,fp);功能:將字符型變量ch的內(nèi)容寫入文件指針fp所指定的文件中。說(shuō)明:1)ch為字符變量或字符常量。2)fp為FILE類型的文件指針變量,它由fopen()函數(shù)賦初值。3)打開文件的方式必須是帶“w”或“w+”,并且文件必須存在。文件的讀寫
#include"stdio.h"voidmain(){FILE*fp;/*定義文件指針*/charchInfo[20];/*定義數(shù)組*/inti;fp=fopen("myInfo.txt","w");/*以寫文本文件方式打開文件*/if(fp==NULL)/*如果打開失敗,則結(jié)束程序*/{printf("cannotopenthisfile\n");exit(0);}例10-1編寫程序,從鍵盤輸入一串字符“mayfriendshipforever!”,然后保存在文件myInfo.txt中。文件的讀寫
printf("pleaseinputastring:");gets(chInfo);/*輸入一個(gè)字符串*/i=0;while(chInfo[i]!='\0')/*將字符數(shù)組中的字符寫入文件*/{fputc(chInfo[i],fp);/*將字符數(shù)組中的一個(gè)字符寫入文件*/i++;}fclose(fp);/*關(guān)閉文件*/例10-1編寫程序,從鍵盤輸入一串字符“mayfriendshipforever!”,然后保存在文件myInfo.txt中。說(shuō)明:1)語(yǔ)句fp=fopen("myInfo.txt","w");以寫方式打開文本文件myInfo.txt,若該文件不存在,則建立一個(gè)新文件;若該文件存在,則重寫該文件。2)文件myInfo.txt所在目錄為程序文件所在目錄,如果想將文件myInfo.txt存放在指定的目錄中,比如目錄d:\mydir(該目錄存在)中可用如下語(yǔ)句:fp=fopen("d:\\mydir\\myInfo.txt","w");3)用if語(yǔ)句判斷文件是否成功打開,如果不成功則直接結(jié)束程序。exit()函數(shù)的作用是關(guān)閉所有文件,終止正在執(zhí)行的程序。4)while循環(huán)語(yǔ)句將輸入的字符串中的字符逐個(gè)按順序?qū)懭胛募yInfo.txt中。5)可以用記事本或DOS中的type命令查看文件myInfo.txt,其內(nèi)容和輸入的內(nèi)容一致,為:“mayfriendshipforever!”。文件的讀寫
在內(nèi)存中,每個(gè)內(nèi)存單元都有一個(gè)地址,如在一個(gè)32位計(jì)算機(jī)的內(nèi)存中,內(nèi)存地址的編號(hào)按十六進(jìn)制從00000000-FFFFFFFF,共有232個(gè)內(nèi)存單元(字節(jié)),如果一個(gè)整型變量占據(jù)4個(gè)字節(jié),那么4個(gè)字節(jié)中編號(hào)最小的字節(jié)的地址即是該整型變量所占存儲(chǔ)單元的地址。通常我們把指向內(nèi)存存儲(chǔ)單元的地址叫指針。1.文本文件的讀寫(2)讀字符函數(shù)讀字符函數(shù)fgetc()的原型如下:intfgetc(FILE*fp);fgetc()函數(shù)的一般形式如下:ch=fgetc(fp);功能:從文件指針fp所指文件中讀取一個(gè)字符。說(shuō)明:1)ch為字符變量,用來(lái)接收從磁盤文件讀入的字符。2)fp為FILE類型的文件指針變量,它由fopen()函數(shù)賦初值。3)打開文件的方式必須是帶“r”或“r+”,并且文件必須存在。4)fgetc()函數(shù)返回一個(gè)字符,如果讀到文件尾,則返回的是文件結(jié)束標(biāo)志EOF。出錯(cuò)時(shí)也返回EOF。文件的讀寫
#include"stdio.h"voidmain(intargc,char*args[]){FILE*fp;/*定義文件指針*/charch;fp=fopen(args[1],"r")/*以讀文本文件方式打開文件,文件名由命令行參數(shù)輸入*/if(fp==NULL){printf("cannotopenthisfile\n");exit(0);}
例10-2打開例10.1生成的文件myInfo.txt,將其中的內(nèi)容顯示在屏幕上,要求文件名從命令行參數(shù)輸入。文件的讀寫
ch=fgetc(fp);/*讀取文件中的一個(gè)字符存放到ch中*/while(ch!='\0')/*如果文件沒(méi)有結(jié)束,重復(fù)下面的操作*/{putchar(ch);/*顯示ch中的字符*/ch=fgetc(fp);/*讀取文件中的一個(gè)字符存放的ch中*/}fclose(fp);/*關(guān)閉文件*/}例10-2打開例10.1生成的文件myInfo.txt,將其中的內(nèi)容顯示在屏幕上,要求文件名從命令行參數(shù)輸入。說(shuō)明:1)main()主函數(shù)可以有兩個(gè)參數(shù),第1個(gè)參數(shù)argc存放命令行參數(shù)的個(gè)數(shù),第2個(gè)參數(shù)args[]是一個(gè)char型指針數(shù)組,用來(lái)存放命令行參數(shù)的字符串的首地址。命令行參數(shù)可以有多個(gè)。其中args[0]存放正在執(zhí)行的文件名,args[1]存放第1個(gè)參數(shù),args[21]存放第2個(gè)參數(shù),…args[n]存放第n個(gè)參數(shù)。所以在本程序中,正在執(zhí)行的文件名“LT10-2.exe”存放在args[0]中,要讀取的文件名“myInfo.txt”存放在args[1]中。2)語(yǔ)句fp=fopen(args[1],"r");以只讀方式打開文本文件myInfo.txt。3)用if語(yǔ)句判斷文件是否成功打開,如果不成功,則輸出錯(cuò)誤信息,直接結(jié)束程序。4)while循環(huán)語(yǔ)句從文件頭開始逐個(gè)讀取文件中的字符并輸出到屏幕上,當(dāng)讀到文件結(jié)束標(biāo)志EOF時(shí)結(jié)束循環(huán)。EOF在文件stdio.h中定義為-1,是不可顯示字符,不能在屏幕上顯示。說(shuō)明:5)C語(yǔ)言中提供了函數(shù)feof(),可以用來(lái)判斷文件是否結(jié)束。所以本程序的while循環(huán)可以做如下更改:while(!feof(fp)){putchar(ch);ch=fgetc(fp);}feof(fp)用來(lái)測(cè)試fp所指向的文件當(dāng)前狀態(tài)是否為“文件結(jié)束”,如果是,則函數(shù)值為1(真),否則為0(假)。文件的讀寫
在內(nèi)存中,每個(gè)內(nèi)存單元都有一個(gè)地址,如在一個(gè)32位計(jì)算機(jī)的內(nèi)存中,內(nèi)存地址的編號(hào)按十六進(jìn)制從00000000-FFFFFFFF,共有232個(gè)內(nèi)存單元(字節(jié)),如果一個(gè)整型變量占據(jù)4個(gè)字節(jié),那么4個(gè)字節(jié)中編號(hào)最小的字節(jié)的地址即是該整型變量所占存儲(chǔ)單元的地址。通常我們把指向內(nèi)存存儲(chǔ)單元的地址叫指針。1.文本文件的讀寫(3)寫字符串函數(shù)intfputs(char*string,F(xiàn)ILE*fp)fputs()函數(shù)的一般形式如下:ch=fputs(str,fp);功能:將一個(gè)字符串寫到文件指針fp所指的文件中。說(shuō)明:1)fputs()函數(shù)帶返回值。若輸出成功,返回值為0,否則返回值為非零。2)字符串結(jié)束符將不被輸出。因此,為了讀數(shù)據(jù)的方便,使字符串能分開,往往用fputs("\n",fp)語(yǔ)句在每個(gè)字符串后加一個(gè)換行符'\n'一起存入文件中。文件的讀寫
該程序的解題思路和例10-1相近,請(qǐng)參考前面內(nèi)容。只須對(duì)代碼做部分修改,需要修改的地方主要有:1)刪除語(yǔ)句inti;2)可將語(yǔ)句i=0;while(chInfo[i]!='\0'){fputc(chInfo[i],fp);i++;}改為:fputs(chInfo,fp);例10-3用fputs()函數(shù)實(shí)現(xiàn)例10-1應(yīng)如何修改程序?請(qǐng)根據(jù)提示寫出完整程序。文件的讀寫
在內(nèi)存中,每個(gè)內(nèi)存單元都有一個(gè)地址,如在一個(gè)32位計(jì)算機(jī)的內(nèi)存中,內(nèi)存地址的編號(hào)按十六進(jìn)制從00000000-FFFFFFFF,共有232個(gè)內(nèi)存單元(字節(jié)),如果一個(gè)整型變量占據(jù)4個(gè)字節(jié),那么4個(gè)字節(jié)中編號(hào)最小的字節(jié)的地址即是該整型變量所占存儲(chǔ)單元的地址。通常我們把指向內(nèi)存存儲(chǔ)單元的地址叫指針。1.文本文件的讀寫(4)讀字符串函數(shù)char*fgets(char*string,intn,FILE*fp)fgets()函數(shù)的一般形式如下:fgets(str,n,fp);功能:從文件指針fp所指的文件中讀取一個(gè)字符串。說(shuō)明:1)str為字符數(shù)組或字符型指針。2)n為正整數(shù),表示從文件中讀取不超過(guò)n-1個(gè)字符,在讀取的最后一個(gè)字符后加上串結(jié)束符'\0'。如果在完成讀取n-1個(gè)字符之前,遇到換行符或EOF,則停止讀過(guò)程。3)fgets()函數(shù)的返回值為str的首地址。若讀到文件尾或出錯(cuò),則返回空指針NULL。文件的讀寫
該程序的解題思路與例10-2相近,請(qǐng)參考前面內(nèi)容。只需對(duì)代碼做部分修改,需要修改的地方主要有:1)語(yǔ)句charch;改為char*chInfo;例10-4用fgets()函數(shù)實(shí)現(xiàn)例10-2應(yīng)如何修改程序?請(qǐng)根據(jù)提示寫出完整程序。2)語(yǔ)句ch=fgetc(fp);while(ch!='\0'){putchar(ch);ch=fgetc(fp);}改為:fgets(chInfo,100,fp);printf("%s",chInfo);注意:fgets()函數(shù)中的第2個(gè)參數(shù)為要讀取的字符數(shù),要大于或等于文件的長(zhǎng)度+1。文件的讀寫
在內(nèi)存中,每個(gè)內(nèi)存單元都有一個(gè)地址,如在一個(gè)32位計(jì)算機(jī)的內(nèi)存中,內(nèi)存地址的編號(hào)按十六進(jìn)制從00000000-FFFFFFFF,共有232個(gè)內(nèi)存單元(字節(jié)),如果一個(gè)整型變量占據(jù)4個(gè)字節(jié),那么4個(gè)字節(jié)中編號(hào)最小的字節(jié)的地址即是該整型變量所占存儲(chǔ)單元的地址。通常我們把指向內(nèi)存存儲(chǔ)單元的地址叫指針。2.二進(jìn)制文件的讀寫多數(shù)文件是以二進(jìn)制方式存儲(chǔ),且需要對(duì)整塊數(shù)據(jù)進(jìn)行讀寫。(1)寫數(shù)據(jù)塊函數(shù)fwrite()函數(shù)的一般形式如下:fwrite(buffer,size,count,fp);功能:將一組數(shù)據(jù)輸出到指定的磁盤文件中。說(shuō)明:1)buffe用于存放輸出數(shù)據(jù)的緩沖區(qū)指針,即要寫出數(shù)據(jù)段的起始地址。2)size是輸出的每個(gè)數(shù)據(jù)項(xiàng)的字節(jié)數(shù)。3)count是指要輸出多少個(gè)size字節(jié)的數(shù)據(jù)項(xiàng)數(shù),因此字節(jié)總數(shù)為count*size。4)fp是FILE類型的文件指針變量。文件的讀寫
#include"stdio.h"voidmain(){intiArray[5];/*定義數(shù)組*/inti;FILE*fp;/*定義文件指針*/fp=fopen("test.dat","wb");/*以寫二進(jìn)制文件的方法打開文件*/if(fp==NULL){printf("cannotopenthisfile\n");exit(0);}
例10-5編一程序從鍵盤輸入5個(gè)整數(shù)并寫入到文件test.dat中。文件的讀寫
printf("pleaseinput5integers:");for(i=0;i<5;i++)/*輸入5個(gè)整數(shù)存入數(shù)組中*/scanf("%d",&iArray[i]);fwrite(iArray,4*5,1,fp);/*將數(shù)組中的5個(gè)整數(shù)寫入文件*/fclose(fp);/*關(guān)閉文件*/例10-5編一程序從鍵盤輸入5個(gè)整數(shù)并寫入到文件test.dat中。說(shuō)明:1)fwrite(iArray,4*5,1,fp)將數(shù)組iArray中的所有元素整體一次性寫入到文件。2)使用fwrite()函數(shù)將數(shù)組中的元素寫入文件時(shí),可以將數(shù)組整體一次性寫入,也可以逐個(gè)元素寫入。逐個(gè)元素寫入時(shí),每次寫入一個(gè)整數(shù),可以用循環(huán)語(yǔ)句實(shí)現(xiàn),代碼如下。for(i=0;i<5;i++)fwrite(iArray[i],4,1,fp);3)用fwrite()寫入的文件是二進(jìn)制文件,不能用記事本打開或者用type命令顯示。文件的讀寫
在內(nèi)存中,每個(gè)內(nèi)存單元都有一個(gè)地址,如在一個(gè)32位計(jì)算機(jī)的內(nèi)存中,內(nèi)存地址的編號(hào)按十六進(jìn)制從00000000-FFFFFFFF,共有232個(gè)內(nèi)存單元(字節(jié)),如果一個(gè)整型變量占據(jù)4個(gè)字節(jié),那么4個(gè)字節(jié)中編號(hào)最小的字節(jié)的地址即是該整型變量所占存儲(chǔ)單元的地址。通常我們把指向內(nèi)存存儲(chǔ)單元的地址叫指針。2.二進(jìn)制文件的讀寫多數(shù)文件是以二進(jìn)制方式存儲(chǔ),且需要對(duì)整塊數(shù)據(jù)進(jìn)行讀寫。(2)讀數(shù)據(jù)塊函數(shù)fread()函數(shù)的一般形式如下:fread(buffer,size,count,fp);功能:從指定的文件中讀入一組數(shù)據(jù)。說(shuō)明:1)buffer用于存放讀入數(shù)據(jù)的緩沖區(qū)指針,即是存放數(shù)據(jù)的起始地址。2)size是讀入的每個(gè)數(shù)據(jù)項(xiàng)的字節(jié)數(shù)。3)count是指要讀入多少個(gè)size字節(jié)的數(shù)據(jù)項(xiàng)數(shù),因此字節(jié)總數(shù)為count*size。4)fp是FILE類型的文件指針變量。文件的讀寫
#include"stdio.h"voidmain(){intiArray[5];/*定義數(shù)組*/inti;FILE*fp;/*定義文件指針*/fp=fopen("test.dat","rb");/*以讀二進(jìn)制文件的方法打開文件*/if(fp==NULL){printf("cannotopenthisfile\n");exit(0);}例10-6編寫程序,從例10-5寫入的文件test.dat中讀取數(shù)據(jù)并顯示在屏幕上。文件的讀寫
fread(iArray,4*5,1,fp);/*讀取文件中5個(gè)整數(shù)存入數(shù)組*/for(i=0;i<5;i++)/*顯示數(shù)字*/printf("%d\t",iArray[i]);fclose(fp);/*關(guān)閉文件*/}例10-6編寫程序,從例10-5寫入的文件test.dat中讀取數(shù)據(jù)并顯示在屏幕上。說(shuō)明:1)fread(iArray,4*5,1,fp)讀取文件test.dat中的4*5字節(jié)的數(shù)據(jù),存入到數(shù)組iArray[]中,即從地址iArray[]開始的一段連續(xù)空間。2)使用fread()函數(shù)讀取文件中的n個(gè)整數(shù)時(shí),可以一次性讀取,也可以逐個(gè)元素讀取。逐個(gè)元素讀取時(shí),可以用循環(huán)語(yǔ)句實(shí)現(xiàn),代碼如下。for(i=0;i<5;i++)fread(&iArray[i],4,1,fp);文件的讀寫
在內(nèi)存中,每個(gè)內(nèi)存單元都有一個(gè)地址,如在一個(gè)32位計(jì)算機(jī)的內(nèi)存中,內(nèi)存地址的編號(hào)按十六進(jìn)制從00000000-FFFFFFFF,共有232個(gè)內(nèi)存單元(字節(jié)),如果一個(gè)整型變量占據(jù)4個(gè)字節(jié),那么4個(gè)字節(jié)中編號(hào)最小的字節(jié)的地址即是該整型變量所占存儲(chǔ)單元的地址。通常我們把指向內(nèi)存存儲(chǔ)單元的地址叫指針。3.文本文件的格式化讀寫文件的格式化輸入/輸出函數(shù)fscanf()/fprintf(),與前面介紹的scanf()/printf()函數(shù)的作用類似,都是用來(lái)實(shí)現(xiàn)格式化讀寫操作,不同的是fscanf()/fprintf()的讀寫對(duì)象是磁盤文件,而不是屏幕。(1)格式化寫函數(shù)fprintf()函數(shù)的一般形式如下:intfprintf(FILE*fp,char*format[,argument,…])功能:按format規(guī)定的格式把數(shù)據(jù)寫入文件指針fp所指文件中。其中format參數(shù)的含義與printf是相同的。文件的讀寫
在內(nèi)存中,每個(gè)內(nèi)存單元都有一個(gè)地址,如在一個(gè)32位計(jì)算機(jī)的內(nèi)存中,內(nèi)存地址的編號(hào)按十六進(jìn)制從00000000-FFFFFFFF,共有232個(gè)內(nèi)存單元(字節(jié)),如果一個(gè)整型變量占據(jù)4個(gè)字節(jié),那么4個(gè)字節(jié)中編號(hào)最小的字節(jié)的地址即是該整型變量所占存儲(chǔ)單元的地址。通常我們把指向內(nèi)存存儲(chǔ)單元的地址叫指針。3.文本文件的格式化讀寫(2)格式化讀函數(shù)fscanf()函數(shù)的一般形式如下:intfscanf(FILE*fp,char*format[,argument,…])功能:從文件指針fp所指文件中按format規(guī)定的格式把數(shù)據(jù)讀入?yún)?shù)argument中。其中format參數(shù)的含義與scanf是相同的。文件的讀寫
#include<stdio.h>#defineSIZE4structstudent_type{charname[10];intnum;intage;charaddr[15];}stud[SIZE];main(){load();save();display();}例10-7將4個(gè)學(xué)生的數(shù)據(jù),從磁盤文件stu_dat調(diào)入,然后輸出到stu_list文件中,并在屏幕上顯示磁盤文件的內(nèi)容。voidload(){FILE*fp;inti;if((fp=fopen("d:\\stu_dat","rb"))==NULL){printf("cannotopenfile\n");return;}for(i=0;i<SIZE;i++)if(fread(&stud[i],sizeof(structstudent_type),1,fp)!=1){if(feof(fp)){fclose(fp);retun;}printf("filereaderror\n");}fclose(fp);}文件的讀寫
voidsave(){FILE*fp;inti;if((fp=fopen("d:\\stu_list","wb"))==NULL){printf("cannotopenfile\n");return;}for(i=0;i<SIZE;i++)if(fwrite(&stud[i],sizeof(structstudent_type),1,fp)!=1)printf("filewriteerror\n");fclose(fp);}例10-7將4個(gè)學(xué)生的數(shù)據(jù),從磁盤文件stu_dat調(diào)入,然后輸出到stu_list文件中,并在屏幕上顯示磁盤文件的內(nèi)容。voiddisplay(){FILE*fp;inti;if((fp=fopen("d:\\stu_list","r"))==NULL){printf("cannotopenfile\n");return;}for(i=0;i<SIZE;i++){fscanf(fp,"%s%d%d%s",stud[i].name,stud[i].num,stud[i].age,stud[i].addr);printf("%-10s%4d%4d%-15s\n",stud[i].name,stud[i].num,stud[i].age,stud[i].addr);}fclose(fp);}文件的讀寫
在內(nèi)存中,每個(gè)內(nèi)存單元都有一個(gè)地址,如在一個(gè)32位計(jì)算機(jī)的內(nèi)存中,內(nèi)存地址的編號(hào)按十六進(jìn)制從00000000-FFFFFFFF,共有232個(gè)內(nèi)存單元(字節(jié)),如果一個(gè)整型變量占據(jù)4個(gè)字節(jié),那么4個(gè)字節(jié)中編號(hào)最小的字節(jié)的地址即是該整型變量所占存儲(chǔ)單元的地址。通常我們把指向內(nèi)存存儲(chǔ)單元的地址叫指針。4.其他讀寫函數(shù)(1)putw()和getw()函數(shù)1)格式putw(intw,FILE*fp)getw(FILE*fp)2)功能:以二進(jìn)制形式,從磁盤文件讀寫一個(gè)int型的整數(shù),4個(gè)字節(jié)。3)返回值:成功時(shí)返回所寫的整數(shù)值;失敗時(shí)返回值為EOF。例如:putw(10,fp);i=getw(fp);文件的讀寫
在內(nèi)存中,每個(gè)內(nèi)存單元都有一個(gè)地址,如在一個(gè)32位計(jì)算機(jī)的內(nèi)存中,內(nèi)存地址的編號(hào)按十六進(jìn)制從00000000-FFFFFFFF,共有232個(gè)內(nèi)存單元(字節(jié)),如果一個(gè)整型變量占據(jù)4個(gè)字節(jié),那么4個(gè)字節(jié)中編號(hào)最小的字節(jié)的地址即是該整型變量所占存儲(chǔ)單元的地址。通常我們把指向內(nèi)存存儲(chǔ)單元的地址叫指針。4.其他讀寫函數(shù)(1)putw()和getw()函數(shù)(2)fgets和fputs函數(shù)1)格式:fgets(str,n,fp);(str字符數(shù)組,n-1個(gè)字符)fputs(字符串,fp);("\0"不輸出)2)功能:從fp指向的文件讀/寫一個(gè)字符串。3)返回值:fgets()正常時(shí)返回字符串的首地址;出錯(cuò)或文件尾,NULL。fputs()正常時(shí)返回寫入的最后一個(gè)字符;出錯(cuò)為EOF。文件的讀寫
#include<stdio.h>voidmain(){FILE*fp;charstring[81];if((fp=fopen("file.txt","w"))==NULL){printf("cann'topenfile");exit(0);}while(strlen(gets(string))>0){fputs(string,fp);例10-8從鍵盤讀入字符串存入文件,再?gòu)奈募x回顯示。fputs("\n",fp);}fclose(fp);if((fp=fopen("file.txt","r"))==NULL){printf("cann'topenfile");exit(0);}while(fgets(string,81,fp)!=NULL)fputs(string,stdout);fclose(fp);}文件的讀寫
在內(nèi)存中,每個(gè)內(nèi)存單元都有一個(gè)地址,如在一個(gè)32位計(jì)算機(jī)的內(nèi)存中,內(nèi)存地址的編號(hào)按十六進(jìn)制從00000000-FFFFFFFF,共有232個(gè)內(nèi)存單元(字節(jié)),如果一個(gè)整型變量占據(jù)4個(gè)字節(jié),那么4個(gè)字節(jié)中編號(hào)最小的字節(jié)的地址即是該整型變量所占存儲(chǔ)單元的地址。通常我們把指向內(nèi)存存儲(chǔ)單元的地址叫指針。5.文件的定位與隨機(jī)讀寫文件中有一個(gè)位置指針,指向當(dāng)前讀寫的位置。具體位置由文件打開方式確定。一般“r”、“w”指向文件頭,“a”指向文件尾。當(dāng)順序讀寫一個(gè)文件時(shí),每讀寫完一個(gè)數(shù)據(jù)單位(一個(gè)字符,或一個(gè)整數(shù),或一個(gè)結(jié)構(gòu)體變量)后,位置指針自動(dòng)移向下一個(gè)數(shù)據(jù)單位位置,如果想改變這種順序,就需要強(qiáng)制使位置指針指向指定的位置。在對(duì)文件讀寫操作時(shí),往往不需要從頭開始,只需對(duì)其中指定的內(nèi)容進(jìn)行讀寫操作,這時(shí)我們可以調(diào)用庫(kù)函數(shù)來(lái)改變文件的讀寫位置,這種函數(shù)稱為文件的定位函數(shù),一般用rewind()和fseek()函數(shù)實(shí)現(xiàn)。文件的讀寫
在內(nèi)存中,每個(gè)內(nèi)存單元都有一個(gè)地址,如在一個(gè)32位計(jì)算機(jī)的內(nèi)存中,內(nèi)存地址的編號(hào)按十六進(jìn)制從00000000-FFFFFFFF,共有232個(gè)內(nèi)存單元(字節(jié)),如果一個(gè)整型變量占據(jù)4個(gè)字節(jié),那么4個(gè)字節(jié)中編號(hào)最小的字節(jié)的地址即是該整型變量所占存儲(chǔ)單元的地址。通常我們把指向內(nèi)存存儲(chǔ)單元的地址叫指針。5.文件的定位與隨機(jī)讀寫文件的讀寫方式一般有兩種:1)順序讀寫:位置指針按字節(jié)位置順序移動(dòng)。2)隨機(jī)讀寫:位置指針按需要移動(dòng)到任意位置。(1)rewind()函數(shù)格式:rewind(fp);功能:將文件的讀寫位置指針重新移到文件的開頭。說(shuō)明:在實(shí)際應(yīng)用中,若對(duì)某一文件進(jìn)行多次讀寫操作后,需要重新讀寫該文件,可以采用關(guān)閉該文件再打開該文件的方法,而使用rewind()函數(shù)可以在不關(guān)閉文件的情況下將位置指針?lè)祷匚募_頭,達(dá)到重新讀取文件的目的,顯然效率要比前一種方法高。rewind()函數(shù)原型為:voidrewind(FILE*fp);文件的讀寫
#include<stdio.h>voidmain(){FILE*fp1,*fp2;fp1=fopen("c:\\tc\\user\\ch12_4.c","r");fp2=fopen("d:\\tc\\user\\ch12_41.c","w");while(!feof(fp1))putchar(getc(fp1));rewind(fp1);while(!feof(fp1))putc(getc(fp1),fp2);fclose(fp1);fclose(fp2);}例10-9對(duì)一個(gè)磁盤文件進(jìn)行顯示和復(fù)制兩次操作。文件的讀寫
在內(nèi)存中,每個(gè)內(nèi)存單元都有一個(gè)地址,如在一個(gè)32位計(jì)算機(jī)的內(nèi)存中,內(nèi)存地址的編號(hào)按十六進(jìn)制從00000000-FFFFFFFF,共有232個(gè)內(nèi)存單元(字節(jié)),如果一個(gè)整型變量占據(jù)4個(gè)字節(jié),那么4個(gè)字節(jié)中編號(hào)最小的字節(jié)的地址即是該整型變量所占存儲(chǔ)單元的地址。通常我們把指向內(nèi)存存儲(chǔ)單元的地址叫指針。5.文件的定位與隨機(jī)讀寫(2)fseek()函數(shù)格式:fseek(fp,offset,origin);功能:把文件位置指針移動(dòng)到指定的位置,以便從當(dāng)前位置讀寫文件。說(shuō)明:1)offset是個(gè)long類型的數(shù)據(jù),叫位移量,是指從起始點(diǎn)“origin”,向前或向后移動(dòng)的字節(jié)數(shù)。2)origin表示用三個(gè)符號(hào)常量(在stdio.h中定義)或0,1,2分別表示“文件開始”、“當(dāng)前位置”、“文件末尾”。如下表所示。Origin文件位置值SEEK_SET文件開始0SEEK_CUR當(dāng)前位置1SEEK_END文件末尾2文件的讀寫
#include<stdlid.h>#include<stdio.h>structstudent_type{charname[10];intnum;intage;charsex;}stud[10];voidmain(){FILE*fp;inti;if((fp=fopen("stud_dat","rb"))==NULL)例10-10文件內(nèi)存有10個(gè)學(xué)生數(shù)據(jù),將單數(shù)學(xué)生數(shù)據(jù)輸入計(jì)算機(jī)并在屏幕上顯示。
{printf("cannotopenfile\n");exit(0);}for(i=0;i<10;i+=2){fseek(fp,i*sizeof(structstudent_type),0);fread(&stud[i],sizeof(structstudent_type),1,fp);printf("%s%d%d%c\n",stud[i].name,stud[i].num,stud[i].age,stud[i].sex);}fclose(fp);}文件的讀寫
在內(nèi)存中,每個(gè)內(nèi)存單元都有一個(gè)地址,如在一個(gè)32位計(jì)算機(jī)的內(nèi)存中,內(nèi)存地址的編號(hào)按十六進(jìn)制從00000000-FFFFFFFF,共有232個(gè)內(nèi)存單元(字節(jié)),如果一個(gè)整型變量占據(jù)4個(gè)字節(jié),那么4個(gè)字節(jié)中編號(hào)最小的字節(jié)的地址即是該整型變量所占存儲(chǔ)單元的地址。通常我們把指向內(nèi)存存儲(chǔ)單元的地址叫指針。5.文件的定位與隨機(jī)讀寫(3)ftell()函數(shù)格式:fell(fp);功能:返回當(dāng)前文件指針fp的讀寫位置,并用相對(duì)文件頭的位移量來(lái)表示。常用于保存當(dāng)前文件指針位置。說(shuō)明:1)該函數(shù)限于二進(jìn)制文件,對(duì)ASCII文本文件往往會(huì)出錯(cuò)。2)ftell()函數(shù)返回值為-1L時(shí),表示出錯(cuò)。例如:if((i=ftell(fp))==-1L)printf(“FILEerror\n”);文件的讀寫
#include"stdio.h"main(){FILE*fp;charfilename[80];longlength;gets(filename);fp=fopen(filename,"rb");if(fp==NULL)printf("filenotfound!\n");else{fseek(fp,0L,SEEK_END);length=ftell(fp);printf("LengthofFileis%1dbytes\n",length);fclose(fp);}}例10-11求文件長(zhǎng)度。
文件的讀寫
在內(nèi)存中,每個(gè)內(nèi)存單元都有一個(gè)地址,如在一個(gè)32位計(jì)算機(jī)的內(nèi)存中,內(nèi)存地址的編號(hào)按十六進(jìn)制從00000000-FFFFFFFF,共有232個(gè)內(nèi)存單元(字節(jié)),如果一個(gè)整型變量占據(jù)4個(gè)字節(jié),那么4個(gè)字節(jié)中編號(hào)最小的字節(jié)的地址即是該整型變量所占存儲(chǔ)單元的地址。通常我們把指向內(nèi)存存儲(chǔ)單元的地址叫指針。5.文件的定位與隨機(jī)讀寫(4)feof()函數(shù)格式:feof(文件指針);功能:用于檢查文件是否結(jié)束,如果是,返回1;否則返回0。說(shuō)明:1)對(duì)于文本文件,“EOF”為文件結(jié)束標(biāo)記(因?yàn)镋OF的值等于-1,而字符的ASCII碼不可能出現(xiàn)-1)。2)“EOF”不能作為二進(jìn)制文件結(jié)束標(biāo)記(因?yàn)镋OF的值等于-1,二進(jìn)制文件的數(shù)據(jù)可以是-1)。所以ANSIC提供feof()函數(shù)來(lái)判定文件是否結(jié)束。例如,如果把一個(gè)指定的二進(jìn)制文件磁盤文件從頭到尾按順序讀出并在屏幕上顯示出來(lái),可用下程序段實(shí)現(xiàn):while(!feof(fp))putchar(fgetc(fp));3)feof()函數(shù)同樣適合于文本文件。文件的讀寫
在內(nèi)存中,每個(gè)內(nèi)存單元都有一個(gè)地址,如在一個(gè)32位計(jì)算機(jī)的內(nèi)存中,內(nèi)存地址的編號(hào)按十六進(jìn)制從00000000-FFFFFFFF,共有232個(gè)內(nèi)存單元(字節(jié)),如果一個(gè)整型變量占據(jù)4個(gè)字節(jié),那么4個(gè)字節(jié)中編號(hào)最小的字節(jié)的地址即是該整型變量所占存儲(chǔ)單元的地址。通常我們把指向內(nèi)存存儲(chǔ)單元的地址叫指針。5.文件的定位與隨機(jī)讀寫(5)ferror()函數(shù)格式:ferror(文件指針);功能:檢查文件在使用各種輸入輸出函數(shù)進(jìn)行讀寫時(shí)是否出錯(cuò)。若出錯(cuò),則文件就會(huì)產(chǎn)生錯(cuò)誤標(biāo)志。說(shuō)明:1)每次調(diào)用文件輸入輸出函數(shù),均產(chǎn)生一個(gè)新的ferror函數(shù)值,所以應(yīng)及時(shí)測(cè)試。2)fopen打開文件時(shí),ferror函數(shù)初值自動(dòng)置為0。文件的讀寫
在內(nèi)存中,每個(gè)內(nèi)存單元都有一個(gè)地址,如在一個(gè)32位計(jì)算機(jī)的內(nèi)存中,內(nèi)存地址的編號(hào)按十六進(jìn)制從00000000-FFFFFFFF,共有232個(gè)內(nèi)存單元(字節(jié)),如果一個(gè)整型變量占據(jù)4個(gè)字節(jié),那么4個(gè)字節(jié)中編號(hào)最小的字節(jié)的地址即是該整型變量所占存儲(chǔ)單元的地址。通常我們把指向內(nèi)存存儲(chǔ)單元的地址叫指針。5.文件的定位與隨機(jī)讀寫(6)clearerr()函數(shù)格式:clearerr(文件指針);功能:使文件錯(cuò)誤標(biāo)志置為0,無(wú)返值。說(shuō)明:出錯(cuò)后,錯(cuò)誤標(biāo)志一直保留,直到對(duì)同一文件調(diào)clearerr(fp)或rewind或任何其它一個(gè)輸入輸出函數(shù)。文件的讀寫
#include<stdio.h>intmain(void){FILE*stream;stream=fopen("DUMMY.FIL","w");getc(stream);if(ferror(stream)){printf("ErrorreadingfromDUMMY.FIL\n");clearerr(stream);}if(!ferror(stream))printf("Errorindicatorcleared!");fclose(stream);return0;}例10-12ferror()與clearerr()舉例。
學(xué)生成績(jī)管理系統(tǒng)的數(shù)據(jù)存取
intfnWriteFile(char*Filename,char*rw,PSTUDENTs,intm){inti;FILE*fp;PSTUDENTstu=s;if((fp=fopen(Filename,rw))==NULL){ printf("\n\t\t打開文件%s\n",Filename); return0;}
1.添加文件存儲(chǔ)函數(shù)改進(jìn)學(xué)生成績(jī)管理系統(tǒng),將存儲(chǔ)在結(jié)構(gòu)數(shù)組中的數(shù)據(jù)寫入到文件data中去。參考代碼如下:
for(i=0;i<m;i++)if(fwrite(stu++,LEN,1,fp)!=1){printf(“%s文件存盤失?。n",Filename);getch();}fclose(fp);return1;}
學(xué)生成績(jī)管理系統(tǒng)的數(shù)據(jù)存取
intfnReadFile(char*Filename,char*rw,PSTUDENTs,int*m){FILE*fp;PSTUDENTstu=s;if((fp=fopen(Filename,rw))==NULL){printf("\n\t\t打開文件%s失敗\n",Filename);return0;}
2.添加文件裝入函數(shù)與文件存儲(chǔ)相反,文件裝入就是把磁盤文件讀入結(jié)構(gòu)數(shù)組以便進(jìn)一步的數(shù)據(jù)處理??紤]到函數(shù)模塊的一般性,將文件名、存儲(chǔ)的結(jié)構(gòu)數(shù)組,以及記錄總數(shù)均作為函數(shù)的形參。參考代碼如下:
*m=0;while(!feof(fp))if(fread(stu++,LEN,1,fp)==1){*m=*m+1;}/*統(tǒng)計(jì)當(dāng)前記錄條數(shù)*/fclose(fp);return1;}
學(xué)生成績(jī)管理系統(tǒng)的數(shù)據(jù)存取
…//省略intfnReadFile(char*Filename,char*rw,PSTUDENTs,int*m);intfnWriteFile(char*Filename,char*rw,PSTUDENTs,intm);intm; //m是記錄的條數(shù)voidmain() {intn=1;structstudents[50]; //定義結(jié)構(gòu)體數(shù)組do{fnMenuShow();//顯示菜單界面fnReadFile("data","ab+",s,&m); //讀數(shù)據(jù)scanf("%d",&n); //輸入選擇功能的編號(hào)system("cls");
3.修改主函數(shù)實(shí)現(xiàn)數(shù)據(jù)存取添加調(diào)用文件存儲(chǔ)和裝入函數(shù)語(yǔ)句。參考代碼如下:
{switch(n){case1:fnDataInput(s);break;case2:fnSearch(s);break;case3:fnDel(s);break;case4:fnModify(s);break;case5:fnInsert(s);break;case6:fnSort(s);break;case7:fnTotal(s);break;case8: fnScoreShow(s);break;default:break;}fnWriteFile("data","wb",s,m);//寫數(shù)據(jù)getch();}while(n);printf("\n\n\t\t謝謝您的使用!\n\t\t");}
拓展案例案例10-1寫出下面問(wèn)題的算法問(wèn)題描述從鍵盤輸入5個(gè)手機(jī)的信息(商標(biāo)名、價(jià)格、顏色),然后保存在文件“phone.dat”中。拓展案例
#include"stdio.h"structtype_phone{charchBrand[10];floatfPrice;charchColor[10];};voidmain(){structtype_phonestPhone[5];FILE*filePointer;inti;filePointer=fopen("Phone.dat","wb");if(filePointer==NULL){printf("cannotopenthisfile\n");exit(0);}for(i=0;i<5;i++){printf("pleaseinputthebrandname,price,color:");scanf("%s%f%s",stPhone[i].chBrand,&stPhone[i].fPrice,&stPhone[i].chColor);fwrite(&stPhone[i],sizeof(structtype_phone),1,filePointer);}fclose(filePointer);getch();}拓展案例案例10-2寫出下面問(wèn)題的算法問(wèn)題描述將文件“phone.dat”中的第1、3、5條記錄讀出,并給每條記錄的價(jià)格加上100元,然后將這三條記錄輸出在屏幕上(注意每條信息輸出為一行)。拓展案例
#include"stdio.h"#include"stdio.h"structtype_phone{charchBrand[10];floatfPrice;charchColor[10];};voidmain(){structtype_phonestPhone[3];FILE*filePointer;inti;filePointer=fopen("Phone.dat","rb");if(filePointer==NULL){printf("cannotopenthisfile\n");exit(0);}for(i=0;i<3;i++){fseek(filePointer,2*sizeof(structtype_phone),SEEK_SET);fread(stPhone[i],sizeof(structtype_phone),1,filePointer);stPhone.fPrice+=100;}fclose(filePointer);printf("BrnadNamePriceColor\n");for(i=0;i<3;i++){printf("%s\tt%f\t%s\n",stPhone[i].chBrand,stPhone[i].fPrice,stPhone[i].chColor);}getch();}
拓展活動(dòng)觀看央視新聞推出的八集系列節(jié)目--《大國(guó)工匠》。在IT行業(yè),有很多的人在自己的崗位上刻苦鉆研,創(chuàng)新創(chuàng)造。作為新時(shí)代IT青年,學(xué)習(xí)程序設(shè)計(jì),更需要大國(guó)工匠的“精雕細(xì)琢、精益求精”的工匠精神,從而使得軟件實(shí)現(xiàn)所
溫馨提示
- 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒(méi)有圖紙預(yù)覽就沒(méi)有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫(kù)網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 中藥材種植員創(chuàng)新應(yīng)用評(píng)優(yōu)考核試卷含答案
- 海水珍珠養(yǎng)殖工標(biāo)準(zhǔn)化強(qiáng)化考核試卷含答案
- 煤礦智能掘進(jìn)員保密測(cè)試考核試卷含答案
- 金屬打火機(jī)制作工測(cè)試驗(yàn)證測(cè)試考核試卷含答案
- 樟腦升華工崗前基礎(chǔ)晉升考核試卷含答案
- 2025年直流離子風(fēng)機(jī)項(xiàng)目發(fā)展計(jì)劃
- 2025年現(xiàn)場(chǎng)總線控制系統(tǒng)合作協(xié)議書
- 貓頭鷹介紹教學(xué)課件
- 貓和老鼠英語(yǔ)介紹
- 如何在AI搜索中勝出:提升在+AI+搜索引擎與大語(yǔ)言模型中可見性的終極指南
- 北電電影學(xué)電影評(píng)論2025年初試文常真題及答案解析
- 第14課 算法對(duì)生活的影響 課件 2025-2026學(xué)年六年級(jí)上冊(cè)信息技術(shù)浙教版
- 食品檢驗(yàn)檢測(cè)技術(shù)專業(yè)介紹
- 2025年事業(yè)單位筆試-貴州-貴州財(cái)務(wù)(醫(yī)療招聘)歷年參考題庫(kù)含答案解析(5卷套題【單項(xiàng)選擇100題】)
- 二年級(jí)數(shù)學(xué)上冊(cè)100道口算題大全(每日一練共12份)
- 藥店物價(jià)收費(fèi)員管理制度
- 數(shù)據(jù)風(fēng)險(xiǎn)監(jiān)測(cè)管理辦法
- 國(guó)家開放大學(xué)《公共政策概論》形考任務(wù)1-4答案
- 肝惡性腫瘤腹水護(hù)理
- 兒童語(yǔ)言發(fā)育遲緩課件
- 2025年河南省鄭州市中考一模英語(yǔ)試題及答案
評(píng)論
0/150
提交評(píng)論