版權(quán)說(shuō)明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
第8章文件8.3文件的定位和檢測(cè)8.4程序案例本章小結(jié)學(xué)生自我完善練習(xí)目錄8.1文件的概念和基本操作8.2文件的讀寫8.1文件的概念和基本操作所謂文件,是指存儲(chǔ)在外部介質(zhì)上的數(shù)據(jù)的集合。前面已經(jīng)多次使用了文件,例如,源程序文件(.c),目標(biāo)文件(.obj),可執(zhí)行文件(.exe),庫(kù)文件(.lib)和頭文件(.h)等。計(jì)算機(jī)把所有外部設(shè)備都當(dāng)作文件來(lái)對(duì)待,這樣的文件稱為設(shè)備文件。操作系統(tǒng)是以文件為單位對(duì)數(shù)據(jù)進(jìn)行管理的。每個(gè)文件都有一個(gè)唯一的“文件標(biāo)識(shí)”來(lái)定位,即文件路徑和文件名。例如:C:\TC\tc.exe。則C:\TC就是文件路徑,tc.exe就是文件名,文件路徑和文件名結(jié)合起來(lái)系統(tǒng)就能找到該文件所在。當(dāng)需要使用文件的時(shí)候,需要將文件調(diào)入到內(nèi)存中。8.1.1文件的概念8.1文件的概念和基本操作
1.文件的分類文件可以從不同的角度進(jìn)行分類。(1)根據(jù)文件的內(nèi)容來(lái)分:可分為源程序文件、目標(biāo)文件、可執(zhí)行文件和數(shù)據(jù)文件等。(2)根據(jù)文件的組織形式來(lái)分:可分為順序存取文件和隨機(jī)存取文件。(3)根據(jù)文件的存儲(chǔ)形式來(lái)分:可分為ASCII碼文件(又稱文本文件)和二進(jìn)制文件。ASCII碼文件是每一個(gè)字節(jié)存儲(chǔ)一個(gè)ASCII碼(代表一個(gè)字符)。二進(jìn)制文件是把內(nèi)存中的數(shù)據(jù),原樣輸出到磁盤文件中。有一個(gè)整數(shù)100,如果按二進(jìn)制形式存儲(chǔ),兩個(gè)字節(jié)就夠用;如果按ASCII碼形式存儲(chǔ),由于每位數(shù)字都占用一個(gè)字節(jié),所以共需要三個(gè)字節(jié)空間,每個(gè)字節(jié)空間中存儲(chǔ)的是該數(shù)字的ASCII碼值,如圖8-1所示。8.1.1文件的概念8.1文件的概念和基本操作
2.讀文件與寫文件所謂讀文件,是指將磁盤文件中的數(shù)據(jù)傳送到計(jì)算機(jī)內(nèi)存的操作;所謂寫文件,是指從計(jì)算機(jī)內(nèi)存向磁盤文件中傳送數(shù)據(jù)的操作,如圖8-2所示。3.緩沖文件系統(tǒng)(標(biāo)準(zhǔn)I/O)所謂緩沖文件系統(tǒng),是指系統(tǒng)自動(dòng)地在內(nèi)存區(qū)為每個(gè)正在使用的文件開辟一個(gè)緩沖區(qū)。從磁盤文件向內(nèi)存讀入數(shù)據(jù)時(shí),首先將一批數(shù)據(jù)讀入到文件緩沖區(qū)中,再?gòu)奈募彌_區(qū)將數(shù)據(jù)逐個(gè)送到程序數(shù)據(jù)區(qū)。從內(nèi)存向磁盤輸出數(shù)據(jù)時(shí),則正好相反:必須先將一批數(shù)據(jù)輸出到緩沖區(qū)中,待緩沖區(qū)裝滿后,再一起輸出到磁盤文件中,如圖8-3所示。8.1.1文件的概念圖8-2讀寫文件操作示意圖圖8-3從磁盤文件向內(nèi)存讀入數(shù)據(jù)和內(nèi)存輸出數(shù)據(jù)8.1文件的概念和基本操作
4.文件類型系統(tǒng)給每個(gè)打開的文件都在內(nèi)存中開辟一個(gè)區(qū)域,用于存放文件的有關(guān)信息(如文件名、文件位置等)。這些信息保存在一個(gè)結(jié)構(gòu)類型變量中,該結(jié)構(gòu)類型由系統(tǒng)定義,取名為FILE(注意:“FILE”必須大寫),并放在“stdio.h”頭文件中。有的C版本在stdio.h文件中有以下的文件類型聲明:typedefstruct{shortlevel /*緩沖區(qū)“滿”或“空”的程度*/unsignedlags; /*文件狀態(tài)標(biāo)志*/charfd; /*文件描述符*/unsignedcharhold; /*無(wú)緩沖區(qū)不讀取字符*/shortbsize; /*緩沖區(qū)大小*/unsignedchar*buffer; /*數(shù)據(jù)緩沖區(qū)位置指針*/unsignedchar*curp; /*當(dāng)前指針指向*/unsignedistemp; /*臨時(shí)文件指示器*/shorttoken; /*用于有效性檢查*/}FILE;8.1.1文件的概念8.1文件的概念和基本操作有了FILE類型之后,就可以定義一個(gè)指向FILE類型的指針變量,并通過(guò)該指針訪問文件。文件類型指針的定義格式為:例如:FILE*fp,*fp1,*fp2; /*定義三個(gè)文件指針fp、fp1和fp2*/C語(yǔ)言標(biāo)準(zhǔn)設(shè)備文件是由系統(tǒng)控制的,由系統(tǒng)自動(dòng)打開和關(guān)閉,其文件結(jié)構(gòu)指針由系統(tǒng)命名,用戶無(wú)須說(shuō)明即可直接使用。例如:stdin標(biāo)準(zhǔn)輸入文件(鍵盤)stdout標(biāo)準(zhǔn)輸出文件(顯示器)stderr標(biāo)準(zhǔn)錯(cuò)誤輸出文件(顯示器)對(duì)文件進(jìn)行操作之前必須“打開”文件,打開文件的作用實(shí)際上是建立該文件的信息結(jié)構(gòu),并且給出指向該信息結(jié)構(gòu)的指針以便對(duì)文件進(jìn)行訪問。文件使用結(jié)束之后應(yīng)該“關(guān)閉”該文件。文件的打開和關(guān)閉是通過(guò)調(diào)用fopen和fclose函數(shù)來(lái)實(shí)現(xiàn)的。8.1.1文件的概念FILE*文件指針名;8.1文件的概念和基本操作1.文件的打開ANSIC規(guī)定了標(biāo)準(zhǔn)輸入/輸出函數(shù)庫(kù),用fopen函數(shù)來(lái)實(shí)現(xiàn)文件的打開,其調(diào)用的一般格式如下:例如:fp=fopen(“example.txt”,“r”);/*以只讀的方式打開文件example.txt*/該語(yǔ)句的含義是要打開名字為example.txt的文件,文件使用的方式為“只讀”。fopen函數(shù)返回指向example.txt文件的指針并賦給fp,這樣fp就與example.txt相聯(lián)系了,或者說(shuō)fp指向了example.txt文件。8.1.2文件的打開和關(guān)閉FILE*fp;fp=fopen(文件名
,文件使用方式
);8.1文件的概念和基本操作文件的使用方式規(guī)定了打開文件的目的,如表8-1所示。表8-1fopen函數(shù)中的文件使用方式8.1.2文件的打開和關(guān)閉文件使用方式含
義說(shuō)
明"r"(只讀)打開文本文件,只讀如果指定文件不存在,則出錯(cuò)"w"(只寫)打開文本文件,只寫新建一個(gè)文件,如果指定文件已存在,則刪除它,再新建"a"(追加)打開文本文件,追加如果指定文件不存在,則創(chuàng)建該文件"rb"(只讀)打開二進(jìn)制文件,只讀如果指定文件不存在,則出錯(cuò)"wb"(只寫)打開二進(jìn)制文件,只寫新建一個(gè)文件,如果指定文件已存在,則刪除它,再新建8.1文件的概念和基本操作表8-1fopen函數(shù)中的文件使用方式續(xù)表8.1.2文件的打開和關(guān)閉文件使用方式含
義說(shuō)
明"ab"(追加)打開二進(jìn)制文件,追加如果指定文件不存在,則創(chuàng)建該文件"r+"(讀寫)打開文本文件,讀、寫如果指定文件不存在,則出錯(cuò)"w+"(讀寫)打開文本文件,讀、寫新建一個(gè)文件,如果指定文件已存在,則刪除它,再新建"a+"(讀追加)打開文本文件,讀、追加如果指定文件不存在,則創(chuàng)建該文件"rb+"(讀寫)打開二進(jìn)制文件,讀、寫如果指定文件不存在,則出錯(cuò)"wb+"(讀寫)打開二進(jìn)制文件,讀、寫新建一個(gè)文件,如果指定文件已存在,則刪除它,再新建"ab+"(讀追加)打開二進(jìn)制文件,讀、追加如果指定文件不存在,則創(chuàng)建該文件注:各字符含義如下:r:(read),w:(write),a:(append),b:(binary),+:(讀寫)。8.1文件的概念和基本操作如果文件名中包括文件的路徑,則用雙反斜線表示路徑(雙反斜線“\\”中的第一個(gè)表示轉(zhuǎn)義字符,第二個(gè)表示路徑分隔符“\”)。例如:FILE*fp;fp=fopen("c:\\user\\abc.txt","w");/*以只寫文件打開文件c盤user文件夾下的文件abc.txt*/其意義是以只寫方式打開C驅(qū)動(dòng)器磁盤下文件夾user中的文件abc.txt,并使文件指針fp指向該文件。8.1.2文件的打開和關(guān)閉8.1文件的概念和基本操作說(shuō)明:(1)用以上方式可以打開文本文件或二進(jìn)制文件,這是ANSIC的規(guī)定,即用同一種文件緩沖系統(tǒng)來(lái)處理文本文件和二進(jìn)制文件。但目前有些C編譯系統(tǒng)可能不完全提供所有這些功能,有的C版本不用"r+"、"w+"、"a+"而用"rw"、"wr"、"ar"等。請(qǐng)大家注意所用C系統(tǒng)的規(guī)定。(2)如果文件“打開”不能實(shí)現(xiàn),fopen()函數(shù)值將會(huì)返回一個(gè)錯(cuò)誤信息。出錯(cuò)的原因可能是:用"r"方式打開一個(gè)并不存在的文件、磁盤出故障、磁盤已滿無(wú)法建立新文件等。此時(shí)fopen()函數(shù)將返回一個(gè)空指針值NULL(NULL在stdio.h文件中已被定義為0)。常用下列方法打開一個(gè)文件:if((fp=fopen("file1","r"))==NULL)/*當(dāng)以只讀方式打開文件file1失敗時(shí)*/{printf("打開文件失?。n");exit(0);/*在C及C++實(shí)驗(yàn)系統(tǒng)中可去掉該語(yǔ)句*/}即先檢查打開文件(file1)有無(wú)出錯(cuò),如果有錯(cuò)就在終端上輸出“打開文件失敗!”。exit(0)函數(shù)的作用是關(guān)閉所有文件,終止正在調(diào)用的進(jìn)程。(3)在讀取文本文件時(shí),會(huì)自動(dòng)將回車、換行兩個(gè)符號(hào)轉(zhuǎn)換為一個(gè)換行符;在寫入時(shí)會(huì)自動(dòng)將一個(gè)換行符轉(zhuǎn)換為回車和換行兩個(gè)字符。在用二進(jìn)制文件時(shí),不會(huì)進(jìn)行這種轉(zhuǎn)換,因?yàn)樵趦?nèi)存中的數(shù)據(jù)形式與寫入到外部文件中的數(shù)據(jù)形式完全一致,一一對(duì)應(yīng)。8.1.2文件的打開和關(guān)閉8.1文件的概念和基本操作2.文件的關(guān)閉文件使用完后應(yīng)將它關(guān)閉,以保證本次文件操作的有效?!瓣P(guān)閉”就是使文件指針變量不指向該文件,也就是文件指針變量與文件“脫鉤”。此后不能再通過(guò)該指針對(duì)原來(lái)關(guān)聯(lián)的文件進(jìn)行操作。用fclose函數(shù)關(guān)閉文件,其一般形式為:例如:fclose(fp);/*關(guān)閉文件指針fp所指向的文件*/在前面例子中,把fopen函數(shù)帶回的指針賦給了fp,現(xiàn)在通過(guò)fp關(guān)閉該文件,即fp不再指向該文件。如果文件關(guān)閉成功,fclose函數(shù)返回值為0,否則返回EOF(-1)。這可以用ferror函數(shù)來(lái)測(cè)試。8.1.2文件的打開和關(guān)閉Fclose(文件指針名);8.2文件的讀寫1.字符輸入函數(shù)fgetcfgetc函數(shù)是用來(lái)從指定文件中讀取一個(gè)字符。它的調(diào)用格式如下:說(shuō)明:fp為文件指針,ch為字符型變量。功能:從指定的文件讀取一個(gè)字符,并賦給字符型變量ch。如果讀取成功,函數(shù)返回讀取的字符;如果遇到文件結(jié)束符,則返回一個(gè)文件結(jié)束標(biāo)志EOF(-1)。當(dāng)形參為標(biāo)準(zhǔn)輸入文件指針stdin時(shí),則讀文件文字函數(shù)fgetc(stdin)與終端輸入函數(shù)getchar()具有完全相同的功能。例如:charch;/*定義一個(gè)字符變量ch*/ch=fgetc(fp);/*從指針fp所指文件中讀取一個(gè)字符賦給變量ch*/8.2.1字符的讀寫函數(shù)ch=fgetc(fp);8.2文件的讀寫2.字符輸出函數(shù)fputcfputc函數(shù)是把一個(gè)字符輸出(寫入)到磁盤文件上。它的一般調(diào)用形式為:說(shuō)明:fp為文件指針,ch為要輸出的字符,它可以是一個(gè)字符常量,也可以是一個(gè)字符變量。功能:將字符ch的值輸出到fp所指向的文件上。如果輸出成功,函數(shù)的返回值是輸出的字符;如果輸出失敗,則返回文件結(jié)束標(biāo)志EOF。EOF是在stdio.h中定義的符號(hào)常量,值為-1,十六進(jìn)制表示為0xFF。例如:charch='W';/*定義一個(gè)字符變量ch并將其初始化值為字符常量'W'*/fputc(ch,fp);/*將字符變量ch的值存入fp所指文件中*/8.2.1字符的讀寫函數(shù)fputc(ch,fp);8.2文件的讀寫【案例8-1】設(shè)計(jì)一個(gè)程序,將字符A、B、C和文件結(jié)束標(biāo)志EOF寫入文件"c:\file1.txt"中,然后再?gòu)奈募?c:\file1.txt"中讀出所有的字符并顯示在屏幕上。程序分析因?yàn)槭窍葘⒆址麑懭胛募?,所以要使用只寫(w)方式打開文件,然后使用字符輸出函數(shù)fputc,操作結(jié)束后關(guān)閉文件。然后再使用只讀(r)方式打開文件,使用字符輸入函數(shù)fgetc從文件中讀取所有內(nèi)容,用標(biāo)準(zhǔn)字符輸出函數(shù)putchar輸出到屏幕上,最后關(guān)閉該文件,完成整個(gè)操作。打開源程序當(dāng)輸入文件路徑名和文件名為:e:\file1.txt時(shí),程序運(yùn)行結(jié)果為:8.2文件的讀寫
1.讀文件字符串函數(shù)fgetsfgets函數(shù)是從指定文件讀入一個(gè)字符串,該文件必須是以讀或讀寫方式打開的。fgets函數(shù)調(diào)用格式如下:說(shuō)明:str為一個(gè)字符型數(shù)組名或指向字符串的指針,n為讀取的最多字符個(gè)數(shù),fp為要讀取的文件指針。功能:從指定文件中讀取一個(gè)長(zhǎng)度不超過(guò)n-1個(gè)字符的字符串,并將該字符串存入字符數(shù)組str中。讀取成功,函數(shù)返回字符數(shù)組str的首地址;如果文件結(jié)束或出錯(cuò),則返回NULL。讀取時(shí)遇到以下情況結(jié)束。(1)已經(jīng)讀取了n-1個(gè)字符。(2)當(dāng)前讀取到的字符為回車符。(3)已讀取文件末尾。例如:while((fgets(str,10,fp))!=NULL)/*當(dāng)文件沒結(jié)束時(shí),每次讀取長(zhǎng)度為9的字符串并賦給數(shù)組str*/8.2.2字符串的讀寫函數(shù)fgets(str,n,fp);8.2文件的讀寫2.寫文件字符串函數(shù)fputsfputs函數(shù)是把一個(gè)字符串輸出到磁盤文件中,fputs函數(shù)調(diào)用格式如下:說(shuō)明:str為一個(gè)字符型數(shù)組名或指向字符串的指針,fp為要寫入的文件指針。功能。將str指向的字符串寫入fp所指文件中,同時(shí)將讀寫位置指針向前移動(dòng)字符串長(zhǎng)度strlength(str)個(gè)字節(jié)。如果輸出成功,則函數(shù)返回值為0;否則,為非0值。fputs函數(shù)在使用stdout作為fp參數(shù)時(shí),與puts函數(shù)功能有所不同:fputs舍棄輸出字符串末尾加入的'\0'字符,而puts把它轉(zhuǎn)換成回車字符輸出。8.2.2字符串的讀寫函數(shù)fputs(str,fp);提示:使用fputs函數(shù)時(shí)在成功將字符串寫入文件時(shí),字符串末尾的結(jié)束標(biāo)志'\0'將自動(dòng)舍去。8.2文件的讀寫【案例8-2】設(shè)計(jì)一個(gè)程序,將字符串"Hello,"、"all□"、"the□"、"world□"、"people!"(其中□表示空格)寫入文件"c:\file2.txt"中,然后再?gòu)奈募?c:\file2.txt"中讀出所有的字符串并顯示在屏幕上。程序分析:因?yàn)槭窍葘⒆址畬懭胛募?,所以要使用只寫(w)方式打開文件,然后使用字符串輸出函數(shù)fputs將所有字符串輸出到文件中,操作結(jié)束后關(guān)閉文件。然后再使用只讀(r)方式打開文件,使用字符串輸入函數(shù)fgets從文件中讀取所有字符串,用標(biāo)準(zhǔn)字符串輸出函數(shù)puts輸出到屏幕上,最后關(guān)閉該文件,完成整個(gè)操作。打開源程序當(dāng)輸入文件路徑名和文件名為:e:\file2.txt時(shí),程序運(yùn)行結(jié)果為:8.2文件的讀寫1.文件數(shù)據(jù)塊讀函數(shù)freadfread函數(shù)用來(lái)從指定文件中讀取一個(gè)指定字符的數(shù)據(jù)塊,它的調(diào)用格式如下:說(shuō)明:buffer為讀入數(shù)據(jù)在內(nèi)存中存放的起始地址;size為每次要讀取的字符數(shù);count為要讀取的次數(shù);fp為文件類型的指針。功能:該函數(shù)用于從文件中讀取一個(gè)數(shù)據(jù)塊。該函數(shù)的功能是從fp所指的文件中,讀取長(zhǎng)度為size字節(jié)的數(shù)據(jù)項(xiàng)count次,存放到buffer所指的內(nèi)存單元中,所讀取的數(shù)據(jù)塊大小為size*count字節(jié)。例如,若a為一個(gè)實(shí)型數(shù)組名,則:fread(a,4,6,fp);/*從fp所指文件中讀取6次4個(gè)字節(jié)的實(shí)型數(shù)據(jù),存儲(chǔ)到數(shù)組a中*/8.2.3數(shù)據(jù)塊的讀寫函數(shù)fread(buffer,size,count,fp);8.2文件的讀寫2.文件數(shù)據(jù)塊寫函數(shù)fwritefwrite函數(shù)用來(lái)向指定文件中寫入數(shù)據(jù)塊,fwrite函數(shù)調(diào)用格式如下:說(shuō)明:buffer為被寫入數(shù)據(jù)在內(nèi)存中存放的起始地址,可以是數(shù)組名或指向數(shù)組的指針;size為每次要寫入的字節(jié)數(shù);count為要寫入的次數(shù);fp為文件指針。功能:該函數(shù)的功能是從buffer所指向的內(nèi)存區(qū)域取出count個(gè)數(shù)據(jù)項(xiàng)寫入fp指向的文件中,每個(gè)數(shù)據(jù)項(xiàng)的長(zhǎng)度為size,也就是寫入的數(shù)據(jù)塊大小為size*count個(gè)字節(jié)。8.2.3數(shù)據(jù)塊的讀寫函數(shù)fwrite(buffer,size,count,fp);8.2文件的讀寫【案例8-3】設(shè)計(jì)一個(gè)程序,從鍵盤輸入一批學(xué)生數(shù)據(jù),然后存儲(chǔ)到磁盤文件上,再輸出磁盤文件中的學(xué)生數(shù)據(jù)到屏幕上。注意成塊輸入fread函數(shù)和成塊輸出fwrite函數(shù)的使用方法。程序分析:因?yàn)槭窍葘⒔Y(jié)構(gòu)體學(xué)生信息寫入文件中,所以要使用只寫(wb,二進(jìn)制)方式打開文件,然后循環(huán)使用數(shù)據(jù)塊寫函數(shù)fwrite,將所有結(jié)構(gòu)體學(xué)生數(shù)據(jù)寫到文件中,操作結(jié)束后關(guān)閉文件。然后再使用只讀(rb,二進(jìn)制)方式打開文件,使用數(shù)據(jù)塊讀函數(shù)fread從文件中讀取所有結(jié)構(gòu)體學(xué)生數(shù)據(jù),用標(biāo)準(zhǔn)輸出函數(shù)printf輸出到屏幕上,最后關(guān)閉該文件,完成整個(gè)操作。打開源程序調(diào)試運(yùn)行程序:當(dāng)輸入文件路徑名和文件名為:e:\file3.txt時(shí),程序運(yùn)行時(shí)輸入兩個(gè)學(xué)生信息,運(yùn)行結(jié)果如下:8.2文件的讀寫1.格式化輸入文件函數(shù)fscanffscanf函數(shù)與scanf函數(shù)作用相似,都是格式化讀取函數(shù),只不過(guò)不是從終端讀取而是從文件讀取。其調(diào)用格式為:該函數(shù)的功能是從文件指針fp所指向的文本文件中讀出數(shù)據(jù),按格式字符串的格式存入輸入表列各變量中。注意:輸入表列為變量的地址,除字符串輸入(用字符數(shù)組名接收該字符串)不加“&”符號(hào)外,其他變量名前必須加“&”符號(hào)。例如:fscanf(fp,"%d,%f",&i,&t);/*從fp所指文件中讀取一個(gè)整型和實(shí)型數(shù)分別存入變量i和t中*/如果文件中有如下字符:3,4.5則文件中的數(shù)據(jù)3送給變量i,4.5送給變量t。函數(shù)執(zhí)行成功,返回值為實(shí)際讀取的數(shù)據(jù)項(xiàng)的個(gè)數(shù),否則為EOF或0。8.2.4格式化輸入輸出文件函數(shù)fscanf(fp,格式字符串
,輸入表列
);8.2文件的讀寫2.格式化輸出文件函數(shù)fprintffprintf函數(shù)與printf函數(shù)作用相仿,都是格式化寫入函數(shù),只不過(guò)寫入對(duì)象不是終端而是文件。其調(diào)用格式為:該函數(shù)的功能是按格式字符串的格式,將輸出表列的值寫入文件指針?biāo)赶虻奈谋疚募小W⒁猓狠敵霰砹袨樽兞棵?,不是變量的地址,不能在變量前加?”符號(hào)。例如:fprintf(fp,"%d,%6.2f",i,t);/*將整型和占6位寬度小數(shù)點(diǎn)后2位數(shù)字的實(shí)型數(shù)存入fp所指文件*/它的作用是將整型變量i和實(shí)型變量t的值按%d和%6.2f格式寫入fp所指向的文件中。如果i=3,t=4.5,則寫入到文件中的是以下字符串(“□”表示空格):3,□□4.50該函數(shù)執(zhí)行成功,返回值為實(shí)際寫入的字符個(gè)數(shù),否則為負(fù)數(shù)。8.2.4格式化輸入輸出文件函數(shù)fprintf(fp,格式字符串
,輸出表列
);8.2文件的讀寫【案例8-4】設(shè)計(jì)一個(gè)程序,從鍵盤輸入一批學(xué)生信息并寫入到一個(gè)二進(jìn)制文件中,再?gòu)拇疟P文件中讀取該文件中的所有學(xué)生信息并顯示到屏幕上。注意格式化輸入fprintf函數(shù)和格式化輸出fscanf函數(shù)的使用方法。程序分析:先將結(jié)構(gòu)體學(xué)生信息寫入文件中,所以要使用只寫(wb+,二進(jìn)制追加)方式打開文件,然后循環(huán)讀入每個(gè)學(xué)生信息,然后再循環(huán)中使用格式化輸出函數(shù)fprintf,將所有結(jié)構(gòu)體學(xué)生數(shù)據(jù)寫到文件中,操作結(jié)束后關(guān)閉文件。然后再使用只讀(rb,二進(jìn)制)方式打開文件,使用格式化輸入函數(shù)fscanf從文件中讀取所有結(jié)構(gòu)體學(xué)生數(shù)據(jù),用標(biāo)準(zhǔn)輸出函數(shù)printf輸出到屏幕上,最后關(guān)閉該文件,完成整個(gè)操作。打開源程序當(dāng)輸入文件路徑名和文件名為:e:\file4.txt時(shí),程序運(yùn)行時(shí)輸入兩個(gè)學(xué)生信息,運(yùn)行結(jié)果如下:8.3文件的定位和檢測(cè)文件中有一個(gè)位置指針,指向當(dāng)前讀寫的位置。如果順序讀寫一個(gè)文件,每次讀寫一個(gè)字符,則讀寫完一個(gè)字符后,位置指針自動(dòng)移動(dòng),指向下一個(gè)字符位置。在實(shí)際問題中,常要求讀寫文件中某些指定的部分。為了避免不必要的讀或?qū)懙牟僮?,可先移?dòng)文件的位置指針到需要讀寫的位置,再進(jìn)行讀寫,這種讀寫操作方式稱為隨機(jī)讀寫。移動(dòng)文件位置指針的操作稱為文件的定位。8.3文件的定位和檢測(cè)1.文件指針重返到文件頭部函數(shù)rewindrewind函數(shù)調(diào)用格式如下:說(shuō)明:fp為由fopen函數(shù)打開的文件指針。功能:使位置指針fp重新返回文件的開始位置(文件頭),此函數(shù)沒有返回值。
2.移動(dòng)文件指針到指定位置fseek函數(shù)fseek函數(shù)調(diào)用格式如下:說(shuō)明:fp為指向當(dāng)前文件的指針。offset為文件位置指針的位移量,指以起始位置為基準(zhǔn)值向后移動(dòng)的字節(jié)數(shù),要求位移量offset為long型數(shù)據(jù),位移量可正可負(fù)。位移量為正數(shù)時(shí),位置指針向后移動(dòng);位移量為負(fù)數(shù)時(shí),位置指針向前移動(dòng)。whence為起始位置,用整型常量表示,ANSIC規(guī)定它必須是0(文件開始)、1(文件當(dāng)前位置)或2(文件末尾)三個(gè)值之一,它們表示3個(gè)符號(hào)常數(shù),其值含義如表8-2所示。功能:將文件指針指到由起始位置(whence)開始,位移量為offset個(gè)字節(jié)后的位置處。如果文件定位成功,則fseek返回0,否則返回一個(gè)非0值。8.3.1文件的定位rewind(fp);fseek(fp,offset,whence);8.3文件的定位和檢測(cè)8.3.1文件的定位符號(hào)名數(shù)
字含
義SEEK_SET0文件開頭SEEK_CUR1文件指針當(dāng)前位置SEEK_END2文件末尾表8-2指針起始位置表示法fseek函數(shù)常用于二進(jìn)制文件的隨機(jī)讀寫。用于文本文件時(shí),因字符轉(zhuǎn)換問題,常出現(xiàn)定錯(cuò)位問題。例如:fseek(fp,58L,0); /*文件指針從文件開始處向后移動(dòng)58字節(jié)*/fseek(fp,30L,1); /*文件指針從當(dāng)前位置向后移動(dòng)30字節(jié)*/fseek(fp,-15L,2); /*文件指針從文件末尾處向前移動(dòng)15字節(jié)*/8.3文件的定位和檢測(cè)3.返回文件當(dāng)前指針位置函數(shù)ftellftell函數(shù)調(diào)用格式如下:說(shuō)明:fp為指向當(dāng)前文件的指針。功能:可以用ftell函數(shù)來(lái)返回文件指針的當(dāng)前位置。由于在文件的隨機(jī)讀寫過(guò)程中,位置指針不斷移動(dòng),往往不容易搞清當(dāng)前位置,這時(shí)就可以使用ftell函數(shù)得到文件指針的當(dāng)前位置。ftell函數(shù)的返回值為一個(gè)長(zhǎng)整型數(shù),表示當(dāng)前位置相對(duì)文件頭的字節(jié)數(shù),出錯(cuò)時(shí)返回-1L。例如:longi;if((i=ftell(fp))==-1L)/*當(dāng)文件指針返回值為-1L時(shí)出錯(cuò)*/printf("文件錯(cuò)誤發(fā)生在%ld位置。\n",i);該程序可通知用戶在文件什么位置出現(xiàn)了文件錯(cuò)誤。8.3.1文件的定位ftell(fp);8.3文件的定位和檢測(cè)【案例8-5】如果想將【案例8-3】的程序生成的"c:\file3.txt"文件中第奇數(shù)個(gè)學(xué)生的信息輸出,應(yīng)該怎樣實(shí)現(xiàn)?程序分析:因?yàn)槭窍葘⒔Y(jié)構(gòu)體學(xué)生信息寫入文件中,所以要使用只寫(wb,二進(jìn)制)方式打開文件,然后循環(huán)使用數(shù)據(jù)塊寫函數(shù)fwrite,將所有結(jié)構(gòu)體學(xué)生數(shù)據(jù)寫到文件中,操作結(jié)束后關(guān)閉文件。然后再使用只讀(rb,二進(jìn)制)方式打開文件,因?yàn)槭亲x取奇數(shù)個(gè)學(xué)生記錄,所以使用fseek進(jìn)行定位,然后再使用數(shù)據(jù)塊讀函數(shù)fread從文件中讀取所有奇數(shù)位上的結(jié)構(gòu)體學(xué)生數(shù)據(jù),用標(biāo)準(zhǔn)輸出函數(shù)printf輸出到屏幕上,最后關(guān)閉該文件,完成整個(gè)操作。打開源程序程序運(yùn)行結(jié)果:當(dāng)輸入文件路徑名和文件名為:e:\file5.txt時(shí),程序運(yùn)行時(shí)輸入三個(gè)學(xué)生信息,運(yùn)行結(jié)果如下:8.3文件的定位和檢測(cè)C標(biāo)準(zhǔn)中有一些檢測(cè)輸入/輸出函數(shù)調(diào)用中的錯(cuò)誤的函數(shù),主要有文件結(jié)束檢測(cè)函數(shù)feof、文件出錯(cuò)檢測(cè)函數(shù)ferror及文件出錯(cuò)標(biāo)志和文件結(jié)束標(biāo)志置0函數(shù)clearerr三個(gè)。
1.文件結(jié)束檢測(cè)函數(shù)feof函數(shù)調(diào)用格式如下:說(shuō)明:fp為指向當(dāng)前文件的指針。功能:feof函數(shù)用來(lái)判斷“文件指針”指向的文件是否處于文件結(jié)束位置,如文件結(jié)束,則返回值為1,否則為0。8.3.2文件的檢測(cè)feof(fp);8.3文件的定位和檢測(cè)2.文件出錯(cuò)檢測(cè)函數(shù)ferror大多數(shù)輸入/輸出函數(shù)不具有明確的出錯(cuò)信息返回,在調(diào)用各種輸入/輸出函數(shù)(如fputc、fgetc、fread、fwrite等)時(shí),如果出現(xiàn)了錯(cuò)誤,除了函數(shù)返回值有所反映外,還可以用ferror函數(shù)檢測(cè)。ferror函數(shù)調(diào)用格式如下:說(shuō)明:fp為指向當(dāng)前文件的指針。功能:ferror函數(shù)用來(lái)檢查文件fp在使用各種輸入、輸出函數(shù)進(jìn)行讀、寫時(shí)是否出錯(cuò),若出錯(cuò),返回值為1,否則返回0。8.3.2文件的檢測(cè)ferror(fp);8.3文件的定位和檢測(cè)3.文件出錯(cuò)標(biāo)志和文件結(jié)束標(biāo)志置0函數(shù)clearerrclearerr函數(shù)調(diào)用格式如下:說(shuō)明:fp為指向當(dāng)前文件的指針。功能:clearerr()函數(shù)用來(lái)使文件的錯(cuò)誤標(biāo)志和文件結(jié)束標(biāo)志置為0。假設(shè)在調(diào)用一個(gè)輸入、輸出函數(shù)時(shí)出現(xiàn)錯(cuò)誤,ferror函數(shù)值為一個(gè)非零值,在調(diào)用clearerr(fp)后,ferror(fp)的值變成0。8.3.2文件的檢測(cè)clearerr(fp);8.4程序案例【案例8-8】設(shè)計(jì)一個(gè)程序?qū)崿F(xiàn)人員登錄,即每當(dāng)從鍵盤接收一個(gè)姓名時(shí),便在文件"c:\member.dat"中進(jìn)行查找。若此姓名已存在,則顯示已存在該人員的信息,若文件中沒有該姓名,則將其存入文件(若文件"c:\member.dat"不存在,應(yīng)在磁盤上建立一個(gè)新文件)。當(dāng)輸入姓名按<回車>鍵或處理過(guò)程中出現(xiàn)錯(cuò)誤時(shí)程序結(jié)束。打開源程序程序運(yùn)行結(jié)果8.4.1典型案例——文件的字符串讀寫程序,實(shí)現(xiàn)人員登錄功能8.4程序案例【案例8-9】編程實(shí)現(xiàn)統(tǒng)計(jì)一個(gè)或多個(gè)文件的行數(shù)、字?jǐn)?shù)和字符數(shù)。一行由一個(gè)換行符限定,一個(gè)字由一個(gè)空格分隔(包括空白符、制表符和換行符),字符是指文件中的所有字符。要求程序另設(shè)3個(gè)任選的參數(shù),讓用戶指定所要統(tǒng)計(jì)的內(nèi)容。L——統(tǒng)計(jì)文件行數(shù);w——統(tǒng)計(jì)文件字?jǐn)?shù);c——統(tǒng)計(jì)文件字符數(shù)。若用戶未指定任選的參數(shù),則表示3個(gè)統(tǒng)計(jì)都要。運(yùn)行本程序時(shí)參數(shù)按以下格式給出:-l-w-c文件1文件2……文件n其中,前3個(gè)任選參數(shù)l、w、c的出現(xiàn)與否和出現(xiàn)順序任意,或任意組合在一起出現(xiàn),如-lwc、-cwl、-wl、-cl、-cw等。8.4.2典型案例——文件中的字?jǐn)?shù)統(tǒng)計(jì)程
溫馨提示
- 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ù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 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ì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 2024年建筑工人勞動(dòng)合同樣本
- 2024年度互聯(lián)網(wǎng)金融服務(wù)平臺(tái)技術(shù)開發(fā)與運(yùn)營(yíng)合同
- 2024年工程文件保密與轉(zhuǎn)讓協(xié)議
- 2024醫(yī)療器械銷售及市場(chǎng)推廣合同
- 2024年公共交通乘車意外傷害保險(xiǎn)合同
- 2024年度居民搬家服務(wù)定制合同
- 2024年工程建設(shè)的擔(dān)保協(xié)議
- 2024年勞動(dòng)力外包合作協(xié)議
- 2024年度股權(quán)轉(zhuǎn)讓合同模板
- 2024人工智能技術(shù)研發(fā)合同-科技創(chuàng)新合作
- 《功能材料概論》課件
- 工程師職稱代評(píng)銷售話術(shù)
- POCT臨床應(yīng)用與質(zhì)量管理
- 私立民辦初中學(xué)校項(xiàng)目融資計(jì)劃書
- 膿毒性休克病人護(hù)理查房課件
- 《本量利分析》課件
- 2023光伏組件隱性缺陷檢測(cè)技術(shù)規(guī)范
- 2024年財(cái)務(wù)分析師就業(yè)前景及技能要求精
- 關(guān)于文明的課件
- 30題安全員崗位常見面試問題含HR問題考察點(diǎn)及參考回答
- 2024年會(huì)計(jì)專業(yè)大學(xué)生職業(yè)規(guī)劃計(jì)劃書
評(píng)論
0/150
提交評(píng)論