第章C語言程序設(shè)計基本知識_第1頁
第章C語言程序設(shè)計基本知識_第2頁
第章C語言程序設(shè)計基本知識_第3頁
第章C語言程序設(shè)計基本知識_第4頁
第章C語言程序設(shè)計基本知識_第5頁
已閱讀5頁,還剩39頁未讀, 繼續(xù)免費閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認領(lǐng)

文檔簡介

1、n教學目的:教學目的:通過本章的學習,要求能理解文本文件和通過本章的學習,要求能理解文本文件和二進制文件的概念,能熟練使用文件的讀寫函二進制文件的概念,能熟練使用文件的讀寫函數(shù)對文件進行一系列的操作,理解文件的定位數(shù)對文件進行一系列的操作,理解文件的定位和文件的出錯檢測等,能夠利用本章的知識點和文件的出錯檢測等,能夠利用本章的知識點進行一些簡單的課程設(shè)計,為后續(xù)課程中系統(tǒng)進行一些簡單的課程設(shè)計,為后續(xù)課程中系統(tǒng)的開發(fā)奠定基礎(chǔ)。的開發(fā)奠定基礎(chǔ)。n結(jié)構(gòu)和內(nèi)容結(jié)構(gòu)和內(nèi)容 文件操作的文件操作的C程序引例程序引例文件的打開與關(guān)閉文件的打開與關(guān)閉文件的讀寫文件的讀寫文件的定位文件的定位綜合實訓綜合實訓字符

2、讀寫函數(shù)字符讀寫函數(shù)數(shù)據(jù)讀寫函數(shù)數(shù)據(jù)讀寫函數(shù)格式化讀寫函數(shù)格式化讀寫函數(shù)字符串讀寫函數(shù)字符串讀寫函數(shù)其他讀寫函數(shù)其他讀寫函數(shù)文件頭定位函數(shù)文件頭定位函數(shù)文件隨機定位函數(shù)文件隨機定位函數(shù)流式文件的定位函數(shù)流式文件的定位函數(shù)判斷文件結(jié)束函數(shù)判斷文件結(jié)束函數(shù)feof文件的出錯檢測文件的出錯檢測: ferror和和 clearerr函數(shù)函數(shù)n重點和難點重點和難點 重點:重點: (1) 掌握文件的打開與關(guān)閉掌握文件的打開與關(guān)閉 (2) 掌握文件的讀寫掌握文件的讀寫 (3) 掌握文件的定位掌握文件的定位 (4) 掌握文件的出錯檢測掌握文件的出錯檢測 難點難點 (1) 掌握文件的讀寫掌握文件的讀寫 (2)掌

3、握文件的出錯檢測掌握文件的出錯檢測 【例【例10.1】編寫程序完成:將一個班級學生的期末】編寫程序完成:將一個班級學生的期末考試信息考試信息(學號、姓名、總分學號、姓名、總分)存入磁盤文件存入磁盤文件stu.txt中,中,同時統(tǒng)計總分在同時統(tǒng)計總分在550分以上的優(yōu)秀學生信息,并將優(yōu)秀分以上的優(yōu)秀學生信息,并將優(yōu)秀學生的名單輸出到屏幕上。學生的名單輸出到屏幕上。假設(shè)班級目前的學生數(shù)為假設(shè)班級目前的學生數(shù)為30,則程序代碼如下:,則程序代碼如下:/* 源文件名:源文件名:Li10_1.c功能:統(tǒng)計一個班級的期末考試信息。功能:統(tǒng)計一個班級的期末考試信息。*/#include #define N

4、30/*定義班級中學生的人數(shù)定義班級中學生的人數(shù)*/void main() int i;FILE *fp;FILE *fpp;struct stuchar name20;int number;int score;studN/*打開或建立打開或建立stu.txt文件,只允許寫入數(shù)據(jù)文件,只允許寫入數(shù)據(jù)*/fp=fopen(stu.txt,w);for(i=0;iN;i+)printf(請輸入第請輸入第%d個學生的信息:個學生的信息:n,i+1);printf(姓名:姓名:);scanf(%s,);printf(學號:學號:);scanf(%d,&studi.numbe

5、r);printf(總分:總分:);scanf(%d,&studi.score);fprintf(fp, %s,%d,%dn,, studi.number, studi.score);fclose(fp);/*關(guān)閉關(guān)閉stu.txt文件文件*/*打開已有的打開已有的stu.txt文件,只允許讀取數(shù)據(jù)文件,只允許讀取數(shù)據(jù)*/fpp=fopen(stu.txt,r);for(i=0;i550.0)p r i n t f ( % s ( 學 號 :學 號 : % d ) 是 個 優(yōu) 秀 的 學 生 。是 個 優(yōu) 秀 的 學 生 。n,,studi.nu

6、mber);fclose(fpp);/*關(guān)閉關(guān)閉stu.txt文件文件*/getch(); 程序首先將程序首先將30個學生的信息存放到文件個學生的信息存放到文件stu.txt,然后對存放在,然后對存放在stu.txt中的中的學生的總分進行統(tǒng)計,并將總分在學生的總分進行統(tǒng)計,并將總分在550分以上的學生的名單輸出。分以上的學生的名單輸出。以輸入以輸入5個個(假設(shè)此時假設(shè)此時N的值為的值為5)學生的信息為例,程序的運行情況為:學生的信息為例,程序的運行情況為: 請輸入第請輸入第1個學生的信息:個學生的信息: 姓名:姓名:張三張三 學號:學號:1 總分:總分:368 請輸入第請輸入第2個學生的信息:

