版權(quán)說(shuō)明:本文檔由用戶(hù)提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
1、C語(yǔ)言程序設(shè)計(jì)與數(shù)據(jù)結(jié)構(gòu)第第10章章 文件讀寫(xiě)文件讀寫(xiě)C語(yǔ)言程序設(shè)計(jì)與數(shù)據(jù)結(jié)構(gòu)教學(xué)提示:教學(xué)提示:存儲(chǔ)在變量和數(shù)組(即內(nèi)存)中的數(shù)據(jù)存儲(chǔ)在變量和數(shù)組(即內(nèi)存)中的數(shù)據(jù)是臨時(shí)的,這些數(shù)據(jù)在程序運(yùn)行結(jié)束后會(huì)消失,而是臨時(shí)的,這些數(shù)據(jù)在程序運(yùn)行結(jié)束后會(huì)消失,而文件可以用來(lái)永久地保存大量的數(shù)據(jù)。如果有些數(shù)文件可以用來(lái)永久地保存大量的數(shù)據(jù)。如果有些數(shù)據(jù)需要反復(fù)使用或永久保存,應(yīng)該考慮使用文件來(lái)?yè)?jù)需要反復(fù)使用或永久保存,應(yīng)該考慮使用文件來(lái)完成。完成。教學(xué)要求:教學(xué)要求:本章要掌握本章要掌握文件在讀寫(xiě)之前必須打開(kāi),文件在讀寫(xiě)之前必須打開(kāi),讀寫(xiě)結(jié)束必須關(guān)閉。文件可按只讀、只寫(xiě)、讀寫(xiě)、讀寫(xiě)結(jié)束必須關(guān)閉。文件可按
2、只讀、只寫(xiě)、讀寫(xiě)、追加四種操作方式打開(kāi),同時(shí)還必須指定文件的類(lèi)追加四種操作方式打開(kāi),同時(shí)還必須指定文件的類(lèi)型是二進(jìn)制文件還是文本文件。文件可按字節(jié),字型是二進(jìn)制文件還是文本文件。文件可按字節(jié),字符串,數(shù)據(jù)塊為單位讀寫(xiě),文件也可按指定的格式符串,數(shù)據(jù)塊為單位讀寫(xiě),文件也可按指定的格式進(jìn)行讀寫(xiě)。文件內(nèi)部的位置指針可指示當(dāng)前的讀寫(xiě)進(jìn)行讀寫(xiě)。文件內(nèi)部的位置指針可指示當(dāng)前的讀寫(xiě)位置,移動(dòng)該指針可以對(duì)文件實(shí)現(xiàn)隨機(jī)讀寫(xiě)。位置,移動(dòng)該指針可以對(duì)文件實(shí)現(xiàn)隨機(jī)讀寫(xiě)。 C語(yǔ)言程序設(shè)計(jì)與數(shù)據(jù)結(jié)構(gòu)10.1文件概述與文件指針 所謂所謂“文件文件”是指一組相關(guān)數(shù)據(jù)的有序集合。是指一組相關(guān)數(shù)據(jù)的有序集合。 我們?cè)谇皫渍轮幸讯?/p>
3、次接觸使用過(guò)文件,例如我們?cè)谇皫渍轮幸讯啻谓佑|使用過(guò)文件,例如源程序文件、目標(biāo)文件、可執(zhí)行文件、庫(kù)文件源程序文件、目標(biāo)文件、可執(zhí)行文件、庫(kù)文件 (頭頭文件文件)等。等。 C語(yǔ)言程序設(shè)計(jì)與數(shù)據(jù)結(jié)構(gòu)10.1.1 文件分類(lèi)文件通常是駐留在外部介質(zhì)文件通常是駐留在外部介質(zhì)(如磁盤(pán)等如磁盤(pán)等)上的,在使上的,在使用時(shí)才調(diào)入內(nèi)存中來(lái)。用時(shí)才調(diào)入內(nèi)存中來(lái)。C語(yǔ)言把文件看作是由一個(gè)語(yǔ)言把文件看作是由一個(gè)個(gè)字符(字節(jié))的數(shù)據(jù)順序組成的。它把數(shù)據(jù)看作個(gè)字符(字節(jié))的數(shù)據(jù)順序組成的。它把數(shù)據(jù)看作是連續(xù)的字符(字節(jié))流,這樣它對(duì)文件的存取實(shí)是連續(xù)的字符(字節(jié))流,這樣它對(duì)文件的存取實(shí)際上是以字符(字節(jié))為單位的。輸入
4、輸出的數(shù)據(jù)際上是以字符(字節(jié))為單位的。輸入輸出的數(shù)據(jù)流的開(kāi)始和結(jié)束只受程序的控制而不受特定符號(hào)流的開(kāi)始和結(jié)束只受程序的控制而不受特定符號(hào)(比如回車(chē)換行符)的控制。也就是說(shuō),(比如回車(chē)換行符)的控制。也就是說(shuō),C語(yǔ)言在語(yǔ)言在輸出數(shù)據(jù)到文件中時(shí),并不會(huì)自動(dòng)增加回車(chē)換行符輸出數(shù)據(jù)到文件中時(shí),并不會(huì)自動(dòng)增加回車(chē)換行符以示結(jié)束,在輸入時(shí)也不會(huì)以讀入回車(chē)換行符作為以示結(jié)束,在輸入時(shí)也不會(huì)以讀入回車(chē)換行符作為數(shù)據(jù)的間隔。數(shù)據(jù)的間隔。C語(yǔ)言程序設(shè)計(jì)與數(shù)據(jù)結(jié)構(gòu)10.1.1 文件分類(lèi)文件分類(lèi)從用戶(hù)的角度看,文件可分為普通文件和設(shè)備文件從用戶(hù)的角度看,文件可分為普通文件和設(shè)備文件兩種。兩種。根據(jù)文件的存儲(chǔ)形式,可
5、分為根據(jù)文件的存儲(chǔ)形式,可分為ASCII碼文件和二進(jìn)碼文件和二進(jìn)制文件兩種:制文件兩種: (1) ASCII文件也稱(chēng)為文本文件,這種文件在磁盤(pán)中文件也稱(chēng)為文本文件,這種文件在磁盤(pán)中存放時(shí)每個(gè)字符對(duì)應(yīng)一個(gè)字節(jié),用于存放對(duì)應(yīng)的存放時(shí)每個(gè)字符對(duì)應(yīng)一個(gè)字節(jié),用于存放對(duì)應(yīng)的ASCII碼。例如一個(gè)整型數(shù)據(jù)碼。例如一個(gè)整型數(shù)據(jù)1234在文本文件中占在文本文件中占4個(gè)字節(jié)。我們用個(gè)字節(jié)。我們用Windows自帶的記事本軟件打開(kāi)自帶的記事本軟件打開(kāi)該類(lèi)型文件能讀懂文件中的內(nèi)容。該類(lèi)型文件能讀懂文件中的內(nèi)容。 (2) (2) 二進(jìn)制文件是按二進(jìn)制的編碼方式來(lái)存放文件二進(jìn)制文件是按二進(jìn)制的編碼方式來(lái)存放文件的。例如
6、一個(gè)整型數(shù)據(jù)的。例如一個(gè)整型數(shù)據(jù)230在二進(jìn)制文件中占在二進(jìn)制文件中占2個(gè)字個(gè)字節(jié)。節(jié)。C語(yǔ)言程序設(shè)計(jì)與數(shù)據(jù)結(jié)構(gòu)10.1.2 文件類(lèi)型指針 在語(yǔ)言中要使用文件,必須用一個(gè)指針變量指向一個(gè)在語(yǔ)言中要使用文件,必須用一個(gè)指針變量指向一個(gè)文件,這個(gè)指針?lè)Q為文件指針。通過(guò)文件指針就可對(duì)它所文件,這個(gè)指針?lè)Q為文件指針。通過(guò)文件指針就可對(duì)它所指的文件進(jìn)行各種操作。指的文件進(jìn)行各種操作。 定義文件指針的一般形式為:定義文件指針的一般形式為:FILE *指針變量標(biāo)識(shí)符;指針變量標(biāo)識(shí)符; 其中其中FILE必須為大寫(xiě),它是在頭文件必須為大寫(xiě),它是在頭文件stdio.h中定義的一中定義的一個(gè)結(jié)構(gòu)體,該結(jié)構(gòu)體中含有文
7、件名、文件狀態(tài)和文件當(dāng)前個(gè)結(jié)構(gòu)體,該結(jié)構(gòu)體中含有文件名、文件狀態(tài)和文件當(dāng)前位置等信息,我們編程時(shí)不必關(guān)心位置等信息,我們編程時(shí)不必關(guān)心FILE結(jié)構(gòu)的細(xì)節(jié)。結(jié)構(gòu)的細(xì)節(jié)。 例如:例如: FILE *fp;表示定義了一個(gè)名為表示定義了一個(gè)名為fp的文件指針。的文件指針。如果變量如果變量fp已被正確賦值,則可以根據(jù)結(jié)構(gòu)變量已被正確賦值,則可以根據(jù)結(jié)構(gòu)變量fp所提供的所提供的信息找到一個(gè)文件并實(shí)施對(duì)該文件的操作。習(xí)慣上把信息找到一個(gè)文件并實(shí)施對(duì)該文件的操作。習(xí)慣上把fp稱(chēng)為稱(chēng)為指向一個(gè)文件的指針。指向一個(gè)文件的指針。 C語(yǔ)言程序設(shè)計(jì)與數(shù)據(jù)結(jié)構(gòu)10.2文件的打開(kāi)與關(guān)閉 使用文件必須遵循使用文件必須遵循“先
8、打開(kāi),再對(duì)文件進(jìn)行讀先打開(kāi),再對(duì)文件進(jìn)行讀寫(xiě)操作,最后關(guān)閉文件寫(xiě)操作,最后關(guān)閉文件”的原則。的原則。 在語(yǔ)言中,對(duì)文件的這些操作都可以由庫(kù)函在語(yǔ)言中,對(duì)文件的這些操作都可以由庫(kù)函數(shù)來(lái)完成,對(duì)用到的庫(kù)函數(shù)的聲明包含在文件數(shù)來(lái)完成,對(duì)用到的庫(kù)函數(shù)的聲明包含在文件stdio.h中,因此在編程中要操作文件時(shí),要使用頭中,因此在編程中要操作文件時(shí),要使用頭文件包含命令文件包含命令#include “stdio.h”。 C語(yǔ)言程序設(shè)計(jì)與數(shù)據(jù)結(jié)構(gòu)10.2.1文件的打開(kāi) 所謂打開(kāi)文件,實(shí)際上是獲得文件的各種有關(guān)所謂打開(kāi)文件,實(shí)際上是獲得文件的各種有關(guān)信息,并使文件指針指向該文件,以便進(jìn)行下一步信息,并使文件指
9、針指向該文件,以便進(jìn)行下一步操作。操作。C語(yǔ)言提供了函數(shù)語(yǔ)言提供了函數(shù)fopen來(lái)打開(kāi)文件。來(lái)打開(kāi)文件。 其使用格式為:其使用格式為: 文件指針名文件指針名=fopen(文件名文件名, 使用文件方式使用文件方式); 其中,其中,“文件指針名文件指針名”必須是已被說(shuō)明為必須是已被說(shuō)明為FILE 類(lèi)類(lèi)型的指針變量;型的指針變量;“文件名文件名”是將被打開(kāi)的文件的文是將被打開(kāi)的文件的文件名,通常是字符串常量或字符串?dāng)?shù)組(注意路徑件名,通常是字符串常量或字符串?dāng)?shù)組(注意路徑的分隔符應(yīng)使用的分隔符應(yīng)使用“”););“使用文件方式使用文件方式”是指是指文件的類(lèi)型和操作要求,是一個(gè)由一對(duì)雙引號(hào)括起文件的類(lèi)型
10、和操作要求,是一個(gè)由一對(duì)雙引號(hào)括起來(lái)的字符串,共有來(lái)的字符串,共有12種種,具體的符號(hào)表示和含義見(jiàn)具體的符號(hào)表示和含義見(jiàn)表表10-1。 C語(yǔ)言程序設(shè)計(jì)與數(shù)據(jù)結(jié)構(gòu)文件使用方式文件使用方式含義含義“rt”打開(kāi)一個(gè)已經(jīng)存在的文本文件,只能讀取數(shù)據(jù)“wt”打開(kāi)一個(gè)文本文件,只能寫(xiě)入數(shù)據(jù)。若文件不存在,則自動(dòng)建立一個(gè)新文件接受寫(xiě)入的數(shù)據(jù);若文件存在,則刪除文件中原有內(nèi)容,并接受寫(xiě)入的數(shù)據(jù)(覆蓋)“a”打開(kāi)一個(gè)已經(jīng)存在的文本文件,只能寫(xiě)入數(shù)據(jù)并且追加在文件的尾部“r+”打開(kāi)一個(gè)已經(jīng)存在的文本文件,可以讀取數(shù)據(jù),也可以寫(xiě)入數(shù)據(jù)“w+”打開(kāi)一個(gè)文本文件,可以讀取數(shù)據(jù),也可以寫(xiě)入數(shù)據(jù)。若文件不存在,則自動(dòng)建立一
11、個(gè)新文件接受寫(xiě)入的數(shù)據(jù);若文件存在,則刪除文件中原有內(nèi)容,并接受寫(xiě)入的數(shù)據(jù)(覆蓋)“a+”打開(kāi)一個(gè)已經(jīng)存在的文本文件,可以讀取數(shù)據(jù),也可以寫(xiě)入數(shù)據(jù)(追加在文件的尾部)“rb”打開(kāi)一個(gè)已經(jīng)存在的二進(jìn)制文件,只能讀取數(shù)據(jù)“wb”打開(kāi)一個(gè)二進(jìn)制文件,只能寫(xiě)入數(shù)據(jù)。若文件不存在,則自動(dòng)建立一個(gè)新文件接受寫(xiě)入的數(shù)據(jù);若文件存在,則刪除文件中原有內(nèi)容并接受寫(xiě)入的數(shù)據(jù)(覆蓋)“ab”打開(kāi)一個(gè)已經(jīng)存在的二進(jìn)制文件,只能寫(xiě)入數(shù)據(jù)(追加在文件的尾部)“rb+”打開(kāi)一個(gè)已經(jīng)存在的二進(jìn)制文件,可以讀取數(shù)據(jù),也可以寫(xiě)入數(shù)據(jù)“wb+”打開(kāi)一個(gè)二進(jìn)制文件,可以讀取數(shù)據(jù),也可以寫(xiě)入數(shù)據(jù)。若文件不存在,則自動(dòng)建立一個(gè)新文件接受
12、寫(xiě)入的數(shù)據(jù);若文件存在,則刪除文件中原有內(nèi)容,并接受寫(xiě)入的數(shù)據(jù)(覆蓋)“ab+”打開(kāi)一個(gè)已經(jīng)存在的二進(jìn)制文件,可以讀取數(shù)據(jù),也可以寫(xiě)入數(shù)據(jù)(追加在文件的尾部)C語(yǔ)言程序設(shè)計(jì)與數(shù)據(jù)結(jié)構(gòu)fopen打開(kāi)文件 例如:例如: FILE *fpTa; fpTa=fopen(c:cprogramabc,rb); /*反斜線反斜線“”中的第一個(gè)表示轉(zhuǎn)義字符中的第一個(gè)表示轉(zhuǎn)義字符*/ 其意義是打開(kāi)其意義是打開(kāi)C驅(qū)動(dòng)器磁盤(pán)的驅(qū)動(dòng)器磁盤(pán)的cprogram子目錄下的子目錄下的文件文件abc,這是一個(gè)二進(jìn)制文件,只允許按二進(jìn)制這是一個(gè)二進(jìn)制文件,只允許按二進(jìn)制方式進(jìn)行讀操作。方式進(jìn)行讀操作。又如:又如: FILE *f
13、p; fp= fopen (mytest1.txt,r); 其意義是在當(dāng)前目錄下打開(kāi)文件其意義是在當(dāng)前目錄下打開(kāi)文件mytest1.txt,只允只允許進(jìn)行許進(jìn)行“讀讀”操作,并操作,并使使fp指向該文件。指向該文件。 C語(yǔ)言程序設(shè)計(jì)與數(shù)據(jù)結(jié)構(gòu)10.2.2文件關(guān)閉函數(shù) 在使用完一個(gè)文件以后,應(yīng)該將該文件關(guān)閉,在使用完一個(gè)文件以后,應(yīng)該將該文件關(guān)閉,以防止它再被調(diào)用或丟失數(shù)據(jù)。以防止它再被調(diào)用或丟失數(shù)據(jù)。“關(guān)閉關(guān)閉”就是使文就是使文件指針變量不再指向該文件,也就是文件指針變量件指針變量不再指向該文件,也就是文件指針變量與該文件與該文件“斷開(kāi)斷開(kāi)”,此后不能通過(guò)該指針對(duì)原來(lái)與,此后不能通過(guò)該指針對(duì)原
14、來(lái)與其相聯(lián)系的文件進(jìn)行讀、寫(xiě)操作(除非再次打開(kāi)該其相聯(lián)系的文件進(jìn)行讀、寫(xiě)操作(除非再次打開(kāi)該文件,使文件指針變量重新指向該文件)。文件,使文件指針變量重新指向該文件)。 fclose()函數(shù)用來(lái)關(guān)閉一個(gè)已經(jīng)由函數(shù)用來(lái)關(guān)閉一個(gè)已經(jīng)由fopen()函數(shù)打開(kāi)函數(shù)打開(kāi)的文件,正常完成關(guān)閉文件操作時(shí),的文件,正常完成關(guān)閉文件操作時(shí),fclose函數(shù)返函數(shù)返回值為回值為0,有錯(cuò)誤發(fā)生則返回非零值。,有錯(cuò)誤發(fā)生則返回非零值。其調(diào)用的一般形式為:其調(diào)用的一般形式為: fclose(文件指針文件指針); 例如:例如: fclose(fp); C語(yǔ)言程序設(shè)計(jì)與數(shù)據(jù)結(jié)構(gòu)10.3 文件位置指針的有關(guān)函數(shù) 在文件內(nèi)部有
15、一個(gè)位置指針,用來(lái)指向文件的在文件內(nèi)部有一個(gè)位置指針,用來(lái)指向文件的當(dāng)前讀寫(xiě)字節(jié)。在文件打開(kāi)時(shí),該位置指針總是指當(dāng)前讀寫(xiě)字節(jié)。在文件打開(kāi)時(shí),該位置指針總是指向文件的第一個(gè)字節(jié)。使用下面章節(jié)介紹的向文件的第一個(gè)字節(jié)。使用下面章節(jié)介紹的fgetc等等函數(shù)對(duì)文件進(jìn)行讀寫(xiě)后,該位置指針將自動(dòng)向后移函數(shù)對(duì)文件進(jìn)行讀寫(xiě)后,該位置指針將自動(dòng)向后移動(dòng)。動(dòng)。 但文件指針和文件內(nèi)部的位置指針不是一回事。但文件指針和文件內(nèi)部的位置指針不是一回事。文件指針是指向整個(gè)文件的,須在程序中定義說(shuō)明,文件指針是指向整個(gè)文件的,須在程序中定義說(shuō)明,只要不重新賦值,文件指針的值是不變的。文件內(nèi)只要不重新賦值,文件指針的值是不變的
16、。文件內(nèi)部的位置指針用以指示文件內(nèi)部的當(dāng)前讀寫(xiě)位置,部的位置指針用以指示文件內(nèi)部的當(dāng)前讀寫(xiě)位置,每讀寫(xiě)一次,該指針均自動(dòng)向后移動(dòng),它不需在程每讀寫(xiě)一次,該指針均自動(dòng)向后移動(dòng),它不需在程序中定義說(shuō)明,而是由系統(tǒng)自動(dòng)設(shè)置的。序中定義說(shuō)明,而是由系統(tǒng)自動(dòng)設(shè)置的。 C語(yǔ)言程序設(shè)計(jì)與數(shù)據(jù)結(jié)構(gòu)順序讀寫(xiě)和隨機(jī)讀寫(xiě)文件的讀寫(xiě)方式分為順序讀寫(xiě)和隨機(jī)讀寫(xiě)。文件的讀寫(xiě)方式分為順序讀寫(xiě)和隨機(jī)讀寫(xiě)。(1) (1) 順序讀寫(xiě)即讀寫(xiě)文件只能從頭開(kāi)始,順序讀寫(xiě)各個(gè)數(shù)據(jù)。順序讀寫(xiě)即讀寫(xiě)文件只能從頭開(kāi)始,順序讀寫(xiě)各個(gè)數(shù)據(jù)。 但在實(shí)際問(wèn)題中常要求只讀寫(xiě)文件中某一指定的部分,為但在實(shí)際問(wèn)題中常要求只讀寫(xiě)文件中某一指定的部分,為了解決
17、這個(gè)問(wèn)題可移動(dòng)文件內(nèi)部的位置指針到需要讀寫(xiě)的了解決這個(gè)問(wèn)題可移動(dòng)文件內(nèi)部的位置指針到需要讀寫(xiě)的位置,再進(jìn)行讀寫(xiě),這種讀寫(xiě)稱(chēng)為隨機(jī)讀寫(xiě)。位置,再進(jìn)行讀寫(xiě),這種讀寫(xiě)稱(chēng)為隨機(jī)讀寫(xiě)。 (2) (2) 隨機(jī)讀寫(xiě)可以通過(guò)利用系統(tǒng)函數(shù)去主動(dòng)移動(dòng)文件內(nèi)部隨機(jī)讀寫(xiě)可以通過(guò)利用系統(tǒng)函數(shù)去主動(dòng)移動(dòng)文件內(nèi)部的位置指針來(lái)實(shí)現(xiàn)。這樣的函數(shù)主要有兩個(gè),即的位置指針來(lái)實(shí)現(xiàn)。這樣的函數(shù)主要有兩個(gè),即 rewind 函函數(shù)和數(shù)和fseek函數(shù)。實(shí)現(xiàn)隨機(jī)讀寫(xiě)的關(guān)鍵是要按要求移動(dòng)位置函數(shù)。實(shí)現(xiàn)隨機(jī)讀寫(xiě)的關(guān)鍵是要按要求移動(dòng)位置指針,這稱(chēng)為文件的定位。指針,這稱(chēng)為文件的定位。在移動(dòng)位置指針之后,即可用在移動(dòng)位置指針之后,即可用后面介紹的
18、任一種讀寫(xiě)函數(shù)進(jìn)行讀寫(xiě)。由于一般是讀寫(xiě)一后面介紹的任一種讀寫(xiě)函數(shù)進(jìn)行讀寫(xiě)。由于一般是讀寫(xiě)一個(gè)數(shù)據(jù)據(jù)塊,因此常用個(gè)數(shù)據(jù)據(jù)塊,因此常用fread和和fwrite函數(shù)。函數(shù)。 C語(yǔ)言程序設(shè)計(jì)與數(shù)據(jù)結(jié)構(gòu)rewind函數(shù)rewind函數(shù)的功能是把文件內(nèi)部的位置指針移到函數(shù)的功能是把文件內(nèi)部的位置指針移到文件首。其調(diào)用形式為:文件首。其調(diào)用形式為: rewind(文件指針文件指針);“文件指針文件指針”指向被移動(dòng)的文件。指向被移動(dòng)的文件。 C語(yǔ)言程序設(shè)計(jì)與數(shù)據(jù)結(jié)構(gòu)fseek函數(shù)fseek函數(shù)用來(lái)移動(dòng)文件內(nèi)部位置指針,其調(diào)用形式函數(shù)用來(lái)移動(dòng)文件內(nèi)部位置指針,其調(diào)用形式為:為: fseek(文件指針文件指針,
19、位移量位移量,起始點(diǎn)起始點(diǎn));其中:其中:“文件指針文件指針”指向被移動(dòng)的文件。指向被移動(dòng)的文件。 “位移量位移量”表示移動(dòng)的字節(jié)數(shù),要求位移量是表示移動(dòng)的字節(jié)數(shù),要求位移量是long型數(shù)據(jù),以便在文件長(zhǎng)度大于型數(shù)據(jù),以便在文件長(zhǎng)度大于64KB 時(shí)不會(huì)出時(shí)不會(huì)出錯(cuò)。當(dāng)用常量表示位移量時(shí),要求加后綴錯(cuò)。當(dāng)用常量表示位移量時(shí),要求加后綴“L”。 “起始點(diǎn)起始點(diǎn)”表示從何處開(kāi)始計(jì)算位移量,規(guī)定的表示從何處開(kāi)始計(jì)算位移量,規(guī)定的起始點(diǎn)有三種:文件首,當(dāng)前位置和文件尾。起始點(diǎn)有三種:文件首,當(dāng)前位置和文件尾。 C語(yǔ)言程序設(shè)計(jì)與數(shù)據(jù)結(jié)構(gòu)起始點(diǎn)起始點(diǎn)表示符號(hào)表示符號(hào)數(shù)字表示數(shù)字表示文件首文件首SEEK_SE
20、T0當(dāng)前位置當(dāng)前位置SEEK_CUR1文件末尾文件末尾SEEK_END2C語(yǔ)言程序設(shè)計(jì)與數(shù)據(jù)結(jié)構(gòu)例如:例如:fseek(fp,100L,0); /* 將文件位置指針移到離文將文件位置指針移到離文件頭件頭100個(gè)字節(jié)處個(gè)字節(jié)處 */fseek(fp,20L,1); /* 將文件位置指針從當(dāng)前位置將文件位置指針從當(dāng)前位置后移后移20個(gè)字節(jié)的位置個(gè)字節(jié)的位置 */fseek(fp,-10L,SEEK_END); /* 將文件位置指針從文將文件位置指針從文件末尾前移件末尾前移10個(gè)字節(jié)的位置個(gè)字節(jié)的位置 */ 注意:注意:fseek函數(shù)一般用于二進(jìn)制文件。在文本文函數(shù)一般用于二進(jìn)制文件。在文本文件中由
21、于要進(jìn)行轉(zhuǎn)換,往往計(jì)算的位置會(huì)出現(xiàn)錯(cuò)誤。件中由于要進(jìn)行轉(zhuǎn)換,往往計(jì)算的位置會(huì)出現(xiàn)錯(cuò)誤。 C語(yǔ)言程序設(shè)計(jì)與數(shù)據(jù)結(jié)構(gòu) ftell函數(shù)函數(shù): : 用來(lái)得到流式文件中的當(dāng)前位置,用用來(lái)得到流式文件中的當(dāng)前位置,用相對(duì)于文件開(kāi)頭的位移量來(lái)表示。如返回相對(duì)于文件開(kāi)頭的位移量來(lái)表示。如返回-1L則表則表示出錯(cuò)。示出錯(cuò)。 例如:例如:long a; a=ftell(fp); 文件結(jié)束檢測(cè)函數(shù)文件結(jié)束檢測(cè)函數(shù)feof函數(shù)函數(shù)feof( )判斷文件是否處于文件結(jié)束位置,如文判斷文件是否處于文件結(jié)束位置,如文件結(jié)束,則返回值為件結(jié)束,則返回值為1,否則為,否則為0。其調(diào)用格式為:其調(diào)用格式為: feof(文件指針文
22、件指針);說(shuō)明:說(shuō)明:文件結(jié)束標(biāo)志文件結(jié)束標(biāo)志EOF (每個(gè)文件末有一結(jié)束標(biāo)每個(gè)文件末有一結(jié)束標(biāo)志志EOF,值為值為-1)只適用于判斷文本文件是否結(jié)束。只適用于判斷文本文件是否結(jié)束。而函數(shù)而函數(shù)feof( )則對(duì)文本文件和二進(jìn)制文件都適用。則對(duì)文本文件和二進(jìn)制文件都適用。 C語(yǔ)言程序設(shè)計(jì)與數(shù)據(jù)結(jié)構(gòu)10.4讀寫(xiě)文件 10.4.1字符讀寫(xiě)函數(shù)字符讀寫(xiě)函數(shù)fgetc和和fputc 是以字符是以字符(字節(jié)字節(jié))為單位的讀寫(xiě)函數(shù)。每次可從文件讀出或?yàn)閱挝坏淖x寫(xiě)函數(shù)。每次可從文件讀出或向文件寫(xiě)入一個(gè)字符。向文件寫(xiě)入一個(gè)字符。字符輸入字符輸入/ /出函數(shù)所處理的文件可以出函數(shù)所處理的文件可以是文本文件,也可
23、以是二進(jìn)制文件。是文本文件,也可以是二進(jìn)制文件。 10.4.2字符串讀寫(xiě)函數(shù)字符串讀寫(xiě)函數(shù)fgets和和fputs 處理的文件一般是文本文件,讀寫(xiě)的數(shù)據(jù)以字符串為單位。處理的文件一般是文本文件,讀寫(xiě)的數(shù)據(jù)以字符串為單位。10.4.3數(shù)據(jù)塊讀寫(xiě)函數(shù)數(shù)據(jù)塊讀寫(xiě)函數(shù)fread和和fwtrite 用于整塊數(shù)據(jù)的讀寫(xiě)函數(shù)??捎脕?lái)讀寫(xiě)一組數(shù)據(jù),如一用于整塊數(shù)據(jù)的讀寫(xiě)函數(shù)??捎脕?lái)讀寫(xiě)一組數(shù)據(jù),如一個(gè)數(shù)組、一個(gè)結(jié)構(gòu)變量的值等。個(gè)數(shù)組、一個(gè)結(jié)構(gòu)變量的值等。10.4.4格式化讀寫(xiě)函數(shù)格式化讀寫(xiě)函數(shù)fscanf和和fprintf 與前面使用的與前面使用的scanf和和printf 函數(shù)的功能相似,都是格式函數(shù)的功能
24、相似,都是格式化讀寫(xiě)函數(shù)。兩者的區(qū)別在于化讀寫(xiě)函數(shù)。兩者的區(qū)別在于fscanf函數(shù)和函數(shù)和fprintf函數(shù)的讀函數(shù)的讀寫(xiě)對(duì)象不是鍵盤(pán)和顯示器,而是磁盤(pán)文件。寫(xiě)對(duì)象不是鍵盤(pán)和顯示器,而是磁盤(pán)文件。 C語(yǔ)言程序設(shè)計(jì)與數(shù)據(jù)結(jié)構(gòu)讀字符函數(shù)fgetcfgetc函數(shù)的功能是從指定的文件中讀取一個(gè)字符,函數(shù)調(diào)用函數(shù)的功能是從指定的文件中讀取一個(gè)字符,函數(shù)調(diào)用的一般形式為:的一般形式為: 字符變量字符變量=fgetc(文件指針文件指針);例如:例如:ch=fgetc(fp); 其意義是從打開(kāi)的文件其意義是從打開(kāi)的文件fp中讀取一個(gè)字符中讀取一個(gè)字符并送入字符變量并送入字符變量ch中。中。對(duì)于對(duì)于fgetc函
25、數(shù)的使用有以下幾點(diǎn)說(shuō)明:函數(shù)的使用有以下幾點(diǎn)說(shuō)明:( (1) 在在fgetc函數(shù)調(diào)用中,讀取的文件必須是以讀或讀寫(xiě)方式打函數(shù)調(diào)用中,讀取的文件必須是以讀或讀寫(xiě)方式打開(kāi)的。開(kāi)的。( (2) 讀取字符的結(jié)果也可以不向字符變量賦值,例如讀取字符的結(jié)果也可以不向字符變量賦值,例如fgetc(fp); 但是讀出的字符不能保存。但是讀出的字符不能保存。 ( (3) 文件內(nèi)部的位置指針在文件打開(kāi)時(shí)總是指向文件的第一文件內(nèi)部的位置指針在文件打開(kāi)時(shí)總是指向文件的第一個(gè)字節(jié)。使用個(gè)字節(jié)。使用fgetc函數(shù)后,該位置指針將向后移動(dòng)一個(gè)字函數(shù)后,該位置指針將向后移動(dòng)一個(gè)字節(jié)。因此可連續(xù)多次使用節(jié)。因此可連續(xù)多次使用f
26、getc函數(shù)來(lái)讀取多個(gè)字符。函數(shù)來(lái)讀取多個(gè)字符。 C語(yǔ)言程序設(shè)計(jì)與數(shù)據(jù)結(jié)構(gòu)【例【例10.1】將】將C盤(pán)根目錄下的文本文件盤(pán)根目錄下的文本文件test1.txt的內(nèi)容在屏幕上輸出。的內(nèi)容在屏幕上輸出。#includemain() FILE *fp; /* 定義了文件指針定義了文件指針fp */ char ch; if(fp=fopen(c:test1.txt,r)=NULL) /*以讀文本文件方式打開(kāi)并使以讀文本文件方式打開(kāi)并使fp指向該文件指向該文件*/ printf(nCannot open file, strike any key to exit!); getchar(); exit(1)
27、; ch=fgetc(fp); /* 先讀出一個(gè)字符,然后進(jìn)入循環(huán)先讀出一個(gè)字符,然后進(jìn)入循環(huán) */ while(ch!=EOF) /* 判斷文件是否結(jié)束判斷文件是否結(jié)束 */ putchar(ch); /*把該字符顯示在屏幕上把該字符顯示在屏幕上*/ ch=fgetc(fp); /*再讀入下一字符再讀入下一字符 */ fclose(fp); printf(“n”); 本例程序的功能是從文件中逐個(gè)讀取字符,并在屏幕上顯示。如打開(kāi)文件出錯(cuò),給出提示并退出程序。只本例程序的功能是從文件中逐個(gè)讀取字符,并在屏幕上顯示。如打開(kāi)文件出錯(cuò),給出提示并退出程序。只要讀出的字符不是文件結(jié)束標(biāo)志要讀出的字符不是
28、文件結(jié)束標(biāo)志EOF,就把該字符顯示在屏幕上,再讀入下一字符。每讀一次,文件就把該字符顯示在屏幕上,再讀入下一字符。每讀一次,文件內(nèi)部的位置指針向后移動(dòng)一個(gè)字符,文件結(jié)束時(shí),該指針指向內(nèi)部的位置指針向后移動(dòng)一個(gè)字符,文件結(jié)束時(shí),該指針指向EOF。執(zhí)行本程序?qū)@示文件執(zhí)行本程序?qū)@示文件c:test1.txt的所有內(nèi)容。的所有內(nèi)容。 C語(yǔ)言程序設(shè)計(jì)與數(shù)據(jù)結(jié)構(gòu)寫(xiě)字符函數(shù)fputc( ) fputc函數(shù)的功能是把一個(gè)字符寫(xiě)入指定的文件中,函數(shù)的功能是把一個(gè)字符寫(xiě)入指定的文件中,如寫(xiě)入成功則返回寫(xiě)入的字符,否則返回一個(gè)如寫(xiě)入成功則返回寫(xiě)入的字符,否則返回一個(gè)EOF,可用此來(lái)判斷寫(xiě)入是否成功??捎么藖?lái)判斷
29、寫(xiě)入是否成功。 函數(shù)調(diào)用形式為:函數(shù)調(diào)用形式為: fputc(字符量,文件指針字符量,文件指針); /* 字符量是待寫(xiě)入的字符常量或變量字符量是待寫(xiě)入的字符常量或變量 */例如:例如:fputc( x, fp );其意義是把字符其意義是把字符x寫(xiě)入寫(xiě)入fp所指向的文件的位置指針的當(dāng)前位置中。每寫(xiě)入一所指向的文件的位置指針的當(dāng)前位置中。每寫(xiě)入一個(gè)字符,文件內(nèi)部位置指針向后移動(dòng)一個(gè)字節(jié)。個(gè)字符,文件內(nèi)部位置指針向后移動(dòng)一個(gè)字節(jié)。 被寫(xiě)入的文件可以用寫(xiě)、讀寫(xiě)、追加方式打開(kāi)。被寫(xiě)入的文件可以用寫(xiě)、讀寫(xiě)、追加方式打開(kāi)。 C語(yǔ)言程序設(shè)計(jì)與數(shù)據(jù)結(jié)構(gòu)【例例10.2】 將從鍵盤(pán)上輸入的一些字符(以將從鍵盤(pán)上輸入
30、的一些字符(以“*”作為結(jié)束)寫(xiě)入作為結(jié)束)寫(xiě)入c盤(pán)根目錄下盤(pán)根目錄下名為名為test2.txt的文本文件中。的文本文件中。#include stdio.hmain( )FILE *p; char ch; if(p=fopen(c:test2.txt,w)=NULL) printf(File can not open!n); exit(0); printf(Please input,end input with * character:); while(ch=getchar()!=*) fputc(ch,p); fclose(p);printf(Write over!n );程序運(yùn)行結(jié)束后,可
31、以在程序運(yùn)行結(jié)束后,可以在c盤(pán)根目錄下打開(kāi)盤(pán)根目錄下打開(kāi)test2.txt查看其內(nèi)容。查看其內(nèi)容。思考一下,如果在寫(xiě)入完畢后想馬上把剛才輸入的內(nèi)容打印在屏幕上該如何實(shí)現(xiàn)?思考一下,如果在寫(xiě)入完畢后想馬上把剛才輸入的內(nèi)容打印在屏幕上該如何實(shí)現(xiàn)? C語(yǔ)言程序設(shè)計(jì)與數(shù)據(jù)結(jié)構(gòu)字符串輸入/出函數(shù) 字符串輸入字符串輸入/出函數(shù)所處理的文件一般是文本文件,讀寫(xiě)的出函數(shù)所處理的文件一般是文本文件,讀寫(xiě)的數(shù)據(jù)以字符串為單位。數(shù)據(jù)以字符串為單位。1. 讀字符串函數(shù)讀字符串函數(shù)fgets功能是從指定的文件中讀一個(gè)字符串到字符數(shù)組中功能是從指定的文件中讀一個(gè)字符串到字符數(shù)組中. .函數(shù)調(diào)用的形式為:函數(shù)調(diào)用的形式為:
32、 fgets(字符數(shù)組名字符數(shù)組名, n, 文件指針文件指針);其中其中n是一個(gè)正整數(shù)。該函數(shù)表示從文件中讀出是一個(gè)正整數(shù)。該函數(shù)表示從文件中讀出n-1個(gè)字符個(gè)字符(如在讀滿(mǎn)(如在讀滿(mǎn)n-1個(gè)字符之前就遇到了換行符或個(gè)字符之前就遇到了換行符或EOF,則讀出則讀出提前結(jié)束),并在讀取的最后一個(gè)字符后加上串結(jié)束標(biāo)志提前結(jié)束),并在讀取的最后一個(gè)字符后加上串結(jié)束標(biāo)志0。fgets函數(shù)的返回值是字符數(shù)組的首地址。讀取字符串函數(shù)的返回值是字符數(shù)組的首地址。讀取字符串后文件位置指針也自動(dòng)后移若干個(gè)位置。后文件位置指針也自動(dòng)后移若干個(gè)位置。例如:例如:fgets(str,n,fp); 意義是從意義是從fp所
33、指的文件中讀出所指的文件中讀出n-1個(gè)字符送入字符數(shù)組個(gè)字符送入字符數(shù)組str中。中。 C語(yǔ)言程序設(shè)計(jì)與數(shù)據(jù)結(jié)構(gòu)【例【例10.3】從】從test2.txt文件中讀入文件中讀入8個(gè)字符組成一個(gè)字符串。個(gè)字符組成一個(gè)字符串。#includemain() FILE *fp; char arr20; if(fp=fopen(c:test2.txt ,r)=NULL) printf(nCannot open file,strike any key exit!); getchar(); exit(1); fgets(arr,9,fp); printf(n%sn,arr); fclose(fp);本例定義了
34、一個(gè)字符數(shù)組本例定義了一個(gè)字符數(shù)組str共共20個(gè)字節(jié),在以讀文本文件方式打開(kāi)文件個(gè)字節(jié),在以讀文本文件方式打開(kāi)文件string后,從中讀出后,從中讀出8個(gè)字符送入個(gè)字符送入str數(shù)組,在第數(shù)組,在第9個(gè)數(shù)組元素個(gè)數(shù)組元素str8內(nèi)加上內(nèi)加上0,然后,然后在屏幕上顯示輸出在屏幕上顯示輸出str數(shù)組存放的字符串。輸出的八個(gè)字符正是例數(shù)組存放的字符串。輸出的八個(gè)字符正是例10.2的前的前八個(gè)字符。八個(gè)字符。 C語(yǔ)言程序設(shè)計(jì)與數(shù)據(jù)結(jié)構(gòu)2.寫(xiě)字符串函數(shù)寫(xiě)字符串函數(shù)fputsfputs函數(shù)的功能是向指定的文件寫(xiě)入一個(gè)字符串函數(shù)的功能是向指定的文件寫(xiě)入一個(gè)字符串(不寫(xiě)入字符串結(jié)束標(biāo)記(不寫(xiě)入字符串結(jié)束標(biāo)記
35、0),當(dāng)成功寫(xiě)入一個(gè)),當(dāng)成功寫(xiě)入一個(gè)字符串后,文件的位置指針會(huì)自動(dòng)后移,函數(shù)返回字符串后,文件的位置指針會(huì)自動(dòng)后移,函數(shù)返回值為值為0;否則,返回;否則,返回EOF(符號(hào)常量,其值為符號(hào)常量,其值為-1)。)。其調(diào)用形式為:其調(diào)用形式為: fputs( 字符串字符串, 文件指針文件指針 ); 其中字符串可以是字符串常量,也可以是字符數(shù)組名其中字符串可以是字符串常量,也可以是字符數(shù)組名或指針變量?;蛑羔樧兞?。 例如:例如:fputs(“a1b2”, fp) 是把字符串是把字符串“a1b2”寫(xiě)入寫(xiě)入fp所指的文件之中。所指的文件之中。 C語(yǔ)言程序設(shè)計(jì)與數(shù)據(jù)結(jié)構(gòu)【例【例10.4】在文件】在文件te
36、st2.txt中追加一個(gè)不超過(guò)中追加一個(gè)不超過(guò)20個(gè)字符的字符串。個(gè)字符的字符串。#includemain() FILE *fp; char ch,st21; int count; if(fp=fopen(c:test2.txt ,a+)=NULL) printf(Cannot open file strike any key exit!); getchar(); exit(1); printf(input a string:n); gets (st); /* 輸入不超過(guò)輸入不超過(guò)20個(gè)字符的字符串暫放入數(shù)組個(gè)字符的字符串暫放入數(shù)組st中中 */ fputs(st,fp); rewind(fp
37、); /* 文件內(nèi)部位置指針移到文件的開(kāi)始位置文件內(nèi)部位置指針移到文件的開(kāi)始位置 */ printf(“n All of this file is: n”); ch=fgetc(fp); while(ch!=EOF) putchar(ch); ch=fgetc(fp); printf(n); fclose(fp); 本例要求在本例要求在test2.txt文件末添加一個(gè)字符串,因此,在程序第文件末添加一個(gè)字符串,因此,在程序第7行以追加讀寫(xiě)文本文件的方式打開(kāi)文件行以追加讀寫(xiě)文本文件的方式打開(kāi)文件test2.txt。然后輸入字然后輸入字符串暫放入數(shù)組符串暫放入數(shù)組st中,并用中,并用fputs函數(shù)
38、把該串寫(xiě)入文件函數(shù)把該串寫(xiě)入文件test2.txt。后在程序中用后在程序中用rewind函數(shù)把文件內(nèi)部位置指針移到文件首,函數(shù)把文件內(nèi)部位置指針移到文件首,再進(jìn)入循環(huán)逐個(gè)顯示當(dāng)前文件中的全部?jī)?nèi)容。要注意用再進(jìn)入循環(huán)逐個(gè)顯示當(dāng)前文件中的全部?jī)?nèi)容。要注意用scanf(“%s”,st)和和gets (st)輸入字符串時(shí)的不同。輸入字符串時(shí)的不同。 思考:如果不用思考:如果不用EOF,而是用而是用feof()來(lái)判斷文件結(jié)束,上述陰影部分程序該如何改寫(xiě)?來(lái)判斷文件結(jié)束,上述陰影部分程序該如何改寫(xiě)? C語(yǔ)言程序設(shè)計(jì)與數(shù)據(jù)結(jié)構(gòu)數(shù)據(jù)塊讀寫(xiě)函數(shù)fread和fwtrite 語(yǔ)言還提供了用于整塊數(shù)據(jù)的讀寫(xiě)函數(shù)。可用
39、來(lái)讀寫(xiě)語(yǔ)言還提供了用于整塊數(shù)據(jù)的讀寫(xiě)函數(shù)。可用來(lái)讀寫(xiě)一組數(shù)據(jù),如一個(gè)數(shù)組、一個(gè)結(jié)構(gòu)變量的值等。一組數(shù)據(jù),如一個(gè)數(shù)組、一個(gè)結(jié)構(gòu)變量的值等。讀數(shù)據(jù)塊函數(shù)調(diào)用的一般形式為:讀數(shù)據(jù)塊函數(shù)調(diào)用的一般形式為:fread (buffer, size, count, fp);寫(xiě)數(shù)據(jù)塊函數(shù)調(diào)用的一般形式為:寫(xiě)數(shù)據(jù)塊函數(shù)調(diào)用的一般形式為:fwrite (buffer, size, count,fp); 其中:其中: size 表示每個(gè)數(shù)據(jù)塊的字節(jié)數(shù)。表示每個(gè)數(shù)據(jù)塊的字節(jié)數(shù)。 count 表示要讀寫(xiě)的數(shù)據(jù)塊塊數(shù)。表示要讀寫(xiě)的數(shù)據(jù)塊塊數(shù)。 fp 表示文件指針。表示文件指針。 buffer 是一個(gè)指針。是一個(gè)指針。 C
40、語(yǔ)言程序設(shè)計(jì)與數(shù)據(jù)結(jié)構(gòu) fread (buffer,size,count,fp) 的功能是從的功能是從fp所指向文件的位置所指向文件的位置指針的當(dāng)前位置讀取指針的當(dāng)前位置讀取count塊數(shù)據(jù)(每個(gè)數(shù)據(jù)所占的字節(jié)數(shù)塊數(shù)據(jù)(每個(gè)數(shù)據(jù)所占的字節(jié)數(shù)為為size),),共組成共組成count塊長(zhǎng)度為塊長(zhǎng)度為size的數(shù)據(jù)存入的數(shù)據(jù)存入butter所指所指定的內(nèi)存空間中,當(dāng)正確的讀取了定的內(nèi)存空間中,當(dāng)正確的讀取了count塊數(shù)據(jù)后,文件內(nèi)塊數(shù)據(jù)后,文件內(nèi)部指針會(huì)自動(dòng)后移部指針會(huì)自動(dòng)后移count*size個(gè)字節(jié)的位置,若數(shù)據(jù)存入正個(gè)字節(jié)的位置,若數(shù)據(jù)存入正確,則返回確,則返回count值,否則返回值,否
41、則返回NULL(符號(hào)常量,其值為符號(hào)常量,其值為0)。)。 例如:例如:fread(fa,4,5,fp); 其意義是從其意義是從fp所指的文件中,每次讀所指的文件中,每次讀4個(gè)字節(jié)個(gè)字節(jié)(一個(gè)實(shí)數(shù)一個(gè)實(shí)數(shù))送入實(shí)型數(shù)組送入實(shí)型數(shù)組fa中,連續(xù)讀中,連續(xù)讀5次,即讀次,即讀5個(gè)實(shí)數(shù)到個(gè)實(shí)數(shù)到fa中。中。 fwrite (buffer,size,count,fp ) 表示將從表示將從buffer起始地址的起始地址的count塊數(shù)據(jù)(每塊數(shù)據(jù)的字節(jié)數(shù)為塊數(shù)據(jù)(每塊數(shù)據(jù)的字節(jié)數(shù)為size)寫(xiě)入到寫(xiě)入到fp所指向的所指向的文件中,當(dāng)正確的寫(xiě)入文件中,當(dāng)正確的寫(xiě)入count塊數(shù)據(jù)后,文件位置指針會(huì)自塊數(shù)據(jù)
42、后,文件位置指針會(huì)自動(dòng)后移動(dòng)后移count*size個(gè)字節(jié)的位置。若數(shù)據(jù)寫(xiě)入正確,則返回個(gè)字節(jié)的位置。若數(shù)據(jù)寫(xiě)入正確,則返回count值;否則返回值;否則返回NULL(符號(hào)常量,其值為符號(hào)常量,其值為0)。)。C語(yǔ)言程序設(shè)計(jì)與數(shù)據(jù)結(jié)構(gòu)【例【例10.5】 從鍵盤(pán)上輸入從鍵盤(pán)上輸入10個(gè)整數(shù),并把這些整數(shù)寫(xiě)入個(gè)整數(shù),并把這些整數(shù)寫(xiě)入c:盤(pán)根目錄下名為盤(pán)根目錄下名為test3.dat的二進(jìn)制文件中。的二進(jìn)制文件中。#include stdio.hmain( )FILE *fp; int data10,i; if(fp=fopen(c:test3.dat,wb)=NULL) printf(File c
43、an not open!n); exit(0); printf(“Input ten integers: ”); for(i=0;i10;i+) scanf(%d, &datai); fwrite(data,sizeof(int),10,fp); fclose(fp);printf(“Write over! n”); C語(yǔ)言程序設(shè)計(jì)與數(shù)據(jù)結(jié)構(gòu)【例【例10.6】 從從c:盤(pán)根目錄下名為盤(pán)根目錄下名為test3.dat的二進(jìn)制文件中讀取的二進(jìn)制文件中讀取10個(gè)整數(shù),要求先讀取第個(gè)整數(shù),要求先讀取第610個(gè)整數(shù),再讀取第個(gè)整數(shù),再讀取第15個(gè)整數(shù)。并把它們輸出到屏幕上顯示。個(gè)整數(shù)。并把它們輸
44、出到屏幕上顯示。#include stdio.hmain( )FILE *fp; int data10,i; if(fp=fopen(c:test3.dat,rb)=NULL) printf(File can not open!n); exit(0); fseek(fp, 5L*sizeof(int) ,0); /*先把文件位置指針后移先把文件位置指針后移*/ fread(data, sizeof(int),5, fp); /*先讀取第先讀取第610個(gè)整數(shù)放入個(gè)整數(shù)放入data0data4*/rewind(fp); /*把文件位置指針移到文件開(kāi)始把文件位置指針移到文件開(kāi)始*/fread(dat
45、a+5, sizeof(int),5, fp); /*再讀取第再讀取第15個(gè)整數(shù)放入個(gè)整數(shù)放入data5data9*/fclose(fp); for(i=0;i10;i+) printf(%5d,datai); C語(yǔ)言程序設(shè)計(jì)與數(shù)據(jù)結(jié)構(gòu)【例【例10.7】從鍵盤(pán)輸入三個(gè)學(xué)生數(shù)據(jù),寫(xiě)入一個(gè)文件中,再讀出這兩個(gè)學(xué)生的數(shù)據(jù)顯示在屏】從鍵盤(pán)輸入三個(gè)學(xué)生數(shù)據(jù),寫(xiě)入一個(gè)文件中,再讀出這兩個(gè)學(xué)生的數(shù)據(jù)顯示在屏幕上。幕上。#includestruct stu char name20; int num; int age; char addr30;boya3,boyb3,*pp,*qq;main() FILE *f
46、p; int i; pp=boya; qq=boyb; if(fp=fopen(c:studata,wb+)=NULL) printf(Cannot open file strike any key exit!); getchar(); exit(1); C語(yǔ)言程序設(shè)計(jì)與數(shù)據(jù)結(jié)構(gòu)for(i=0;iname,&pp-num,&pp-age,pp-addr); pp=boya; fwrite(pp,sizeof(struct stu),3,fp); rewind(fp); fread(qq,sizeof(struct stu),3,fp); fclose(fp); printf(n
47、nnametnumber age addrn); for(i=0;iname,qq-num,qq-age,qq-addr); 本例程序定義了一個(gè)結(jié)構(gòu)本例程序定義了一個(gè)結(jié)構(gòu)stu,說(shuō)明了兩個(gè)結(jié)構(gòu)數(shù)組說(shuō)明了兩個(gè)結(jié)構(gòu)數(shù)組boya和和boyb以及兩個(gè)結(jié)構(gòu)指針以及兩個(gè)結(jié)構(gòu)指針變量變量pp和和qq。pp指向指向boya,qq指向指向boyb。程序首先以讀寫(xiě)方式打開(kāi)二進(jìn)制文程序首先以讀寫(xiě)方式打開(kāi)二進(jìn)制文件件“studata”,輸入三個(gè)學(xué)生數(shù)據(jù)之后,寫(xiě)入該文件中。然后把文件內(nèi)部位置輸入三個(gè)學(xué)生數(shù)據(jù)之后,寫(xiě)入該文件中。然后把文件內(nèi)部位置指針移到文件首,讀出三塊學(xué)生數(shù)據(jù)后,在屏幕上顯示。指針移到文件首,讀出三塊學(xué)
48、生數(shù)據(jù)后,在屏幕上顯示。 C語(yǔ)言程序設(shè)計(jì)與數(shù)據(jù)結(jié)構(gòu)格式化讀寫(xiě)函數(shù)fscanf和fprintf fscanf函數(shù),函數(shù),fprintf函數(shù)與前面使用的函數(shù)與前面使用的scanf和和printf 函數(shù)的功能相似,都是格式化讀寫(xiě)函數(shù)。兩函數(shù)的功能相似,都是格式化讀寫(xiě)函數(shù)。兩者的區(qū)別在于者的區(qū)別在于fscanf函數(shù)和函數(shù)和fprintf函數(shù)的讀寫(xiě)對(duì)象函數(shù)的讀寫(xiě)對(duì)象不是鍵盤(pán)和顯示器,而是磁盤(pán)文件。這兩個(gè)函數(shù)的不是鍵盤(pán)和顯示器,而是磁盤(pán)文件。這兩個(gè)函數(shù)的調(diào)用格式為:調(diào)用格式為: fscanf(文件指針文件指針,格式字符串格式字符串,輸入表列輸入表列); fprintf(文件指針文件指針,格式字符串格式字符
49、串,輸出表列輸出表列); 例如:例如: fscanf(fp,%d%s,&i,s); fprintf(fp,%d%c,j,ch); 用用fscanf和和fprintf函數(shù)也可以完成例函數(shù)也可以完成例10.7的問(wèn)題。的問(wèn)題。修改后的程序如例修改后的程序如例10.8所示。所示。 C語(yǔ)言程序設(shè)計(jì)與數(shù)據(jù)結(jié)構(gòu)【例【例10.8】用】用fscanf和和fprintf函數(shù)解決例函數(shù)解決例10.7的問(wèn)題。的問(wèn)題。#includestruct stu char name20; int num; int age; char addr30;boya3,boyb3,*pp,*qq;main( ) FILE *fp
50、;int i;pp=boya;qq=boyb;if(fp=fopen(c:studata,wb+)=NULL)printf(Cant open file strike any key exit!);getch();exit(1);C語(yǔ)言程序設(shè)計(jì)與數(shù)據(jù)結(jié)構(gòu)printf(ninput datan);for(i=0;iname,&pp-num,&pp-age,pp-addr);pp=boya;for(i=0;iname,pp-num,pp-age,pp-addr);rewind(fp);for(i=0;iname,&qq-num,&qq-age,qq-addr);pr
51、intf(nnnametnumber age addrn);qq=boyb;for(i=0;iname,qq-num, qq-age,qq-addr);fclose(fp); 本程序中本程序中fscanf和和fprintf函數(shù)每次只能讀寫(xiě)一個(gè)結(jié)構(gòu)體數(shù)組元素,因此采用函數(shù)每次只能讀寫(xiě)一個(gè)結(jié)構(gòu)體數(shù)組元素,因此采用了循環(huán)語(yǔ)句來(lái)讀寫(xiě)全部數(shù)組元素。了循環(huán)語(yǔ)句來(lái)讀寫(xiě)全部數(shù)組元素。 還要注意指針變量還要注意指針變量pp,qq。由于循環(huán)改變了由于循環(huán)改變了它們的值,因此在程序中分別對(duì)它們重新賦予了數(shù)組的首地址。它們的值,因此在程序中分別對(duì)它們重新賦予了數(shù)組的首地址。 C語(yǔ)言程序設(shè)計(jì)與數(shù)據(jù)結(jié)構(gòu)【例【例10.9】
52、 把命令行參數(shù)中的前一個(gè)文件名標(biāo)識(shí)的文件,復(fù)制到后一個(gè)文件名標(biāo)識(shí)的文件中,把命令行參數(shù)中的前一個(gè)文件名標(biāo)識(shí)的文件,復(fù)制到后一個(gè)文件名標(biāo)識(shí)的文件中, 如命令行中只有一個(gè)文件名則把該文件寫(xiě)到標(biāo)準(zhǔn)輸出文件如命令行中只有一個(gè)文件名則把該文件寫(xiě)到標(biāo)準(zhǔn)輸出文件(顯示器顯示器)中。中。#includemain(int argc,char *argv) FILE *fp1,*fp2; char ch; if(argc=1) /*如命令行參數(shù)中沒(méi)有給出文件名,則給出提示信息如命令行參數(shù)中沒(méi)有給出文件名,則給出提示信息*/ printf(Have not enter file name, strike any k
53、ey exit); getchar(); exit(0); if(fp1=fopen(argv1,rt)=NULL) printf(Cannot open %sn,argv1); getchar(); exit(1); .C語(yǔ)言程序設(shè)計(jì)與數(shù)據(jù)結(jié)構(gòu)if(argc=2) /*如果只給出一個(gè)文件名,則使如果只給出一個(gè)文件名,則使fp2指向標(biāo)準(zhǔn)輸出文件指向標(biāo)準(zhǔn)輸出文件(即顯示器即顯示器)*/fp2=stdout; else if(fp2=fopen(argv2,wt+)=NULL) printf(Cannot open %sn,argv1); getchar(); exit(1); while(ch=
54、fgetc(fp1)!=EOF) /*用循環(huán)語(yǔ)句逐個(gè)讀出文件用循環(huán)語(yǔ)句逐個(gè)讀出文件1中的字符再送到文件中的字符再送到文件2中中*/ fputc(ch,fp2); fclose(fp1); fclose(fp2); 本程序?yàn)閹?shù)的本程序?yàn)閹?shù)的main函數(shù)。程序中定義了兩個(gè)文件指針函數(shù)。程序中定義了兩個(gè)文件指針fp1和和fp2,分別指向命令行參分別指向命令行參數(shù)中給出的文件。如命令行參數(shù)中沒(méi)有給出文件名,則給出提示信息。如果只給出一個(gè)數(shù)中給出的文件。如命令行參數(shù)中沒(méi)有給出文件名,則給出提示信息。如果只給出一個(gè)文件名,則使文件名,則使fp2指向標(biāo)準(zhǔn)輸出文件指向標(biāo)準(zhǔn)輸出文件(即顯示器即顯示器)。
55、然后用循環(huán)語(yǔ)句逐個(gè)讀出文件。然后用循環(huán)語(yǔ)句逐個(gè)讀出文件1中的字符中的字符再送到文件再送到文件2中。假設(shè)項(xiàng)目名稱(chēng)為中。假設(shè)項(xiàng)目名稱(chēng)為cexam1_1,則生成一個(gè)可執(zhí)行文件則生成一個(gè)可執(zhí)行文件cexam1_1.exe。在在DOS下運(yùn)行結(jié)果如圖所示:下運(yùn)行結(jié)果如圖所示: C語(yǔ)言程序設(shè)計(jì)與數(shù)據(jù)結(jié)構(gòu)第一次運(yùn)行第一次運(yùn)行, 不指定文件名,系統(tǒng)提示不指定文件名,系統(tǒng)提示have not enter file name, strike any key exit。再次運(yùn)行時(shí),給出了一個(gè)文件名再次運(yùn)行時(shí),給出了一個(gè)文件名test1.txt,故輸出給標(biāo)準(zhǔn)輸出文件故輸出給標(biāo)準(zhǔn)輸出文件stdout,即在顯示器上顯示文件即在顯示器上顯示文件test1.txt的內(nèi)容的內(nèi)容“1234”。第三次運(yùn)行,給出了二個(gè)文件名,因此把第三次運(yùn)行,給出了二
溫馨提示
- 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶(hù)所有。
- 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ì)用戶(hù)上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶(hù)上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶(hù)因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 2025年防塵吊箱行業(yè)深度研究分析報(bào)告
- 電影票務(wù)銷(xiāo)售服務(wù)合同
- 二零二五版窗簾行業(yè)供應(yīng)鏈管理與安裝合同3篇
- 二零二四年度司機(jī)勞務(wù)合同簽訂與培訓(xùn)服務(wù)3篇
- 二零二四年度農(nóng)業(yè)土地流轉(zhuǎn)合同范本3篇
- 二零二五年度承諾合同模板:企業(yè)信用保障協(xié)議4篇
- 二零二四年度業(yè)績(jī)承諾對(duì)賭合同6篇帶眉腳
- 二零二四年度N06安置區(qū)郭家咀鐵三官?gòu)R地塊物業(yè)管理合同2篇帶眉腳
- 二零二四年計(jì)算機(jī)軟件開(kāi)發(fā)與授權(quán)合同
- 個(gè)人建筑工程維護(hù)保養(yǎng)合同(2024版)
- 2024-2025學(xué)年北京市豐臺(tái)區(qū)高三語(yǔ)文上學(xué)期期末試卷及答案解析
- 公路電子收費(fèi)系統(tǒng)安裝合同范本
- 2021年全國(guó)高考物理真題試卷及解析(全國(guó)已卷)
- 綜合實(shí)踐項(xiàng)目 制作水族箱飼養(yǎng)淡水魚(yú) 教學(xué)設(shè)計(jì)-2024-2025學(xué)年魯科版生物六年級(jí)上冊(cè)
- 建設(shè)用地土壤污染風(fēng)險(xiǎn)評(píng)估技術(shù)導(dǎo)則(HJ 25.3-2019代替HJ 25.3-2014)
- JJG 692-2010無(wú)創(chuàng)自動(dòng)測(cè)量血壓計(jì)
- 徐州市2023-2024學(xué)年八年級(jí)上學(xué)期期末地理試卷(含答案解析)
- 飲料對(duì)人體的危害1
- 數(shù)字經(jīng)濟(jì)學(xué)導(dǎo)論-全套課件
- 中考記敘文閱讀
- 產(chǎn)科溝通模板
評(píng)論
0/150
提交評(píng)論