版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認領(lǐng)
文檔簡介
1、C語言程序設(shè)計第9章 文件程序設(shè)計 ?C語言程序設(shè)計?第3版 張 磊 編著 21世紀高等學校規(guī)劃教材 清華大學出版社第9章 文件程序設(shè)計9.1 文件概述 9.2 文件的根本操作9.3 文件的數(shù)據(jù)塊讀寫操作 9.4 文件的其他操作9.5 文件應(yīng)用舉例9.1 文件概述9.1.1 文件的概念9.1.2 文件的分類9.1.3 文件的一般操作過程9.1.4 文件的指針9.1.1 文件的概念文件是計算機中的一個重要概念,通常是指存儲在外部介質(zhì)上的信息的集合。存儲程序代碼的文件稱為程序文件,存儲數(shù)據(jù)的文件稱為數(shù)據(jù)文件。另外,C語言把輸入輸出設(shè)備也視為一類特殊的文件。計算機對文件的操作總體上分成輸入和輸出兩大
2、類,對文件的輸人輸出I/0過程是通過操作系統(tǒng)進行管理的。C語言程序?qū)ξ募奶幚硎峭ㄟ^標準函數(shù)庫中的文件操作函數(shù)實現(xiàn)的,使用這些函數(shù),可以簡單、高效、平安地訪問外部數(shù)據(jù)。9.1.1 文件的概念1設(shè)備文件在C語言中,所有的外部設(shè)備均被作為文件對待,這種文件稱為設(shè)備文件。對外部設(shè)備的輸人輸出處理就是讀寫設(shè)備文件的過程。 2文件緩沖區(qū)在程序的運行過程中,程序要將保存在內(nèi)存中的數(shù)據(jù)寫入磁盤,首先要建立一個“輸出文件緩沖區(qū),這個緩沖區(qū)是一個連接計算機內(nèi)存數(shù)據(jù)與外存文件的橋梁,當向文件輸出數(shù)據(jù)時,準備輸出的數(shù)據(jù)先寫入文件緩沖區(qū),等文件緩沖區(qū)填滿后再輸出到文件中。這一過程稱為“寫文件,是數(shù)據(jù)輸出過程。與“寫文
3、件過程相對的是要將保存在文件中的數(shù)據(jù)裝入內(nèi)存。首先要建立一個“輸入文件緩沖區(qū),當從文件中輸入數(shù)據(jù)時,也是把讀入的數(shù)據(jù)先寫入文件緩沖區(qū),等文件緩沖區(qū)數(shù)據(jù)裝滿之后再整個送給程序。這一過程稱為“讀文件,是數(shù)據(jù)輸入過程。9.1.1 文件的概念使用緩沖區(qū)的文件讀、寫示意圖 9.1.2 文件的分類以ASCII碼字符形式存儲的文件稱為文本文件,又叫ASCII文件。例如用高級程序語言編寫的程序文件是文本文件,用Windows “記事本程序創(chuàng)立的文件也是文本文件。文本文件是一種字符流文件,文本文件的一個字符就是一個字節(jié),因而方便了字符的處理,不過文本文件一般要占用較大的存儲空間。二進制文件是按照數(shù)據(jù)在內(nèi)存中的字
4、節(jié)序列形成的字節(jié)流文件。例如C程序的目標文件擴展名為obj和可執(zhí)行文件擴展名為exe都是二進制文件。在二進制文件中,字節(jié)信息與實際的數(shù)據(jù)位并不一一對應(yīng),因此,假設(shè)直接顯示二進制文件內(nèi)容時,用戶看到的是一些不能識別的字符。 文本文件 二進制文件9.1.3 文件的一般操作過程使用文件的一般步驟翻開文件操作文件關(guān)閉文件翻開文件:建立用戶程序與文件的聯(lián)系,系統(tǒng)為文件開辟文件緩沖區(qū)。操作文件:是指對文件的讀、寫、追加和定位操作。讀操作:從文件中讀出數(shù)據(jù),即將文件中的數(shù)據(jù)輸入到計算機內(nèi)存。寫操作:向文件中寫入數(shù)據(jù),即將計算機內(nèi)存中的數(shù)據(jù)輸出到文件。追加操作:將新的數(shù)據(jù)寫到文件原有數(shù)據(jù)的后面。定位操作:移動
5、文件讀寫位置指針。關(guān)閉文件:切斷文件與程序的聯(lián)系,將文件緩沖區(qū)的內(nèi)容寫入磁盤,并釋放文件緩沖區(qū)。9.1.4 文件的指針文件型指針變量的定義FILE *變量名;例如:FILE *p;注意:由于文件類型FILE在頭文件stdio.h中定義,所以在使用FILE類型前必須先翻開stdio.h文件。如果需要對某一個文件進行讀寫操作,必須首先要指定指向它的文件指針。只有通過文件指針,才能調(diào)用相應(yīng)的文件。當程序需要同時處理多個文件時,那么需要說明多個FILE型的指針變量,使它們分別指向多個不同的文件。9.2文件的根本操作9.2.1 翻開和關(guān)閉文件9.2.2 最根本的文件讀寫函數(shù)9.2.1 翻開和關(guān)閉文件翻開
6、文件操作是使用文件的第一個步驟,而關(guān)閉文件操作那么是使用文件的最后一個步驟。C語言系統(tǒng)分別使用fopen()函數(shù)和fclose()函數(shù)實現(xiàn)文件的翻開和關(guān)閉操作。1文件翻開函數(shù)fopen()fopen()函數(shù)用來實現(xiàn)翻開文件,它解決如下3個問題: 指定要翻開的文件名; 指定文件的使用方式,如是讀文件還是寫文件等; 為翻開的文件指定一個指針變量,以便使用這個指針變量對文件進行訪問。fopen()函數(shù)的調(diào)用方式FILE *fp;fp=fopen(文件名, 使用文件的方式);例如:fp=(example.txt, r);表示要翻開的文件名為example.txt,使用文件的方式是“r方式,文件指針是f
7、p。9.2.1 翻開和關(guān)閉文件文件使用方式文件使用方式作 用r以“只讀”方式打開一個文本文件w以“只寫”方式打開一個文本文件a向文本文件尾增加數(shù)據(jù)rb以“只讀”方式打開一個二進制文件wb以“只寫”方式打開一個二進制文件ab向二進制文件尾增加數(shù)據(jù)r+以“讀/寫”方式打開一個文本文件w+以“讀/寫”方式建立一個新的文本文件a+以“讀/寫/追加”方式打開一個文本文件rb+以“讀/寫”方式打開一個二進制文件wb+以“讀/寫”方式建立一個新的二進制文件ab+以“讀/寫/追加”方式打開一個二進制文件9.2.1 翻開和關(guān)閉文件2關(guān)閉文件函數(shù)fclose()fclose()函數(shù)的一般格式fclose(文件指針
8、);功能關(guān)閉“文件指針所指向的文件,釋放翻開文件時使用的結(jié)構(gòu)體變量,斷開文件指針與文件的聯(lián)系。例如: fclose(fp);最根本的文件讀寫函數(shù)1fputc()函數(shù)一般形式fputc(ch,fp);功能將字符ch的值輸出到fp所指向的文件中。最根本的文件讀寫函數(shù)例9-1使用fputc()函數(shù)在屏幕顯示一個字符串。/* program e9-1.c */ #includevoid main() char *p=This is a example.; while(*p!=0) fputc(*p+,stdout);設(shè)備文件最根本的文件讀寫函數(shù)例9-2 把從鍵盤輸入的一個字符串寫入到磁盤文件examp
9、le.txt中。/* program e9-2.c */#includevoid main()char ch;FILE *fp; fp=fopen(example.txt,w); printf(Enter a string: );while(ch=getchar()!=n)fputc(ch,fp); fclose(fp); 最根本的文件讀寫函數(shù)2fgetc()函數(shù)從指定文件讀入一個字符,該文件必須是以讀或讀寫方式翻開的。通常使用如下的形式調(diào)用fgetc()函數(shù)ch=fgetc(fp);其中,fp為文件型指針變量,ch為字符變量。正常情況下fgetc()函數(shù)的返回值是從文件中讀出的一個字符。當翻
10、開文件并立即使用fgetc()讀文件時,fgetc()函數(shù)從文件開始位置讀取一個字符。每讀取一個字符后,文件的位置指針后移一個字符位置。假設(shè)當前讀取的是文本文件,當遇到文件結(jié)束標志時,fgetc()函數(shù)的返回值為EOF。最根本的文件讀寫函數(shù)例9-3 使用fgetc()函數(shù)輸出文件example.txt的內(nèi)容。/* program e9-3.c */#includevoid main()char ch;FILE *fp;fp=fopen(example.txt,r); while(ch=fgetc(fp)!=EOF)putchar(ch); fclose(fp); 最根本的文件讀寫函數(shù)例9-4
11、使用feof()進行文件讀取控制,輸出文件example.txt的內(nèi)容。/* program e9-4.c */#includevoid main() FILE *fp; if(fp=fopen(example.txt,r)=NULL) printf(file can not open!n); exit(1); while(!feof(fp) putchar(fgetc(fp); fclose(fp); 判斷被讀取的文件是否已經(jīng)讀完。當未遇文件結(jié)束標志時,feof()的值是0,否那么feof()的值是1。9.3文件的數(shù)據(jù)塊讀寫操作9.3.1 fwrite()函數(shù)9.3.2 fread()函數(shù)9
12、.3.1 fwrite()函數(shù)fwrite()函數(shù)的功能是把內(nèi)存中的一些數(shù)據(jù)塊寫到指定的文件中。一般調(diào)用形式fwrite(buffer,size,count,fp);其中:fp是接受數(shù)據(jù)的文件指針;buffer是數(shù)據(jù)塊的內(nèi)存首地址,通常是指針變量名、數(shù)組名等;size是一個數(shù)據(jù)塊的字節(jié)數(shù)即數(shù)據(jù)塊的大小;count是執(zhí)行一次fwrite()函數(shù)從內(nèi)存輸出到fp文件的數(shù)據(jù)塊數(shù)目。9.3.1 fwrite()函數(shù)例9-5 從鍵盤上輸入一批學生數(shù)據(jù),然后以“stu_list文件名存儲到磁盤上。/* program e9-5.c */#include#define N 4struct student_t
13、ype char name10; int num; int score;stud; void main()int i;FILE *fp;if(fp=fopen(stu_list,wb)=NULL)printf(Can not open filen);exit(1);printf(Input data,please!n);for(i=0;iN;i+) scanf(%s%d%d,,&stud.num,&stud.score); fwrite(&stud,sizeof(struct student_type),1,fp); fclose(fp);printf(All right.n
14、);9.3.2 fread()函數(shù)fread()函數(shù)把指定文件中的一個數(shù)據(jù)塊讀到內(nèi)存中。一般調(diào)用形式fread(buffer,size,count,fp);其中:fp是讀取數(shù)據(jù)的文件指針;buffer是接受文件數(shù)據(jù)的內(nèi)存首地址,通常是指針變量名、數(shù)組名等;size是一個數(shù)據(jù)塊的字節(jié)數(shù)即數(shù)據(jù)塊的大??;count是執(zhí)行一次fread()函數(shù)讀取的數(shù)據(jù)塊的數(shù)目。例9-6 將上述stu_list文件的內(nèi)容顯示在屏幕上。/* program e9-6-1.c */#include#define N 4struct student_typechar name10;int num;int score;stu
15、d;void main()int i;FILE *fp;if(fp=fopen(stu_list,rb)=NULL)printf(Can not open file.n);exit(1);for(i=0;iN;i+)fread(&stud,sizeof(struct student_type),1,fp); printf(%-10s%4d%4dn,,stud.num,stud.score); fclose(fp);9.3.2 fread()函數(shù)再如,設(shè)有如下定義:struct student_type char name10; int num; int age;stud40;
16、 其中,結(jié)構(gòu)體數(shù)組stud的每一個元素用來存放一個學生的有關(guān)數(shù)據(jù),假設(shè)學生的數(shù)據(jù)已存放在磁盤文件中,且該文件已翻開,并由fp指向,那么可以用下面的語句把文件中前40個學生的數(shù)據(jù)輸入到結(jié)構(gòu)體數(shù)組stud中:for(i = 0; i40;i+) fread(&studi,sizeof(struct student_type),1,fp);9.4 文件的其他操作9.4.1 文件的格式化讀寫9.4.2 文件的隨機讀寫操作9.4.3 ftell()函數(shù)9.4.4 文件的字符串操作9.4.1 文件的格式化讀寫1文件的格式化讀操作由fscanf()函數(shù)實現(xiàn),從指定的文件中,按照說明的格式向變量提供數(shù)據(jù)。一般
17、使用格式fscanf(fp,格式字符串,輸入表列);其中fp是文件指針“格式字符串和“輸入表列與scanf()函數(shù)的相關(guān)內(nèi)容相同。例如:fscanf(fp,“%d,&m);該語句將磁盤文件中的數(shù)據(jù)送給變量m,其中的磁盤文件由fp指向。9.4.1 文件的格式化讀寫2文件的格式化寫操作由fprintf ()函數(shù)實現(xiàn),將指定變量的值按照一定的格式寫到指定的文件中。一般使用格式fprintf(fp,格式字符串,輸出表列);說明: fp是要寫入數(shù)據(jù)的文件指針。 “格式字符串和“輸出表列與printf()函數(shù)的相關(guān)內(nèi)容形同。例如: fprintf(fp,%d,m);該語句將整型變量m按%d格式輸出到fp指
18、向的文件中。例9-7從鍵盤輸入一個字符串和一個十進制整數(shù),將它們寫入test文件中,然后再從test文件中讀出并顯示在屏幕上。/* program e9-7.c */#includevoid main( )char s100;int a;FILE *fp;if(fp=fopen(test, w)=NULL)printf(file open error.n);exit(0);fscanf(stdin,%s%d,s,&a); fprintf(fp,%s %d,s,a); fclose(fp); if(fp=fopen(test,r)=NULL)printf(Cannot open file.n);
19、exit(0);fscanf(fp,%s%d,s,&a); fprintf(stdout,%s %dn,s,a); fclose(fp); 文件的隨機讀寫操作1fseek()函數(shù)功能:改變文件位置指針。調(diào)用形式fseek(fp,offset,position);其中: fp為文件型指針; 文件位置指針的定位由參數(shù)offset和position共同確定。position規(guī)定指針定位時的基準位置,offset規(guī)定文件位置指針離開基準位置的偏移量,它的單位是字節(jié)。position的值用整常數(shù)表示,取值范圍是0、1、2三個數(shù)之一,其意義如下:0:表示基準位置為文件的開頭位置;1:表示基準位置為文件的當
20、前位置;2:表示基準位置為文件的結(jié)尾位置,該位置在文件內(nèi)容的最后一個字節(jié)之后。9.4.2 文件的隨機讀寫操作fseek()函數(shù)調(diào)用的實例:fseek(fp,50L,0); 將位置指針移到文件頭起始第50個字節(jié)處fseek(fp,100L,1); 將位置指針從當前位置向文件尾方向移動100個字節(jié)fseek(fp,-20L,2); 將位置指針從文件末尾向文件頭方向移動20個字節(jié)9.4.2 文件的隨機讀寫操作例9-8 在例9-6中建立了學生數(shù)據(jù)文件stu_list,將其中第3個學生的成績修改為97。/* program e9-8.c */#includestruct student_type cha
21、r name10;int num;int score;stud; void main()int i,size;FILE *fp;size=sizeof(struct student_type);if(fp=fopen(stu_list,rb+)=NULL)printf(file open error.n);exit(1);fseek(fp,2*size,0);fread(&stud,size,1,fp);printf(%s %d %dn, ,stud.num,stud.score); printf(new score: );scanf(%d,&stud.score);fsee
22、k(fp,-size,1);fwrite(&stud,size,1,fp);fclose(fp);9.4.2 文件的隨機讀寫操作2. rewind()函數(shù)作用:將文件位置指針復位。調(diào)用形式rewind(fp);其中:fp為文件型指針。執(zhí)行rewind()函數(shù)后,對于fp指向的文件,不管當前的文件位置指針在何處,都使它復位到文件的開始位置。9.4.2 文件的隨機讀寫操作例9-9 在屏幕上顯示文件e9-6-2.c的內(nèi)容,并將該文件復制為文件e9-6-3.c。#includevoid main()FILE *fp1,*fp2;fp1=fopen(e9-6-2.c,r);fp2=fopen(e9-6-
23、3.c,w);while(!feof(fp1)putchar(fgetc(fp1); rewind(fp1); while(!feof(fp1)fputc(fgetc(fp1),fp2); fclose(fp1); fclose(fp2); 9.4.3 ftell()函數(shù)ftell()函數(shù)用于獲取文件位置指針,其調(diào)用形式如下: ftell(fp);其中:fp為文件指針。ftell()函數(shù)的返回值是fp所指向文件的當前讀寫位置,該值是一個長整型數(shù),是位置指針從文件開始處到當前位置的位移量的字節(jié)數(shù)。9.4.3 ftell()函數(shù)例9-10 新建data.txt文件,檢查文件位置指針值;然后將字符串
24、Beijing 2021寫入文件中,再檢查文件位置指針的值。#include stdio.hmain( ) FILE *fp; long position; fp=fopen(data.txt,w); position=ftell(fp); printf(position=%ldn,position); fprintf(fp,Beijing 2021); position=ftell(fp); printf (position=%ldn, position); fclose(fp);9.4.4 文件的字符串操作1fgets()函數(shù)一般調(diào)用形式fgets(buffer,n,fp);作用從fp指向
25、的文件中讀取n-1個字符,然后存儲到以buffer為首地址的的內(nèi)存空間中,通常buffer是一個指針變量名、數(shù)組名等。如果在讀入 n-1個字符的過程中遇到換行符或EOF,讀入即結(jié)束。字符串讀入后在最后加一個0字符作為字符串結(jié)束標志。9.4.4 文件的字符串操作2fputs()函數(shù)調(diào)用形式fputs(buffer,fp);作用將內(nèi)存buffer中的字符串寫到fp指向的文件中,buffer可以是一個字符串常量,也可以是字符串的首地址。9.4.4 文件的字符串操作例9-11 將字符串Visual C+和Visual basic依次存入文件text中,然后將第一個字符串讀出并顯示出來。#include
26、void main()FILE *fp;char string20;fp=fopen(text,w+); fputs(Visual C+n,fp); fputs(Visual basicn,fp); rewind(fp); fgets(string,20,fp); puts(string); fclose(fp);9.5 文件應(yīng)用舉例文件復制9.5.2 存儲在文件中的學生成績排序9.5.1 文件復制例9-12 設(shè)計一個程序,實現(xiàn)任意文本文件的復制。問題分析與算法設(shè)計 由于源文件是任意的,所以源文件名應(yīng)通過鍵盤輸入;同樣,生成的目標文件名也應(yīng)由鍵盤輸入。 源文件以只讀方式翻開,目標文件以寫方式翻
27、開。 從第一個字符開始,順序逐字符讀出源文件,每讀出一個字符,立即寫入目標文件中,使用feof()函數(shù)判斷源文件的結(jié)束狀態(tài)。實現(xiàn)程序#includevoid main() char ch,source20,target20; FILE *fp_s,*fp_t; printf(Enter the source filename: ); scanf(%s,source); printf(Enter the target filename: ); scanf(%s,target); if(fp_s=fopen(source,r)=NULL) printf(Cannot open source file.n);exit(1); if(fp_t=fopen(target,w)=NULL) printf(Cannot open target file.n);exit(1); while(!feof(fp_s)fputc(fgetc(fp_s),fp_t); fclose(fp_s); fclose(fp_t);9.5.2 存儲在文件中的學生成績排序例9-13 在例9-5中,我們建立了一個stu_list文件。編寫程序,對該文件的內(nèi)容按照學習成績降序排序后顯示出來。 問題分析與算法設(shè)
溫馨提示
- 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. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 《芝麻油中木酚素的轉(zhuǎn)化耦合脫色過程機制研究》
- 《欣胃顆粒對胃癌前病變(氣陰兩虛挾瘀毒型)患者血清EGF影響的研究》
- 二零二五年度核電站施工合同gf2篇
- 2024版版權(quán)轉(zhuǎn)讓合同3篇
- 2024版XX衛(wèi)星通信技術(shù)服務(wù)合同
- 工業(yè)互聯(lián)網(wǎng)平臺的用戶體驗設(shè)計與優(yōu)化
- 《華宇軟件股權(quán)激勵方案及實施效果研究》
- 《衛(wèi)星平臺與天線去耦合控制》
- 2024版肉制品采購合同
- 2025年中國爛花絹圍巾行業(yè)市場發(fā)展前景及發(fā)展趨勢與投資戰(zhàn)略研究報告
- 中華人民共和國勞動合同法
- 英語聽力考場建設(shè)方案
- 義務(wù)教育教科書英語Go for it七年級上冊單詞表
- 第一章 電力系統(tǒng)潮流計算1
- ICU常用鎮(zhèn)靜藥物介紹及藥學監(jiān)護
- 粉末丁腈橡膠使用方法
- 大氣課程設(shè)計-—袋式除塵器
- 蘇科版七年級生物學(上)教學工作總結(jié)
- 阿特拉斯擰緊機技術(shù)方案
- 中國人民財產(chǎn)保險股份有限公司理賠稽查管理暫行辦法
- 鋼管、管件表面積計算公式(精編版)
評論
0/150
提交評論