7、個學生的信息: 姓名:姓名:李四李四 學號:學號:2 總分:總分:479 請輸入第請輸入第3個學生的信息:個學生的信息: 姓名:姓名:王五王五 學號:學號:3 總分:總分:598 請輸入第請輸入第4個學生的信息:個學生的信息: 姓名:姓名:趙六趙六 學號:學號:4 總分:總分:564 請輸入第請輸入第5個學生的信息:個學生的信息: 姓名:姓名:劉七劉七 學號:學號:5 總分:總分:321 王五王五(學號:學號:3)是個優(yōu)秀的學生。是個優(yōu)秀的學生。 趙六趙六(學號:學號:4)是個優(yōu)秀的學生。是個優(yōu)秀的學生。 此時如果打開文件此時如果打開文件stu.txtstu.txt,則,則5 5個學生的信息清

8、單個學生的信息清單按照輸入的順序存放在按照輸入的順序存放在stu.txtstu.txt文件中,如圖文件中,如圖10-110-1所示。所示。 圖10-1| 文件是一組相關(guān)數(shù)據(jù)的集合。在文件是一組相關(guān)數(shù)據(jù)的集合。在C程序設(shè)計中,按文件的內(nèi)容可程序設(shè)計中,按文件的內(nèi)容可以分為兩類:一類是程序文件,它是程序得源代碼;另一類是以分為兩類:一類是程序文件,它是程序得源代碼;另一類是數(shù)據(jù)文件,它是程序運行時需要的原始數(shù)據(jù)及輸出的結(jié)果。這數(shù)據(jù)文件,它是程序運行時需要的原始數(shù)據(jù)及輸出的結(jié)果。這兩類文件都保存在磁盤上,隨時可以使用。程序文件的創(chuàng)建和兩類文件都保存在磁盤上,隨時可以使用。程序文件的創(chuàng)建和使用已經(jīng)在前

9、面各章使用了,本章主要介紹數(shù)據(jù)文件的創(chuàng)建和使用已經(jīng)在前面各章使用了,本章主要介紹數(shù)據(jù)文件的創(chuàng)建和使用。使用。| 按數(shù)據(jù)得存儲形式,數(shù)據(jù)文件可以分為文本文件和二進制文件按數(shù)據(jù)得存儲形式,數(shù)據(jù)文件可以分為文本文件和二進制文件兩類。兩類。| 文本文件:也稱文本文件:也稱ASCII文件,是一種字符流文件。文本文件的優(yōu)文件,是一種字符流文件。文本文件的優(yōu)點是可以直接閱讀,而且點是可以直接閱讀,而且ASCII碼標準統(tǒng)一,使文件易于移植,碼標準統(tǒng)一,使文件易于移植,但其缺點是輸入、輸出都要進行轉(zhuǎn)換,效率低。但其缺點是輸入、輸出都要進行轉(zhuǎn)換,效率低。| 二進制文件:二進制文件中的數(shù)據(jù)是按其在內(nèi)存中的存儲形式二

10、進制文件:二進制文件中的數(shù)據(jù)是按其在內(nèi)存中的存儲形式存放的。存放的。| 流:流是一個邏輯設(shè)備,其具有諸多相同的行為。在流:流是一個邏輯設(shè)備,其具有諸多相同的行為。在C語言中有語言中有兩種性質(zhì)的流:文字流和二進制。兩種性質(zhì)的流:文字流和二進制。| 順序文件:可以進行順序存取的文件稱為順序文件。順序文件:可以進行順序存取的文件稱為順序文件。| 隨機文件:可以進行隨機存取的文件稱為隨機文件。隨機文件:可以進行隨機存取的文件稱為隨機文件。| C語言支持的文件存取方式有兩種:順序存取和隨機存取。隨機語言支持的文件存取方式有兩種:順序存取和隨機存取。隨機存取也稱直接存取。存取也稱直接存取。 文件打開函數(shù)文

