




版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領
文檔簡介
1、1第七章 文件7.1 文件概述7.2 文件的打開與關閉7.3 文件的讀/寫7.4 應用舉例2 7.1 文件概述 程序通過鍵盤輸入數據,通過顯示器顯示處理結果的方式無法讓數據永久保存。若要將經常使用的數據做永久的保存,則應將將這些數據記錄在外部介質上,這就是文件。文件是存儲在外存(如磁盤)上的用文件名標識的數據的集合。操作系統(tǒng)以文件為單位對數據進行管理。文件名是處理文件的依據。讀取存放在外存上的數據時,必須先按文件名找到所指定的文件,再從該文件中讀取數據;向外存寫入數據時必須先建立一個文件(以文件名標識),再向它輸出數據。 37.1.1 C/C+文件C和C+文件的邏輯結構都是流式文件,是由一個個
2、字符或字節(jié)組成的序列,即流式文件。C語言文件處理的關鍵是定義一個文件指針,通過該指針對文件的打開、讀寫、關閉等進行操作。C+語言的文件處理則是在定義一個輸入輸出流類對象的基礎上,通過封裝在輸入輸出流類內部的成員函數實現對文件的操作。本書中只討論C語言的文件處理方法。41、C語言文件分類 ASCII文件是指把內存中的數據轉換成ASCII碼存儲在文件上,每個ASCII碼代表一個字符;二進制文件是把內存中的數據按其內存中的存儲形式不進行格式轉換直接存放在文件上。 按訪問模式分類: 可分為順序文件和隨機文件。按照數據組織形式分類:分為文本文件(又稱ASCII文件) 和二進制文件。 5 例如,整數123
3、在內存中占兩個字節(jié)(00 7B)H,如果按ASCII形式存放在磁盤文件上,則占有3個字節(jié):(31 32 33)H,而按二進制形式存放,則占有2個字節(jié):(00 7B)H。占用較多的存儲空間,需要花時間轉換數據,因一個字節(jié)代表一個字符,故能直接編輯和顯示 節(jié)省存儲空間和轉換時間,但與字符沒有直接對應關系,所以不能直接編輯和顯示 62、C語言文件的讀寫程序處理文件的三個步驟:打開文件進行讀寫操作關閉文件對文件的處理通過調用標準的輸入輸出庫函數實現。文件操作一般采用“緩沖文件系統(tǒng)”的方式,即文件與程序之間的數據通訊不是直接的,而是通過文件緩沖區(qū)來聯(lián)系。 調用輸出函數把程序中變量的值輸出到外部文件中,稱
4、為“輸出”或“寫”文件操作。調用輸入函數從外部文件中輸入數據賦給程序中的變量,稱為“輸入”或“讀”文件操作;77.1.2 文件指針 在C語言“緩沖文件系統(tǒng)”中,每一個被打開的文件在內存中都開辟了一個區(qū),用來存放文件的有關信息(如文件的名字,文件當前位置等)。這些信息保存在一個類型名為FILE的結構體變量中。處理文件是通過指向FILE類型的文件指針進行的。其中,FILE是由C語言系統(tǒng)在stdio.h文件中定義的。文件指針的定義形式如下: FILE *文件指針標識符; 例如:FILE *fp1, *fp2;定義兩個文件指針fp1和fp2,再通過fopen函數使得他們能夠分別指向各自的文件緩沖區(qū),程
5、序就可以利用他們來訪問文件。 87.2 文件的打開與關閉7.2.1 文件的打開 打開文件,是建立文件的各種有關信息,并使文件指針指向該文件,以便進行其它操作。 原型: FILE *fopen(char *fname, char *mode) 功能: 打開一個由fname所指定的文件,返回一個指向文件的指針。 若打開文件失敗,則返回一個空指針(NULL)。mode參數指示了文件打開后可以進行的處理方式,其值及其意義如下:9mode功 能r打開一個文本文件,對該文件只能進行讀操作。w建立一個新的文本文件(空文件),對該文件只能進行寫操作。a打開一個文本文件,對該文件只能在文件末尾追加數據。rb打開
6、一個二進制文件,對該文件只能進行讀操作。wb建立一個新的二進制文件(空文件),對該文件只能進行寫操作。ab打開一個二進制文件,對該文件只能在文件末尾追加數據。r+打開一個文本文件,對該文件既可以讀又可以寫。w+建立一個新的文本文件(空文件),對該文件既可以讀又可以寫。a+打開一個文本文件,可以在該文件末尾追加數據,也可以讀。rb+打開一個二進制文件,對該文件既可以讀又可以寫。wb+建立一個新的二進制文件(空文件),對該文件既可以讀又可以寫。ab+打開一個二進制文件,可以在該文件末尾追加數據,也可以讀。10說明:(1) 用含有字母r(r、rb、r+和rb+)的方式打開的文件,用于向計算機輸入數據
7、,即從文件讀取數據。文件必須已經存在,否則fopen函數將返回一個出錯信息(NULL)。(2) 用含有字母w (w、wb、w+和wb+)的方式打開的文件,用于向文件輸出數據。如果文件已經存在,則文件的內容將被刪除,成為一個空文件,因此使用時必須小心。(3) 用含有字母“a” (“a”、“ab”、“a+”和“ab+”)的方式打開文件,是向文件的末尾添加新的數據。與含有字母“r”的方式類似,文件必須已經存在,否則fopen函數也將返回一個出錯信息(NULL)。(4) 希望對文件既能夠進行寫操作又能夠進行讀操作,則應使用含有字母+(r+、w+、a+、rb+、wb+和ab+)的方式。 (5)如果要打開
8、一個二進制文件,則應使用含有字母 “b”的方式。11(6) 為了程序的通用性,文件名應在程序運行時輸入。 例如:FILE *fp;char fname15;coutfname;fp = fopen(fname,r);注意: 在fopen函數中,如果文件名直接給出,則路徑中的應寫成;如果文件名在程序運行時輸入,則路徑中的分隔符直接輸入字符。 12(7) 為保證程序的正常運行,通常要對fopen函數的返回值進行檢驗,以判斷文件是否成功地打開。有關的語句如下: if (fp=fopen(fname,mode) = = NULL) coutcant open filen; exit(1); 該段程序使
9、得文件打開失敗時,顯示提示信息,然后調用exit函數,該函數將結束程序的運行。137.2.2 文件的關閉原型: int fclose(FILE *stream)功能: 關閉文件指針stream所指向的文件。如果fclose( )調用成功,則返回0值,否則返回一個非0值。說明:1)如果程序中沒有使用fclose函數關閉文件,則在程序運行結束時系統(tǒng)會自動關閉所有打開的文件。2)應該養(yǎng)成及時關閉文件的習慣,防止誤操作或其他原因造成丟失數據的情況發(fā)生。147.3 文件的讀寫 C語言提供四種讀寫函數: 字符讀寫、字符串讀寫、格式讀寫和數據塊讀寫。7.3.1 文件的字符讀寫 用于一次從文件讀出或向文件寫入
10、一個字符。1. fgetc函數原型:int fgetc(FILE *stream)功能:從stream所指的文件中讀取一個字符,該字符作為函數的返回值,并且使文件的當前位置后移一個字符。15說明:1)當到達文件結束標志或出錯時,返回EOF。EOF是被定義成-1的符號常量。2)實際使用時,經常用feof(fp )判別fp所指向的文件的當前狀態(tài)是否是“文件結束”。若是,則feof(fp)的值為1,否則為0。 如: while(!feof(fp) c=fgetc(fp); putchar(c); 162. fputc函數原型: int fputc(int ch,FILE *stream)功能: 把c
11、h中的字符(高位字節(jié)被忽略掉)寫入stream所指的文件當前位置處,并使文件的當前位置加1。如果該函數的寫操作成功,則返回該字符值,否則返回EOF。17【例7.1】編寫程序首先建立一個文本文件abc.txt,其內容為26個小寫英文字母。然后再將該文件的內容顯示在屏幕上。分析 程序涉及文本文件的讀寫兩種操作,且對同一個文件以兩種不同的方式打開。程序#include stdlib.h#include iostream.h#include stdio.hvoid main() FILE *fp; if(fp=fopen(“abc.txt”, “w”)=NULL) /以寫的方式打開文件abc.txt
12、coutcant open filen;exit(1); 18 char ch=a; while(ch=z) fputc(ch,fp); ch+; fclose(fp); /abc.txt文件將以讀的方式重新被打開,所以必須先關閉 if(fp=fopen(“abc.txt”, “r”)=NULL) /以讀的方式打開文件abc.txt coutcant open filen; exit(1); while(!feof(fp) ch=fgetc(fp); coutch; fclose(fp); 197.3.2 文件的字符串讀寫 一次可從文件讀出或向文件寫入一串字符。1fputs()函數原型:int
13、 fputs(char *s, FILE *stream)功能: 將字符串s的內容輸出到stream所指向的文件中。其中,s可以是字符串常量、指向字符串的指針或存放字符串的字符數組名等。注意:用此函數進行輸出時,字符串中最后的0并不輸出,也不自動加n,即文件中各字符串將首尾相接,他們之間將不存在任何間隔符。202fgets函數原型:char *fgets(char *s, int n, FILE *stream) 功能: 從stream所指文件中讀入n-1個字符放入s為起始地址的空間內。其中s是存放字符串的起始地址;n是一個int類型變量。注意:如果在未讀滿n-1個字符之時,已讀到一個換行符或
14、一個文件結束符,則結束本次讀操作,讀入的字符串中最后包含讀到的換行符或文本結束符。讀入結束后,系統(tǒng)將自動在最后加0,并以s作為函數值返回。21【例7.2】字符串讀寫函數示例。#include stdio.h#include stdlib.h#include iostream.hvoid main()FILE *fp;char s100;if(fp=fopen(file1.TXT, w)=NULL)coutcant open filen;exit(1); fputs( I love my homeland!, fp); fclose(fp); if(fp=fopen(file1.TXT, r)=
15、NULL) coutcant open filen; exit(1); fgets(s,10,fp); /將文件中的9個字符讀入到字符串s中 puts(s);227.3.3 文件的塊讀寫 用于一次從文件讀出或向文件寫入一組數據,如結構類型數據。1. fread函數 原型: int fread(void *buffer,int size, int count,FILE *fp) 功能: 從文件指針fp所指的地方讀取長度為size的count個數據塊,存到buffer所指的存儲區(qū)中。如果成功,則返回實際所讀的數據塊數,否則返回0。232. fwrite函數 原型: int fwrite(void
16、*buffer,int size,int count,FILE *fp) 功能: 將以buffer為起始地址的長度為size的count個數據塊輸出到文件指針fp所指的地方去。如果成功,則返回輸出數據塊的數量,否則返回0。說明:buffer是一個指針。對于fread,buffer是一個指向用來接受從文件中讀取的數據存儲區(qū)的指針;對于fwrite,buffer是一個指向將被寫到文件中去的那些數據的指針。size是數據塊的大小。count指示共有多少個數據塊要被讀寫。fp是文件指針。24 一般,只要文件以二進制方式打開,fread和fwrite就可以讀寫任何類型信息,最常用于讀寫數組或結構。 例如
17、,假設fp指向以二進制形式打開的可讀寫文件,并有如下的說明:float f; double d10;常見的塊讀寫應用示例:fwrite (&f,sizeof(float),1,fp);/把浮點數f以塊形式寫入文件fwrite(d,sizeof(double),10,fp);/把數組d中所有數以塊形式寫入 文件fread (&f,sizeof(float),1,fp);/從文件中以塊形式讀一浮點數到 變量f中fread(d,sizeof(double),10,fp);/從文件中以塊形式讀10個浮點數 到數組d中 25【例7.3】將sin(x)在i(2/360)(i=0,1,359)上的值保存在文
18、件中。#include iostream.h#include “stdio.h#include math.h#include stdlib.h#define SIZE 360#define PI 3.14159void main( )FILE *fp; int i; double dataSIZE; for(i =0; iSIZE; i+)datai = sin(2*i*PI/360); if(fp=fopen(sin_data,wb)=NULL) coutcant open filen;exit(1); fwrite (data, sizeof(double),SIZE, fp); fclo
19、se(fp);也可寫做:for(i=0;i360;i+)fwrite (&datai, sizeof(double),1, fp);還可寫做:fwrite (data, sizeof(data),1, fp);注意:二進制文件不能直接打開編輯顯示267.3.4 文件的格式化讀寫1fprintf()函數 原型: int fprintf(FILE *stream, const char *format, argument, .) 功能: 按格式向流中輸出數據,其用法和printf()相同,但該函 數不是將數據寫到顯示器,而是寫到stream所指向的文件中。 如: fprintf(fp,%2d%s,
20、4,China); 表示將整數4和字符串China寫入fp所指的文件中。272fscanf()函數 原型: int fscanf(FILE *stream, const char *format, address, .) 功能: 從流中按格式讀取數據。其用法和scanf()相同,但該函數不是從鍵盤讀取,而是從stream所指向的文件讀取數據。如: fscanf(fp,%d%d ,&x,&y); 表示從fp所指的文件中順序讀取兩個整數給變量x和y。 287.3.5 文件的隨機讀寫順序讀寫文件只能從頭開始,順序讀寫各個數據。 隨機讀寫可按需要只讀寫文件中某些指定的部分。 隨機讀寫的關鍵是要按要求移
21、動位置指針,即進行文件的定位。實現文件定位、移動文件內部位置指針的函數主要有 rewind 函數和fseek函數。 1.rewind 函數 原型: void rewind(FILE *stream); 功能: 使指示文件位置的指針重新返回到文件開始。292. fseek函數 原型: int fseek(FILE *stream, long offset, int whence) 功能: 一般用于二進制模式打開的文件中,定位到流中指定的位置,如果成功返回0,參數offset是移動的字符數,用長整型表示;whence是移動的基準,常用符號常量表示。符號常量值基 準 位 置SEEK_SET0文 件
22、開 頭SEEK_CUR1當前讀寫的位置SEEK_END2文 件 尾 部30 例如: fseek(fp,1234L,SEEK_CUR); 其功能是把讀寫位置從當前位置向后移動1234字節(jié)(L后綴表示長整數)。 又如: fseek(fp,0L,2); 其功能是把讀寫位置移動到文件末尾。注意: 由于隨機讀寫的一般是一個數據塊,因此該函數常配合fread和fwrite函數使用。317.4 應用舉例本章重點介紹數據文件的概念及使用方法。文件使用的一般過程可概括如下: 定義一個文件指針。 以正確的方式打開文件,讓文件指針指向相關的存儲于磁盤上的某數據文件。在正確打開文件的前提下,對文件進行定位(隨機文件需
23、要此操作)、讀或寫的操作。文件操作完畢后,關閉文件。32【例7.4】編寫一個程序實現文本文件的復制。假設“ABC.TXT”是已經存在于D盤根目錄下的一個文本文件,內部存放了若干字符型數據,要求將其內容復制到同一位置的“DES.TXT”中,同時還要求將源文件中的字符總數寫入目的文件的最后。分析 根據題意,需以讀寫兩種方式分別打開源文件和目的文件,同時由于要求將源文件中的字符總數寫入目的文件中,因此在源文件的內容復制完畢后,再使用一個fprintf函數實現數據的寫入。33#include stdio.h#include stdlib.h#include iostream.hvoid main( )
24、 FILE *source,*target; char ch; int num=0; if(source=fopen(D:ABC.TXT, r)=NULL)/注意路徑中的分隔符應為 coutcant open filen; exit(1); if(target=fopen(D:DES.TXT, w)=NULL) coutcant open filen; exit(1); while(ch=fgetc(source)!=EOF)/注意運算符的優(yōu)先級和括號的正確使用 fputc(ch,target); num+; fprintf(target,%d,num); /字符總數寫入目的文件 fclose(source);fclose(target);34【例7.5】從鍵盤上
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網頁內容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
- 4. 未經權益所有人同意不得將文件中的內容挪作商業(yè)或盈利用途。
- 5. 人人文庫網僅提供信息存儲空間,僅對用戶上傳內容的表現方式做保護處理,對用戶上傳分享的文檔內容本身不做任何修改或編輯,并不能對任何下載內容負責。
- 6. 下載文件中如有侵權或不適當內容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 租客合同終止租房協(xié)議
- 技術開發(fā)與轉讓合同保密范本
- 智能化系統(tǒng)供貨安裝合同樣本
- 礦山企業(yè)輪換工勞動合同模板及示例
- 農村土地出租權屬合同樣本
- 標準貨物銷售合同簡版
- 城市配送服務合同一覽
- 小學生種花演講課件
- 影視設備行業(yè)交流服務批發(fā)考核試卷
- 廣播電視節(jié)目的心理影響與教育意義考核試卷
- 低溫絕熱液氧瓶充裝操作規(guī)程模版(2篇)
- 大眾汽車使用說明書
- (高清版)DZT 0145-2017 土壤地球化學測量規(guī)程
- 供熱公司安全教育知識
- 高中英語課程綱要
- 《藥物設計學》課件
- 隨機微分方程
- 道路設施施工現場安全管理基本要求
- 公寓樓改造裝修施工方案
- 煙臺大學化學化工學院實驗室儀器設備搬遷項目
- 2022版10kV架空配電線路無人機自主巡檢作業(yè)導則
評論
0/150
提交評論