11、件打開函數(shù)fopenfopen用來打開一個文件,其調(diào)用的一用來打開一個文件,其調(diào)用的一般形式為:般形式為: 文件指針名文件指針名=fopen=fopen( (文件名,使用文件方式文件名,使用文件方式) ); 其中:其中:“文件指針名文件指針名”必須是被說明為必須是被說明為FILEFILE類型的類型的指針變量;指針變量;“文件名文件名”是被打開文件的文件名;文件名是被打開文件的文件名;文件名通常是文件變量或文件數(shù)組;通常是文件變量或文件數(shù)組;“使用文件方式使用文件方式”是指文是指文件的類型和操作要求。文件的使用方式共有件的類型和操作要求。文件的使用方式共有1212種,表種,表10.110.1給出

12、了文本的符號和意義。給出了文本的符號和意義。 。 由于文件的打開與關(guān)閉都是利用系統(tǒng)函數(shù)來實現(xiàn)的,由于文件的打開與關(guān)閉都是利用系統(tǒng)函數(shù)來實現(xiàn)的,因此,在編寫有關(guān)文件的程序中,應該在其中包含因此,在編寫有關(guān)文件的程序中,應該在其中包含“stdio.h”頭文件。頭文件。 文件使用方式文件使用方式代表的含義代表的含義“r”打開一個已有的文本文件,只允許讀取數(shù)據(jù)打開一個已有的文本文件,只允許讀取數(shù)據(jù)“w”打開或建立一個文本文件,只允許寫入數(shù)據(jù)打開或建立一個文本文件,只允許寫入數(shù)據(jù)“at”打開一個已有的文本文件,并在文件末尾寫數(shù)據(jù)打開一個已有的文本文件,并在文件末尾寫數(shù)據(jù)“rt+”打開一個已有的文本文件,

13、允許讀和寫打開一個已有的文本文件,允許讀和寫“at+”打開一個已有的文本文件,允許讀或在文件末追加數(shù)據(jù)打開一個已有的文本文件,允許讀或在文件末追加數(shù)據(jù)“wt+”打開或建立一個文本文件,允許讀寫打開或建立一個文本文件,允許讀寫表表10-1文本文件的符號及其含義文本文件的符號及其含義 以上六種方式是針對以上六種方式是針對“文本文件文本文件”類型類型 文件使用方式文件使用方式代表的含義代表的含義“rb” 打開一個已存在的二進制文件,只允許讀數(shù)據(jù)打開一個已存在的二進制文件,只允許讀數(shù)據(jù) “wb” 打開或建立一個二進制文件,只允許寫數(shù)據(jù)打開或建立一個二進制文件,只允許寫數(shù)據(jù) “ab” 打開一個二進制文件

14、,并在文件末尾追加數(shù)據(jù)打開一個二進制文件,并在文件末尾追加數(shù)據(jù) “rb+” 打開一個二進制文件,允許讀和寫打開一個二進制文件,允許讀和寫 “wb+” 打開或建立一個二進制文件,允許讀和寫打開或建立一個二進制文件,允許讀和寫 “ab+” 打開一個二進制文件,允許讀或在文件末追加數(shù)據(jù)打開一個二進制文件,允許讀或在文件末追加數(shù)據(jù) 表表10-210-2二進制文件的符號及其含義二進制文件的符號及其含義 可以看出,上面兩個表的作用基本上是相同的,唯可以看出,上面兩個表的作用基本上是相同的,唯一的區(qū)別是表一的區(qū)別是表10-2增加了一個表示二進制的字符增加了一個表示二進制的字符“b”。其中,文件使用方式由其中

15、,文件使用方式由r、w、a、t、b和和+六個字符組成,六個字符組成,各字符的含義如表所示。各字符的含義如表所示。 字母字母代表代表含義含義rread讀取數(shù)據(jù)讀取數(shù)據(jù)wwrite寫入數(shù)據(jù)寫入數(shù)據(jù)aapend追加數(shù)據(jù)追加數(shù)據(jù)ttext文本文件,可省略文本文件,可省略 不寫不寫bbanary二進制文件二進制文件+可讀可寫可讀可寫表10-3 文件使用方式中的字符及其含義 1. 程序中凡是用程序中凡是用“r”打開一個文件時,表明該文件必須已經(jīng)打開一個文件時,表明該文件必須已經(jīng)存在,且只能從該文件讀出數(shù)據(jù)。存在,且只能從該文件讀出數(shù)據(jù)。 2用用“w”打開的文件也只能向該文件寫入數(shù)據(jù)。若打開的打開的文件也只

16、能向該文件寫入數(shù)據(jù)。若打開的文件不存在,則按照指定的文件名建立該文件,若打開的文件文件不存在,則按照指定的文件名建立該文件,若打開的文件已經(jīng)存在,則將該文件刪去,重建一個新文件。使用時要特別已經(jīng)存在,則將該文件刪去,重建一個新文件。使用時要特別注意這一點。注意這一點。 3. 如果要向一個已經(jīng)存在的文件后面追加新的信息,那只能如果要向一個已經(jīng)存在的文件后面追加新的信息,那只能用用“a”方式打開文件。但此時該文件必須是存在的,否則將方式打開文件。但此時該文件必須是存在的,否則將會出錯。會出錯。 對上表做以下補充說明:對上表做以下補充說明:4在打開一個文件之前,應該定義文件型指針,以便接收函數(shù)在打開

17、一個文件之前,應該定義文件型指針,以便接收函數(shù)fopen返回返回的地址。如果出錯,的地址。如果出錯,fopen將返回一個空指針將返回一個空指針NULL。在程序中可以用這一。在程序中可以用這一信息來判別是否完成打開文件的工作,并做相應的處理。信息來判別是否完成打開文件的工作,并做相應的處理。例如:例如: if(fp=fopen(“file1”,”rb”)= =NULL) printf(“n error on open file1”); getch( ); exit(1); 該程序段表示:如果返回的指針為空,則不能打開當前目錄下的文件該程序段表示:如果返回的指針為空,則不能打開當前目錄下的文件“f

18、ile1”,同時給出錯誤提示信息,同時給出錯誤提示信息“error on open file1!”。程序中的。程序中的getch()函數(shù)的功能是從鍵盤輸入一個字符,該字符不在屏幕上顯示。其實函數(shù)的功能是從鍵盤輸入一個字符,該字符不在屏幕上顯示。其實getch()在這里的作用是停留等待,只有當用戶從鍵盤敲任意鍵時,程序才繼續(xù)執(zhí)在這里的作用是停留等待,只有當用戶從鍵盤敲任意鍵時,程序才繼續(xù)執(zhí)行,我們可以利用這個等待時間來閱讀出錯提示,找到錯誤原因。當敲鍵行,我們可以利用這個等待時間來閱讀出錯提示,找到錯誤原因。當敲鍵后,執(zhí)行語句后,執(zhí)行語句“exit(1);”,從而退出程序。,從而退出程序。 文件

19、一旦使用完畢,應使用關(guān)閉文件函數(shù)文件一旦使用完畢,應使用關(guān)閉文件函數(shù)fclosefclose把文件關(guān)把文件關(guān)閉,以避免文件數(shù)據(jù)丟失等情況的發(fā)生。閉,以避免文件數(shù)據(jù)丟失等情況的發(fā)生。 fclosefclose函數(shù)調(diào)用的一般形式為:函數(shù)調(diào)用的一般形式為: fclose(FILE fclose(FILE * *fpfp) ); 其中,參數(shù)其中,參數(shù)fpfp是文件型指針,通過是文件型指針,通過fopenfopen()()函數(shù)已經(jīng)獲得,函數(shù)已經(jīng)獲得,它指向某個打開的文件。例如:它指向某個打開的文件。例如:fclose(fpfclose(fp);); 上述語句的含義是關(guān)閉上述語句的含義是關(guān)閉fpfp所指向

20、的文件,同時自動釋放所指向的文件,同時自動釋放分配給文件的內(nèi)存緩沖區(qū)。當正常完成關(guān)閉文件的操作時,分配給文件的內(nèi)存緩沖區(qū)。當正常完成關(guān)閉文件的操作時,fclosefclose函數(shù)的返回值為函數(shù)的返回值為0 0,表示已正確關(guān)閉指定的文件;如,表示已正確關(guān)閉指定的文件;如返回非零值則表示有錯誤發(fā)生。返回非零值則表示有錯誤發(fā)生。 【例【例10.210.2】文件的打開與關(guān)閉應用舉例?!课募拇蜷_與關(guān)閉應用舉例。 / /* *源文件名:源文件名:Li10_3.cLi10_3.c功能:文件的打開與關(guān)閉。功能:文件的打開與關(guān)閉。* */ /#includestdio.h#include void main(

21、)void main() FILE FILE * *fpfp; /; /* *定義一個定義一個文件指針文件指針* */ / if(fpif(fp=fopen(C:STUDENTch01_01ch01_01.c,=fopen(C:STUDENTch01_01ch01_01.c,rb)=NULL)rb)=NULL) printf(fileprintf(file can not open!n); can not open!n);exit(1);exit(1); elseelseprintf(Theprintf(The file succeed open!n); file succeed open!n

22、);fclose(fpfclose(fp);); 說明:在書寫時,要嚴格按照格式書寫。說明:在書寫時,要嚴格按照格式書寫。例如:將路徑寫成例如:將路徑寫成“C:STUDENTch01_01ch01_01.c”是不正確是不正確的,這一點要特別注意。路徑寫成的,這一點要特別注意。路徑寫成“C:STUDENTch01_01ch01_01.c”才是正確才是正確的,這里的的,這里的“”的含義是:第一個的含義是:第一個“”代表轉(zhuǎn)代表轉(zhuǎn)義字符,第二個義字符,第二個“”才是字符本身。才是字符本身。 v讀字符函數(shù)讀字符函數(shù)fgetcfgetc函數(shù)函數(shù) v寫字符函數(shù)寫字符函數(shù)fputc函數(shù)函數(shù) 文件的讀寫操作由文

23、件讀寫函數(shù)完成,常用的讀寫函數(shù)文件的讀寫操作由文件讀寫函數(shù)完成,常用的讀寫函數(shù)有有fputc、fgetc、fread、fwrite、fputs、fgets、fprintf、fscanf、putw、getw等。等。 fgetc函數(shù)用來從指定的文件讀入一個字符,該文件必須是函數(shù)用來從指定的文件讀入一個字符,該文件必須是讀或?qū)懛绞酱蜷_的。讀或?qū)懛绞酱蜷_的。fgetc函數(shù)的調(diào)用格式如下:函數(shù)的調(diào)用格式如下: ch=fgetc(fp); 其中其中fp為文件類型指針,為文件類型指針,ch為字符變量為字符變量。fgetc函數(shù)返回的函數(shù)返回的字符賦給字符變量字符賦給字符變量ch。如果在執(zhí)行。如果在執(zhí)行fget

24、c函數(shù)讀字符時遇到文函數(shù)讀字符時遇到文件結(jié)束符,則該函數(shù)返回一個結(jié)束標志件結(jié)束符,則該函數(shù)返回一個結(jié)束標志EOF(-1)。如果想從。如果想從磁盤文件順序讀入字符并在屏幕上顯示出來,可以用以下的磁盤文件順序讀入字符并在屏幕上顯示出來,可以用以下的程序段:程序段: ch=fgetc(fp); while(ch!=EOF) putchar(ch); ch=fgetc(fp); fputc函數(shù)用來將一個字符寫入指定的文件中,該函數(shù)函數(shù)用來將一個字符寫入指定的文件中,該函數(shù)的調(diào)用格式為:的調(diào)用格式為:fputc(ch,fp); 其中其中ch可以是一個字符常量,也可以是一個字符變量??梢允且粋€字符常量,也

25、可以是一個字符變量。fp是文件指針變量。該函數(shù)的作用是將字符是文件指針變量。該函數(shù)的作用是將字符(ch的值的值)輸出輸出到到fp所指定的文件中去。所指定的文件中去。fputc函數(shù)也帶回一個值,如果函數(shù)也帶回一個值,如果輸出成功,則返回值就是輸出的字符,如果輸出失敗,輸出成功,則返回值就是輸出的字符,如果輸出失敗,則返回則返回EOF(-1)。寫數(shù)據(jù)函數(shù)寫數(shù)據(jù)函數(shù)fwrite函數(shù)函數(shù) 讀數(shù)據(jù)函數(shù)讀數(shù)據(jù)函數(shù)fread函數(shù)函數(shù) 寫數(shù)據(jù)塊函數(shù)調(diào)用的一般形式為:寫數(shù)據(jù)塊函數(shù)調(diào)用的一般形式為:fwrite(buffer,size,n,fpfwrite(buffer,size,n,fp);); 其中各個參數(shù)的

26、含義及說明如其中各個參數(shù)的含義及說明如表表10.4所示。所示。 參數(shù)參數(shù)含義含義說明說明 buffer是一個字符型指針,它表示存放輸出數(shù)據(jù)是一個字符型指針,它表示存放輸出數(shù)據(jù)的變量地址或數(shù)組首地址。的變量地址或數(shù)組首地址。size是一個無符號整型,表示數(shù)據(jù)塊的字節(jié)數(shù)是一個無符號整型,表示數(shù)據(jù)塊的字節(jié)數(shù)n無符號整型,表示要讀寫的數(shù)據(jù)塊塊數(shù)無符號整型,表示要讀寫的數(shù)據(jù)塊塊數(shù)每個數(shù)據(jù)是每個數(shù)據(jù)是size個個字節(jié)字節(jié) fp表示文件指針表示文件指針表10-4 fwrite函數(shù)中各個參數(shù)的含義及說明 讀數(shù)據(jù)塊函數(shù)調(diào)用的一般形式為:讀數(shù)據(jù)塊函數(shù)調(diào)用的一般形式為:fread(buffer,size,n,fpf

27、read(buffer,size,n,fp);); 其中的其中的bufferbuffer是一個字符型指針,表示存放讀入數(shù)據(jù)的是一個字符型指針,表示存放讀入數(shù)據(jù)的變量地址或數(shù)組首地址。變量地址或數(shù)組首地址。sizesize、n n、fpfp的含義見上表。例的含義見上表。例如:如:fread(a,4,8,fp);fread(a,4,8,fp); 上述語句的含義是從上述語句的含義是從fpfp所指的文件中,每次讀所指的文件中,每次讀4 4個字節(jié),個字節(jié),也就是把一個實數(shù)送入實數(shù)組也就是把一個實數(shù)送入實數(shù)組a a中,連續(xù)讀中,連續(xù)讀8 8次,即讀入次,即讀入8 8個實數(shù)并送到數(shù)組個實數(shù)并送到數(shù)組a a中

28、。中。寫字符串函數(shù)寫字符串函數(shù)fputs 讀字符串函數(shù)讀字符串函數(shù)fgets 字符串讀寫函數(shù)處理的文件類型主要是文本文件,字符串讀寫函數(shù)處理的文件類型主要是文本文件,也分為讀字符串函數(shù)和寫字符串函數(shù)。也分為讀字符串函數(shù)和寫字符串函數(shù)。 fputs函數(shù)的功能是向指定的文件寫入一個字符串,其函數(shù)的功能是向指定的文件寫入一個字符串,其調(diào)用形式為:調(diào)用形式為:fputs(字符串字符串,文件指針文件指針); 字符串可以是字符串常量,也可以是字符數(shù)組名,或字符串可以是字符串常量,也可以是字符數(shù)組名,或指針變量,例如:指針變量,例如:fputs(Human,fp); 上述語句的含義是把字符串上述語句的含義是

29、把字符串“Human”寫入寫入fp所指所指的文件之中。的文件之中。 fgets函數(shù)的功能是從指定的文件中讀一個字符串到字函數(shù)的功能是從指定的文件中讀一個字符串到字符數(shù)組中,其調(diào)用形式為:符數(shù)組中,其調(diào)用形式為:fgets (str,n,fp); 函數(shù)中的參數(shù)函數(shù)中的參數(shù)str是字符數(shù)組名;是字符數(shù)組名;n是一個正整數(shù),表是一個正整數(shù),表示從文件中讀出的字符串不超過示從文件中讀出的字符串不超過n-1個字符。在向字符數(shù)個字符。在向字符數(shù)組讀入的最后一個字符后加上字符串結(jié)束標志組讀入的最后一個字符后加上字符串結(jié)束標志0。如果。如果在讀在讀n-1個字符之前遇到換行符或個字符之前遇到換行符或EOF,讀入

30、工作也結(jié)束。,讀入工作也結(jié)束。例如:例如:fgets (ch,50,fp); 上述語句的含義是從上述語句的含義是從fp所指的文件中讀出所指的文件中讀出49個字符送個字符送入字符數(shù)組入字符數(shù)組ch中。中。 文件的格式化讀寫函數(shù)和以前學習的格式化輸入文件的格式化讀寫函數(shù)和以前學習的格式化輸入/輸輸出函數(shù)很類似,對于格式化輸入出函數(shù)很類似,對于格式化輸入/輸出函數(shù),只能和標準輸出函數(shù),只能和標準輸入輸入/輸出設(shè)備文件打交道;而有了格式化的讀寫函數(shù)之輸出設(shè)備文件打交道;而有了格式化的讀寫函數(shù)之后,不但可以處理標準設(shè)備的輸入后,不但可以處理標準設(shè)備的輸入/輸出輸出,而且可以處理磁而且可以處理磁盤文件中的

31、數(shù)據(jù)。盤文件中的數(shù)據(jù)。 格式化寫函數(shù)格式化寫函數(shù)fprintffprintf 格式化讀函數(shù)格式化讀函數(shù)fscanffscanf 格式化寫函數(shù)格式化寫函數(shù)fprintf的調(diào)用格式為:的調(diào)用格式為:fprintf(文件指針文件指針,格式字符串格式字符串,輸出列表輸出列表);例如:例如:fprintf(fp, %d%c,j,ch); 上述語句的作用是將整型變量上述語句的作用是將整型變量j和字符型變量和字符型變量ch的值的值按按%d和和%c的格式輸出到的格式輸出到fp指向的文件上。指向的文件上。 格式化寫函數(shù)格式化寫函數(shù)fscanf的調(diào)用格式為:的調(diào)用格式為:fscanf (文件指針文件指針,格式字符

32、串格式字符串,輸入列表輸入列表);例如:例如: fscanf (fp, %d%s,&i,str);若此時若此時fp所指的文件中存放著以下的數(shù)據(jù):所指的文件中存放著以下的數(shù)據(jù): 6happnewyear 上述語句的作用是將上述語句的作用是將6賦給整型變量賦給整型變量i,將,將 “ “happynewyear” ” 賦給字符型數(shù)組賦給字符型數(shù)組str。 除了上面介紹的讀寫函數(shù)外,大部分的除了上面介紹的讀寫函數(shù)外,大部分的C C語言編譯系語言編譯系統(tǒng)還提供了對磁盤文件讀寫一個字統(tǒng)還提供了對磁盤文件讀寫一個字( (整數(shù)整數(shù)) )的函數(shù)的函數(shù)putwputw和和getwgetw 但但putw和和

33、getw并不是并不是ANSI C標準定義的函數(shù),所以標準定義的函數(shù),所以如果所用的如果所用的C語言編譯系統(tǒng)不提供這兩個函數(shù),可以按如語言編譯系統(tǒng)不提供這兩個函數(shù),可以按如下的形式自定義這兩個函數(shù)。下的形式自定義這兩個函數(shù)。 putwputw函數(shù)的定義函數(shù)的定義 getwgetw函數(shù)的定義函數(shù)的定義 putw(int i,FILE *fp)char *s;s=&i;putc(s0,fp);puts(s1,fp);return (i);getw(FILE *fp) char *s;int i;s=&i;s0=getc(fp);s1=getc(fp);return (i);例如:例如

34、:putw(200,fp);上述語句的功能是將整數(shù)上述語句的功能是將整數(shù)200輸出到輸出到fp所指向的文件中。所指向的文件中。 前面介紹的對文件的讀寫方式都是順序讀寫,也就是前面介紹的對文件的讀寫方式都是順序讀寫,也就是讀寫文件只能從頭開始,順序讀寫各個數(shù)據(jù)。但在實際讀寫文件只能從頭開始,順序讀寫各個數(shù)據(jù)。但在實際問題中常常要求只讀寫文件中某一指定的部分。為了解問題中常常要求只讀寫文件中某一指定的部分。為了解決這個問題,決這個問題,C語言引入了隨機讀寫的概念。所謂語言引入了隨機讀寫的概念。所謂“隨機隨機讀寫讀寫”是將文件內(nèi)部的位置指針移動到需要讀寫的位置是將文件內(nèi)部的位置指針移動到需要讀寫的位

35、置后再進行讀寫,這種讀寫稱為隨機讀寫。實現(xiàn)隨機讀寫后再進行讀寫,這種讀寫稱為隨機讀寫。實現(xiàn)隨機讀寫的關(guān)鍵是按要求移動位置指針,這稱為文件的的關(guān)鍵是按要求移動位置指針,這稱為文件的“定位定位”。 移動文件內(nèi)部位置指針的函數(shù)主要有兩個,即移動文件內(nèi)部位置指針的函數(shù)主要有兩個,即rewind函數(shù)和函數(shù)和fseek函數(shù)。函數(shù)。 當讀取了文件中若干個數(shù)據(jù)后,又要從頭讀取數(shù)據(jù),當讀取了文件中若干個數(shù)據(jù)后,又要從頭讀取數(shù)據(jù),這時就需要將文件內(nèi)部指針重新指向文件頭,這時就需要將文件內(nèi)部指針重新指向文件頭,C語言提供語言提供的文件頭定位函數(shù)的文件頭定位函數(shù)rewind就可以將文件指針重新指定到就可以將文件指針重

36、新指定到文件頭。該函數(shù)的調(diào)用格式為:文件頭。該函數(shù)的調(diào)用格式為:rewind(文件指針文件指針); 其功能是把文件內(nèi)部的位置指針移到文件開頭,如果其功能是把文件內(nèi)部的位置指針移到文件開頭,如果定位成功,返回定位成功,返回0;否則,返回非;否則,返回非0。 前面學習的文件讀寫函數(shù)主要是用來讀寫順序文件的。前面學習的文件讀寫函數(shù)主要是用來讀寫順序文件的。例如:如果要讀取文件中的第例如:如果要讀取文件中的第6個數(shù)據(jù),則打開文件后必個數(shù)據(jù),則打開文件后必須先讀取前須先讀取前5個數(shù)據(jù)后,在讀取個數(shù)據(jù)后,在讀取1個數(shù)據(jù)才是所需要的數(shù)個數(shù)據(jù)才是所需要的數(shù)據(jù)。而文件隨機定位函數(shù)可以使文件內(nèi)部位置指針直接據(jù)。而

37、文件隨機定位函數(shù)可以使文件內(nèi)部位置指針直接指向第指向第6個數(shù)據(jù),在讀取當前一個數(shù)據(jù)就可以。個數(shù)據(jù),在讀取當前一個數(shù)據(jù)就可以。 fseek函數(shù)用來移動文件內(nèi)部位置指針,其調(diào)用形式為:函數(shù)用來移動文件內(nèi)部位置指針,其調(diào)用形式為:fseek(文件指針文件指針,位移量位移量,起始點起始點);v “ “文件指針文件指針”指向被移動的文件。指向被移動的文件。v “ “位移量位移量”表示移動的字節(jié)數(shù),要求位移量表示移動的字節(jié)數(shù),要求位移量是是 longlong型數(shù)據(jù),以便在文件長度大于型數(shù)據(jù),以便在文件長度大于64KB64KB時不時不會出錯。當用常量表示位移量時,要求加后綴會出錯。當用常量表示位移量時,要求

38、加后綴“L”L”。v “ “起始點起始點”表示從何處開始計算位移量,表示從何處開始計算位移量,C語言規(guī)定的起始點有三種:文件首、當前位置和語言規(guī)定的起始點有三種:文件首、當前位置和文件尾,表示方法可以用下表來說明。文件尾,表示方法可以用下表來說明。 起始點起始點表示符號表示符號數(shù)字表示數(shù)字表示文件首文件首SEEK_SET0當前位置當前位置SEEK_CUR1文件末尾文件末尾SEEK_END2 例如:例如:fseek(fp,200L,0); 上述語句的功能是把位置指針移到距文件首上述語句的功能是把位置指針移到距文件首200個字節(jié)處。個字節(jié)處。 用用ftellftell()()函數(shù)可以返回文件指針的

39、當前位置。其調(diào)用格函數(shù)可以返回文件指針的當前位置。其調(diào)用格式為:式為:ftell(fpftell(fp);); 該函數(shù)的返回值為長整型數(shù),表示相對于文件頭的字節(jié)數(shù),該函數(shù)的返回值為長整型數(shù),表示相對于文件頭的字節(jié)數(shù),出錯時返回出錯時返回-1L-1L。 例如:例如: long i;long i; if(i=ftell(fp if(i=ftell(fp) =-1L) =-1L) printf printf( A file error has occurred at( A file error has occurred at %ld.n,i); %ld.n,i);上述程序段可以通知用戶在文件的什么位

40、置出現(xiàn)了文件錯誤。上述程序段可以通知用戶在文件的什么位置出現(xiàn)了文件錯誤。 v 程序從一個磁盤文件中逐個讀取字符并輸出到屏幕程序從一個磁盤文件中逐個讀取字符并輸出到屏幕上顯示,在上顯示,在whilewhile循環(huán)中常以循環(huán)中常以EOFEOF作為文件結(jié)束標志。這作為文件結(jié)束標志。這種以種以EOFEOF作為文件結(jié)束標志的文件,必須是文本文件。在作為文件結(jié)束標志的文件,必須是文本文件。在文本文件中數(shù)據(jù)都是以字符的文本文件中數(shù)據(jù)都是以字符的ASCIIASCII代碼值的形式存放。代碼值的形式存放。我們知道,我們知道,ASCIIASCII代碼值的范圍是代碼值的范圍是02550255,不可能出現(xiàn),不可能出現(xiàn)-

41、1-1,因此可以用因此可以用EOFEOF作為文件結(jié)束標志。作為文件結(jié)束標志。v 當把數(shù)據(jù)以二進制形式存放到文件中時,就會有當把數(shù)據(jù)以二進制形式存放到文件中時,就會有-1值值的出現(xiàn),此時不能采用的出現(xiàn),此時不能采用EOF作為二進制文件的結(jié)束標志。作為二進制文件的結(jié)束標志。為解決這一問題,為解決這一問題,ANSI C提供一個提供一個feof函數(shù),用來判斷函數(shù),用來判斷文件是否結(jié)束。如果遇到文件結(jié)束,函數(shù)文件是否結(jié)束。如果遇到文件結(jié)束,函數(shù)feof(fp)的值為的值為1,否則為否則為0。feof函數(shù)既可用以判斷二進制文件是否結(jié)束,函數(shù)既可用以判斷二進制文件是否結(jié)束,也可用以判斷文本文件是否結(jié)束。也可用以判斷文本文件是否結(jié)束。 nC標準提供了標準提供了ferror和和clearerr等一些函數(shù)用來等一些函數(shù)用來檢測輸入檢測輸入/輸出函數(shù)調(diào)用中的錯誤。輸出函數(shù)調(diào)用中的錯誤。 在調(diào)用各種輸入在調(diào)用各種輸入/ /輸出函數(shù)時,除了函數(shù)本身的返回值可輸出函數(shù)時,除了函數(shù)本身的返回值可以判斷調(diào)用是否出錯外,還可以用以判斷調(diào)用是否出錯外,還可以用ferrorferr

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責。
  • 6. 下載文件中如有侵權(quán)或不適當內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論