第8章 文件操作_第1頁(yè)
第8章 文件操作_第2頁(yè)
第8章 文件操作_第3頁(yè)
第8章 文件操作_第4頁(yè)
第8章 文件操作_第5頁(yè)
已閱讀5頁(yè),還剩58頁(yè)未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

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

文檔簡(jiǎn)介

1、第8章 文件(wnjin)操作 問(wèn)題(wnt)原由為了提高數(shù)據(jù)輸入輸出的處理效率,可將程序運(yùn)行時(shí)所需的原始數(shù)據(jù)從文件中讀取,并將程序運(yùn)行的結(jié)果寫(xiě)入到文件中。那么,這種文件有哪些特性?怎樣打開(kāi)、讀取、關(guān)閉文件呢?這就是本章所要討論的問(wèn)題。 文件的概念、文件的打開(kāi)與關(guān)閉、文件的讀寫(xiě)、文件狀態(tài)的檢查等。教學(xué)重點(diǎn)能力要求掌握:文件指針的定義和使用文件指針訪問(wèn)文件 ,文件的不同打開(kāi)方式 ,fopen等函數(shù)的使用 。熟悉:fread等函數(shù)的使用。共六十三頁(yè) 8.5 文件(wnjin)讀/寫(xiě)出錯(cuò)的檢測(cè) 8.4 文件的隨機(jī)讀/寫(xiě)操作 8.3 文件的順序讀/寫(xiě)操作 8.2 文件(wnjin)的打開(kāi)與關(guān)閉 8.1

2、 文件操作概述本章介紹的知識(shí)內(nèi)容 8.6 算法案例程序設(shè)計(jì)第8章 文件操作 共六十三頁(yè)8.1 文件操作(cozu)概述 所謂“文件”,實(shí)際上就是有關(guān)數(shù)據(jù)的有序集合體。是操作系統(tǒng)存儲(chǔ)和管理數(shù)據(jù)的基本單位,是實(shí)現(xiàn)程序與數(shù)據(jù)分離(fnl)的有效手段,是提高數(shù)據(jù)讀入的有效措施,是反復(fù)使用和永久保存數(shù)據(jù)的可靠保證。 【實(shí)例8-1】調(diào)試一個(gè)排序的程序要輸入10個(gè)整數(shù),如果程序中存在邏輯錯(cuò)誤,就會(huì)要不止一次地輸入這10個(gè)整數(shù)。 問(wèn)題分析 將l0個(gè)整數(shù)編輯存入到一個(gè)文本文件中,然后用C語(yǔ)言編寫(xiě)一個(gè)程序,運(yùn)行該程序就可以在顯示器上看到這10個(gè)整數(shù),并這10個(gè)數(shù)據(jù)送到測(cè)試程序中。 8.1.1文件概念的引出共六十三

3、頁(yè)8.1.1 文件(wnjin)概念的引出【程序?qū)崿F(xiàn)】 #include #define N 10,M 4 struct student char stu_num15; char stu_name20; float score; stdN; main() int i; FILE *fp; printf(“Please input student information:n”); /輸入學(xué)生信息(xnx):學(xué)號(hào)、姓名、成績(jī) for(i=0;iN;i+) scanf(“ssf”,stdi.stu_num,stdi.stu_name,共六十三頁(yè)8.1.1 文件(wnjin)概念的引出stdi.sco

4、re);if(fp=fopen(“student.dat”,”wb+”)=NULL) /建立、打開(kāi)文件 printf(“nCant open this file!n”); exit(0) ; /文件讀寫(xiě)錯(cuò)誤(cuw),退出程序 for(i=0;iN;i+) /將學(xué)生信息寫(xiě)入文件 if(fwrite(&stdi,sizeof(struct student),1,fp)!=1) princf(“file write eerorn”); /判斷是否出錯(cuò) printf(“data is savedn”); fseek(fp,sizeof(struct student)*(M-1),0); /讀出學(xué)生信

5、息 fread(stdM1,sizeof(struct student),l,fp); printf(“No.d students:n”,M); printf(“Num:s,Name:s,score:.2fn”,stdM-1.stu_num, stdM-1.stu_name,stdM-1.score); fclose(fp); /關(guān)閉文件 printf(“data is readn”); 共六十三頁(yè)8.1.2 文件(wnjin)的基本類(lèi)型 在C語(yǔ)言中,文件的分類(lèi)方法有多種,不同的劃分標(biāo)準(zhǔn)決定了不同的文件種類(lèi)。文件是有關(guān)數(shù)據(jù)的有序集合體,這個(gè)集合體的名稱(chēng)就是文件名。 1. 按文件的邏輯結(jié)構(gòu)分類(lèi)

6、如果按文件的邏輯結(jié)構(gòu)分類(lèi),可分為記錄文件和流式文件兩種。 記錄文件:是指具有一定(ydng)結(jié)構(gòu)的記錄。 流式文件:是指由一個(gè)字符(字節(jié))數(shù)據(jù)順序組成的文件。 2. 按存儲(chǔ)介質(zhì)分類(lèi) 如果按存儲(chǔ)介質(zhì)來(lái)分類(lèi),可分為普通文件和設(shè)備文件兩種。共六十三頁(yè)8.1.2 文件(wnjin)的基本類(lèi)型 3. 按文件的讀寫(xiě)方式(fngsh)分類(lèi) 如果按文件的讀寫(xiě)方式來(lái)分類(lèi), 可分為順序讀/寫(xiě)文件和隨機(jī)讀/寫(xiě)文件兩種。 順序讀寫(xiě)文件:按照從頭到尾的順序依次讀/寫(xiě)文件,即先讀取文件中的第一條數(shù)據(jù),然后讀取第二條數(shù)據(jù), ,直至文件結(jié)束。 隨機(jī)讀寫(xiě)文件:通過(guò)特定的技術(shù)來(lái)直接訪問(wèn)文件中的任意數(shù)據(jù)。 共六十三頁(yè)8.1.2 文

7、件(wnjin)的基本類(lèi)型 4. 按數(shù)據(jù)的組織形式分類(lèi) 如果按文件的組織形式來(lái)分類(lèi),可分為文本文件和二進(jìn)制文件兩種。 文本文件:是以ASCII碼字符形式存儲(chǔ)的文件。 二進(jìn)制文件:是以二進(jìn)制的形式存儲(chǔ)的文件。 文本文件和二進(jìn)制文件的主要區(qū)別在于: 兩種文件存儲(chǔ)時(shí)所占的存儲(chǔ)空間不一樣。 兩種文件需要的讀/寫(xiě)時(shí)間不一樣。 文本文件允許修改(xigi)和顯示。 文本文件常用來(lái)保存輸入數(shù)據(jù)及程序最終結(jié)果,而二進(jìn)制文件常用于暫存程序的中間結(jié)果,供另一程序讀取。共六十三頁(yè)8.1.3 文件緩沖區(qū)與類(lèi)型(lixng)指針 1. 文件緩沖區(qū)程序 文件緩沖區(qū)也稱(chēng)緩沖文件系統(tǒng), 它是內(nèi)存的一部分。圖8-1描述利用文件

8、緩沖區(qū)在內(nèi)存與外存之間進(jìn)行(jnxng)文件讀寫(xiě)的不同過(guò)程。 程序數(shù)據(jù)區(qū)外存輸入數(shù)據(jù)緩 沖 區(qū)輸出數(shù)據(jù)緩 沖 區(qū)圖8-1 利用文件緩沖區(qū)進(jìn)行文件讀寫(xiě)共六十三頁(yè)8.1.3 文件緩沖區(qū)與類(lèi)型(lixng)指針 2. 文件類(lèi)型指針(zhzhn) 文件類(lèi)型指針變量或FILE指針變量的語(yǔ)法結(jié)構(gòu)定義一般形式為: FILE *;例如,下面的語(yǔ)句就定義了一個(gè)名為fp的文件指針變量:FILE *fp; fp是指向FILE結(jié)構(gòu)的指針變量,fp代表filepointer 。 如果程序要同時(shí)處理3個(gè)文件,則需要分別定義3個(gè)不同的文件指針變量,即定義為:FILE *fpl,*fp2,*fp3;共六十三頁(yè)8.1.4 文件

9、操作(cozu)的基本步驟 系統(tǒng)從文件中操作(cozu)數(shù)據(jù)的方式與直接在內(nèi)存中操作(cozu)數(shù)據(jù)的方式有所不同,一般程序?qū)?shù)據(jù)由內(nèi)存中輸出到文件中的操作(cozu)稱(chēng)為寫(xiě)操作(cozu);把數(shù)據(jù)從文件中讀出并裝入內(nèi)存中的操作(cozu)稱(chēng)為讀操作(cozu)。文件讀/寫(xiě)操作的處理過(guò)程如圖8-2所示,我們可將其概括為如下4個(gè)基本步驟。 1. 定義文件類(lèi)型指針 文件類(lèi)型指針是由系統(tǒng)定義的一個(gè)結(jié)構(gòu)體類(lèi)型的指針。在定義一個(gè)程序文件后,系統(tǒng)為每一個(gè)被使用的文件在內(nèi)存中開(kāi)辟一個(gè)文件緩沖區(qū)來(lái)存放該文件的信息。這些信息記錄在一個(gè)結(jié)構(gòu)體變量,結(jié)構(gòu)體的類(lèi)型由系統(tǒng)在stdio.h中定義,類(lèi)型名為FILE,其結(jié)構(gòu)

10、形式為實(shí)例8-2。共六十三頁(yè)8.1.4 文件(wnjin)操作的基本步驟 圖8-2 文件(wnjin)讀寫(xiě)操作的處理過(guò)程否繼續(xù)成功失敗成功失敗結(jié) 束開(kāi) 始進(jìn)行文件讀/寫(xiě)操作關(guān)閉文件尋找指定文件(打開(kāi)文件)錯(cuò)誤顯示錯(cuò)誤顯示查找成功?讀寫(xiě)成功?繼續(xù)讀寫(xiě)?共六十三頁(yè)8.1.4 文件操作的基本(jbn)步驟 【實(shí)例8-2】 typedef struct short level; /緩沖區(qū)滿或空的情況 unsigned flags; /文件(wnjin)轉(zhuǎn)臺(tái)標(biāo)志 char fd; /文件識(shí)別描述符 unsigned char hold; /無(wú)緩沖區(qū)不讀取字符 short bsize; /緩沖區(qū)大小 un

11、signed char *buffer; /文件緩沖區(qū)地址 unsigned char *curp; /當(dāng)前讀寫(xiě)指針的指向 unsigned istemp; /臨時(shí)文件批示器 short token; /用于有效性檢查 FILE;共六十三頁(yè)8.1.4 文件操作的基本(jbn)步驟 2. 打開(kāi)文件 打開(kāi)文件就是打開(kāi)文件是進(jìn)行文件讀寫(xiě)之前的一個(gè)必需步驟,其目的是將指定的文件與程序聯(lián)系起來(lái),為后續(xù)的文件讀寫(xiě)作(xizu)準(zhǔn)備。 3. 讀/寫(xiě)操作 對(duì)文件進(jìn)行讀操作(讀文件)是從已打開(kāi)的數(shù)據(jù)文件中取出數(shù)據(jù), 然后再賦值給程序中的變量; 對(duì)文件進(jìn)行寫(xiě)操作(寫(xiě)文件)是將程序的運(yùn)行結(jié)果保存到指定的數(shù)據(jù)文件中去

12、,即傳送到外存上該文件所對(duì)應(yīng)的存儲(chǔ)區(qū)域中。 4. 關(guān)閉文件 關(guān)閉文件是讀/寫(xiě)完畢后,隨即撤銷(xiāo)程序與數(shù)據(jù)文件之間原有的聯(lián)系,它標(biāo)志著文件操作過(guò)程的結(jié)束。共六十三頁(yè)8.2 文件的打開(kāi)(d ki)與關(guān)閉 FILE *fopen(char *pname,char *mode); 文件的打開(kāi)實(shí)質(zhì)上就是為要操作的文件在內(nèi)存中分配一個(gè)ILE結(jié)構(gòu)的信息區(qū),然后將該結(jié)構(gòu)變量的指針?lè)祷亟o程序。打開(kāi)文件的操作是通過(guò)C語(yǔ)言(yyn)提供的庫(kù)函數(shù)fopen來(lái)實(shí)現(xiàn)的,該函數(shù)的語(yǔ)法結(jié)構(gòu)定義一般形式為: 【格式說(shuō)明】pname為指向文件名字符串的指針,它指向被打開(kāi)的文件;mode指定文件的處理方式 。8.2.1文件的打開(kāi)共六

13、十三頁(yè)8.2.1 文件(wnjin)的打開(kāi) 【實(shí)例8-3】已知一個(gè)文本文件f.txt中保存了5個(gè)學(xué)生(xu sheng)的計(jì)算機(jī)等報(bào)考試成績(jī),包括學(xué)號(hào)、姓名和分?jǐn)?shù),文件數(shù)據(jù)如表8-3所示,要求將文件的內(nèi)容讀出并顯示到屏幕中。 編寫(xiě)程序 # include int main(void) FILE *fp; /定義文件指針 long hum; char stname20; int score; if(fp=fopen(“f.txt”,“r”)=NULL) /打開(kāi)文件 printf(“File open error!n”); exit(0);共六十三頁(yè)8.2.1 文件(wnjin)的打開(kāi) else

14、while(!feof(fp) fscanf(fp,“l(fā)dsd”,&num,stname,&score); /fscanf()函數(shù)將數(shù)據(jù)讀入 printf(“%1d%-10s%dn”, num,stname,score);/輸出到屏幕 if(fclose(fp) /關(guān)閉文件(wnjin) printf(“Can not close the file!n”); exit(0); return0; 運(yùn)行程序 20110001 張 容 90 20110002 李志勇 86 20110003 陳 強(qiáng) 88 20110004 黃 靖 97 20110005 劉健欣 93共六十三頁(yè)8.2.2 文件(wnj

15、in)的關(guān)閉 關(guān)閉文件操作是通過(guò)C語(yǔ)言提供的庫(kù)函數(shù)fclose實(shí)現(xiàn)的,即關(guān)閉fp所指向的文件。打開(kāi)文件時(shí)系統(tǒng)為打開(kāi)的文件分配一個(gè)文件結(jié)構(gòu)變量(binling),文件被關(guān)閉時(shí),該變量(binling)將被釋放。該函數(shù)的語(yǔ)法結(jié)構(gòu)定義一般為: int fclose(FILE *fp); 【格式說(shuō)明】“fclose”為庫(kù)函數(shù)名;“*fp”為文件類(lèi)型指針變量。共六十三頁(yè)8.2.2 文件(wnjin)的關(guān)閉【實(shí)例8-2】將一串字符A一Z寫(xiě)入文件(wnjin)并保存,程序代碼如下:#include# includevoid main() char ch; FILE *fp; /定義文件指針變量;步驟1 fp

16、=fopen(“l(fā)etter.dat”,“,”w“); /新建并打開(kāi)一個(gè)文件;步驟2 if(fp=NULL) /判斷文件打開(kāi)成功與否 printf(“n Opening file error”); exit(0); for(chA;ch=Z;ch+) fputc(ch,fp); /將變量ch中的字符寫(xiě)入文件;步驟3 fputc(n,fp); /最后寫(xiě)入一個(gè)換行符 fclose(fp) ; /關(guān)閉文件;步驟4共六十三頁(yè)8.3 文件(wnjin)的順序讀/寫(xiě)操作 int fputc/putc(int/char ch,F(xiàn)ILE *fp);8.3.1讀/寫(xiě)一個(gè)(y )字符 C語(yǔ)言提供了若干庫(kù)函數(shù)來(lái)完成

17、對(duì)文件的讀寫(xiě)操作,其中fgetc函數(shù)和fputc函數(shù)的特點(diǎn)是每次只能讀寫(xiě)一個(gè)字符。 1.字符寫(xiě)入函數(shù)fputc( ) 字符寫(xiě)入函數(shù)fputc(或putc)的作用是將一個(gè)字符寫(xiě)到一個(gè)文件中。該函數(shù)的語(yǔ)法結(jié)構(gòu)定義一般為: 【實(shí)例83】從鍵盤(pán)中輸入一些字符,然后將這些字符依次存放到“a.txt”文件中,直到輸入一個(gè)換行為止。程序代碼如下: 共六十三頁(yè)# includemain() FILE *fp;char ch; fp=fopen(a.txt,w); /以只寫(xiě)方式打開(kāi)一個(gè)文件 if(fp= =NULL) /判斷文件的打開(kāi)是否(sh fu)成功 printf(Can not open the fil

18、en); exit(0); else ch=getchar() while(ch!=n) fputc(ch,fp);ch=getchar(); fclose(fp); /寫(xiě)入完畢后關(guān)閉文件 8.3.1 讀/寫(xiě)一個(gè)(y )字符共六十三頁(yè)8.3.1 讀/寫(xiě)一個(gè)(y )字符 2. 字符讀取函數(shù)fgetc() 字符讀取函數(shù)fgetc(或getc)的作用是從一個(gè)(y )打開(kāi)的文件中(文件打開(kāi)的方式必須為只讀或讀寫(xiě) ) 讀取一個(gè)字符。這兩個(gè)函數(shù)雖然函數(shù)名不同, 但在功能和使用上卻是一樣的。都是從fp所指定的文件中讀取一個(gè)字符,并把該字符賦給變量ch。該函數(shù)的語(yǔ)法結(jié)構(gòu)定義一般為 :int fgetc(FIL

19、E *fp);int getc(FILE *fp); 【格式說(shuō)明】fp是一個(gè)文件類(lèi)型指針變量,它指向已打開(kāi)的文件。共六十三頁(yè)8.3.1 讀/寫(xiě)一個(gè)(y )字符 【實(shí)例84】從實(shí)例83的“a.txt”文件中依此讀取所有(suyu)字符,并將其輸出到屏幕上。程序代碼如下:#include “stdio.h”#include “process.h”main( ) FILE *fp; char ch; fp=fopen(a.txt,r); /以只讀方式打開(kāi)一個(gè)文件 if(fp= =NULL) /判斷文件的打開(kāi)是否成功 printf(Can not open the filen); exit(0); 共

20、六十三頁(yè)8.3.1 讀/寫(xiě)一個(gè)(y )字符else ch=fgetc(fp) while(ch!=-1) /順序讀取文件(wnjin)中的字符 frintf(%c”ch,ch); ch=fgetc(fp); fclose(fp); /讀取完畢后關(guān)閉文件運(yùn)行程序Hello Wolrd!共六十三頁(yè)8.3.2 讀/寫(xiě)一個(gè)(y )字符串 雖然fputc函數(shù)和fgetc函數(shù)可以實(shí)現(xiàn)從文件中讀寫(xiě)字符的功能,但是由于它們(t men)每次只能讀 寫(xiě)一個(gè)字符, 往往在操作含有大量字符的文件時(shí)會(huì)顯得比較煩瑣。因此,C語(yǔ)言提供了一次可以讀寫(xiě)一個(gè)字符串的函數(shù):fputs函數(shù)和fgets函數(shù)。 1. 字符串讀取函數(shù)f

21、gets() fgets函數(shù)的作用是從一個(gè)文件中讀取一個(gè)字符串。該函數(shù)的語(yǔ)法結(jié)構(gòu)定義一般為:char *fgets(char *str,int n,F(xiàn)ILE *fP); 【格式說(shuō)明】str為讀取到的字符串的地址,可以是指針,也可以是數(shù)組;n為限定讀取的字符個(gè)數(shù);fp為指定讀取的文件。共六十三頁(yè)8.3.2 讀/寫(xiě)一個(gè)(y )字符串 2. 字符串寫(xiě)入函數(shù) fputs() fputs函數(shù)的作用是把str所指定的字符串寫(xiě)入到fp所指定的文件中去(不包括(boku)字符串結(jié)束標(biāo)志0)。 該函數(shù)的語(yǔ)法結(jié)構(gòu)定義一般為: int fputs(char *str,F(xiàn)ILE *fp); 【格式說(shuō)明】str為指定輸

22、出的字符串,它可以是指針、數(shù)組名或字符串;fp為指定的輸出文件。共六十三頁(yè)8.3.3 讀/寫(xiě)一個(gè)(y )數(shù)據(jù)塊 在很多情況下,需要一次性讀寫(xiě)一組數(shù)據(jù),例如對(duì)程序中的數(shù)組、結(jié)構(gòu)體等大型數(shù)據(jù)進(jìn)行整體的輸入輸出。因此C語(yǔ)言提供了fread和fwrite兩個(gè)函數(shù)用于讀寫(xiě)一個(gè)數(shù)據(jù)塊。 1、寫(xiě)入數(shù)據(jù)函數(shù)fwrite() fwrite函數(shù)的作用將保存在內(nèi)存(ni cn)中的數(shù)據(jù)(以buffer.作為起始地址)以二進(jìn)制的形式寫(xiě)到fp所指定的文件中去,每次寫(xiě)入的數(shù)據(jù)塊為size個(gè)字節(jié),一共執(zhí)行number次寫(xiě)操作。該函數(shù)的語(yǔ)法結(jié)構(gòu)定義一般為: int fwrite(const void *buffer,unsi

23、gned size, unsigned number,F(xiàn)ILE *fp);共六十三頁(yè)8.3.3 讀/寫(xiě)一個(gè)(y )數(shù)據(jù)塊 【實(shí)例85】從鍵盤(pán)輸入3位教師(jiosh)的信息,并將它們存放到文件teacher.dat中。程序代碼如下: # include# includemain() FILE *fp;int i;struct teacher /定義教師結(jié)構(gòu)體 long num;char name20int age;float salary; tea3;共六十三頁(yè)8.3.3 讀/寫(xiě)一個(gè)(y )數(shù)據(jù)塊for(i=0;j3;i+) /從鍵盤(pán)中輸入三位教師(jiosh)的信息scanf(“l(fā)d,s,d

24、,f”,&teai.num,,&teai.age, &teai.salary)fp=fopen(“teacher.dat”.“wb”); /以只寫(xiě)方式打開(kāi)一個(gè)二進(jìn)制文件if(fp=NULL) printf(Cannotopenthefilen); exit(0);else for(i=0;i3;j+) /將結(jié)構(gòu)體數(shù)組tea中的三個(gè)元素依次寫(xiě)入文件中fwrite(&teai,sizeof(struct teacher),l,fp);fclose(fp)共六十三頁(yè)8.3.3 讀/寫(xiě)一個(gè)(y )數(shù)據(jù)塊 2、讀取數(shù)據(jù)函數(shù)fread fread函數(shù)主要用來(lái)(yn li)從指定二進(jìn)制文件

25、中讀取數(shù)據(jù)。該函數(shù)的語(yǔ)法結(jié)構(gòu)定義一般為: int fread(void *buffer,unsigned size, unsigned number,F(xiàn)ILE *fP); 【格式說(shuō)明】buffer是輸入數(shù)據(jù)在內(nèi)存中存放的起始地址,可以是一個(gè)數(shù)組名,也可以是一個(gè)指針變量名;size是一個(gè)無(wú)符號(hào)整型參數(shù), 是函數(shù)一次要讀取數(shù)據(jù)塊的字節(jié)數(shù);number是一個(gè)無(wú)符號(hào)整型參數(shù),代表函數(shù)要讀取number個(gè)size大小的數(shù)據(jù)塊;fp為文件指針型變量,與要讀取數(shù)據(jù)的文件相關(guān)聯(lián)。 共六十三頁(yè)8.3.4 格式化讀/寫(xiě)函數(shù)(hnsh) 所謂格式化讀寫(xiě),是指不僅要讀寫(xiě)文件中的數(shù)據(jù),而且還需要指定數(shù)據(jù)的讀寫(xiě)格式。 1

26、. 格式化讀函數(shù)fscadf( ) fscadf()函數(shù)按指定格式從fp所指向的文件中讀取數(shù)據(jù)送到對(duì)應(yīng)的變量中。當(dāng)對(duì)文件進(jìn)行(jnxng)fscadf( )操作后,文件內(nèi)部的讀寫(xiě)位置指針會(huì)自動(dòng)后移。該函數(shù)的語(yǔ)法結(jié)構(gòu)定義一般為: int fscadf(FILE fP,“輸入格式描述串”, 輸入項(xiàng)地址列表);共六十三頁(yè)8.3.4 格式化讀/寫(xiě)函數(shù)(hnsh) 2. 格式化寫(xiě)函數(shù)fprintf() fprintf()函數(shù)將輸出列表中的數(shù)據(jù)按指定(zhdng)格式寫(xiě)到fp所指向的文件中。當(dāng)對(duì)文件進(jìn)行fprintf()操作后,文件內(nèi)部的讀寫(xiě)位置指針將移動(dòng)到寫(xiě)入的數(shù)據(jù)之后。 該函數(shù)的語(yǔ)法結(jié)構(gòu)定義一般為:

27、int fprintf(FILE fP,“輸出格式描述字符串”, 輸出項(xiàng)列表); 【格式說(shuō)明】fprintf()按照指定的輸出格式,把輸出項(xiàng)表列中的各項(xiàng)數(shù)據(jù)一起寫(xiě)入文件fp中。 fp為指定的輸出文件; “輸出格式描述字符串”為指定的輸出形式, 與printf()函數(shù)的“輸出格式描述字符串”相同。共六十三頁(yè)8.3.4 格式化讀/寫(xiě)函數(shù)(hnsh) 【實(shí)例87】 生成一個(gè)“l(fā)ist.dat”文件,在該文件中以“單價(jià),數(shù)量” 格式存放了某商場(chǎng)的商品數(shù)據(jù) (商品的單價(jià)和數(shù)量分別存放在兩個(gè)一維數(shù)組中), 程序?qū)⒂?jì)算(j sun)出所有商品的總金額,并將它存放在“l(fā)ist.dat”文件的最后一行。程序代碼

28、如下:#include#includevoid main()FILE * fp;float total=0,price,p3=12.3,45,6,78.9;int i,num,n31=10,20,30;if(fp=fopen(list.dat,“w”)=NULL) /以只寫(xiě)方式打開(kāi)文件 printf(Cant open file!n”);exit(0);for(i=0;i3;i+)共六十三頁(yè)8.3.4 格式化讀/寫(xiě)函數(shù)(hnsh) fprintf(fp,“5.2f,dn”,pi,ni); total=total+pi*ni ; /計(jì)算所有(suyu)商品的總金額 fprintf(fp,“總金額

29、=f”,total); /按”總金額=f”格式寫(xiě)入總金額 fclose(fP);if(fp=fopen(“l(fā)ist.dat”,“r”)=NULL) printf(“Cant open file!n”); /以只讀方式重新打開(kāi)文件 exit(0);for(i=0;i3;i+) fscanf(fp,“f,d”,&price,&num); printf(“f,3dn”,price,num); 共六十三頁(yè)8.3.4 格式化讀/寫(xiě)函數(shù)(hnsh)fscanf(fp,“總金額=f”,&total);printf(“總泜金額=8.2fn”,total); fclose(fp);運(yùn)行程序(chngx)12.3

30、5,4245.62,2578.96,18總金額=3080.479973程序的輸出結(jié)果(口為空格):12.350000,口4245.619999,口2578.959999,口18總金額=口3080.48共六十三頁(yè)8.4 文件的隨機(jī)(su j)讀/寫(xiě)操作 文件定位是通過(guò)函數(shù)實(shí)現(xiàn)的,并將這類(lèi)函數(shù)稱(chēng)為定位函數(shù)。移動(dòng)文件內(nèi)部位置指針的函數(shù)有兩個(gè),即rewind()函數(shù)和fseek()函數(shù)。 1、復(fù)位函數(shù)rewind() rewind函數(shù)又稱(chēng)為回繞函數(shù),該函數(shù)的功能是將文件內(nèi)部的位置指針重新移到文件的開(kāi)始(kish)位置。該函數(shù)的語(yǔ)法結(jié)構(gòu)定義一般為: void rewind(FILE *fp)8.4.1讀

31、/寫(xiě)一個(gè)字符共六十三頁(yè)8.4.1 文件定位(dngwi)函數(shù) 【實(shí)例88】編寫(xiě)程序?qū)⒆址癏ello”寫(xiě)入文件a.txt,再將文件位置指針回繞至文件首部,再使用字符串讀函數(shù)(hnsh)將剛寫(xiě)入文件的字符串讀取并顯示在屏幕上。程序代碼如下:# include “stdio.h”# include “process.h”main() FILE*fp; int i; char str=Hello; char string 6; fp=fopen(a.txt,w+); /以可讀可寫(xiě)的方式打開(kāi)a.txt文件 if(fp=NULL) printf(Can not open the filen); exi

32、t(0);共六十三頁(yè)8.4.1 文件(wnjin)定位函數(shù)else fputs(str,fp); /將Hello寫(xiě)入文件,此時(shí)文件位置指針(zhzhn)位于文件尾部 rewind(fp); /將文件位置指針回繞至文件首部 fgets(string,6,fp); /將字符串從文件中讀出并存放在字符數(shù)組string中 printr(s,string); /字符串輸出到屏幕上 fclose(fp);運(yùn)行程序Hello共六十三頁(yè)8.4.1 文件定位(dngwi)函數(shù) 2. 隨機(jī)移動(dòng)(ydng)函數(shù)fseek() fseek函數(shù)是隨機(jī)讀寫(xiě)函數(shù), 該函數(shù)可以將文件位置指針按照需要移動(dòng)到文件的任何位置,從而

33、實(shí)現(xiàn)文件的隨機(jī)讀寫(xiě)。該函數(shù)的語(yǔ)法結(jié)構(gòu)定義一般為: int fseek(FILE *fp,long offset,int whence) 【格式說(shuō)明】參數(shù)fp為文件指針,它指向參數(shù)whence, 表示所選取的參照物,參數(shù)offset為相對(duì)位移量,它把fp的讀寫(xiě)位置指針調(diào)整到相對(duì)whence來(lái)說(shuō)是offset的地方,它既可用于文本文件操作,也可用于二進(jìn)制文件操作。 共六十三頁(yè)8.4.2 返回文件(wnjin)當(dāng)前位置的函數(shù) 在隨機(jī)讀/寫(xiě)文件時(shí),由于文件中的位置指針經(jīng)常移動(dòng),人們(rn men)往往不容易知道當(dāng)前位置,使用ftell( )函數(shù)便可獲得文件位置指針在文件中的當(dāng)前位置。該函數(shù)的語(yǔ)法結(jié)構(gòu)定

34、義一般為: long ftell(FILE *fp) 【格式說(shuō)明】fp為文件指針。獲取文件當(dāng)前的讀寫(xiě)位置,該位置是用相對(duì)于文件首的位移量來(lái)表示的。 【實(shí)例810】設(shè)計(jì)一個(gè)程序能夠顯示用戶指定的某個(gè)文本文件的長(zhǎng)度,即該文件在外存儲(chǔ)器上存儲(chǔ)所占的字節(jié)數(shù)。程序代碼如下:共六十三頁(yè)8.4.2 返回(fnhu)文件當(dāng)前位置的函數(shù)# include# includevoid main() FILE*fP;char filename20; /用來(lái)存放輸入的文件名system(dir *.C);printf( Please input File name:);scanf(S,filename);if(fp=f

35、open(filename,r)=NULL) printf(Can not open this file S.n,filename);exit(0);fseek(fp,0,SEEK_END); /將位置(wi zhi)指針調(diào)整到文件的末尾printf(Length of S is ld bytes.n,filename,ftell(fP);fclose(fp);共六十三頁(yè)8.5 文件(wnjin)讀/寫(xiě)出錯(cuò)的檢測(cè) 當(dāng)采用 fgetc ( )或其它文件輸入函數(shù)進(jìn)行(jnxng)讀文件操作時(shí),如果函數(shù)的返回值為EOF時(shí),則表示文件已經(jīng)結(jié)束。 但這個(gè)結(jié)論只能適合于文本文件, 因?yàn)锳SCII編碼中并沒(méi)

36、有碼值為-1的字符。為了能準(zhǔn)確地表達(dá)文件是否結(jié)束,就需要引入函數(shù)feof()。該函數(shù)的語(yǔ)法結(jié)構(gòu)定義一般為: int feof(FILE *fp) 【格式說(shuō)明】fp為文件指針,用于判斷文件是否結(jié)束。8.5.1文件讀/寫(xiě)結(jié)束檢查函數(shù)共六十三頁(yè)8.5.2 文件(wnjin)出錯(cuò)檢查函數(shù) 雖然通過(guò)各種文件操作函數(shù) (fputc、fgetc、 fputs、fgets)的返回值可以(ky)判斷當(dāng)前操作是否出錯(cuò),但是很多情況下并不能顯示詳細(xì)的出錯(cuò)信息。該函數(shù)的語(yǔ)法結(jié)構(gòu)定義一般為: int ferror(FILE *fp) 【格式說(shuō)明】fp為文件指針。在執(zhí)行輸入輸出操作時(shí),可用該函數(shù)來(lái)檢查被操作的文件是否出錯(cuò)

37、。共六十三頁(yè)8.5.3 文件(wnjin)出錯(cuò)復(fù)位函數(shù) 文件出錯(cuò)(ch cu)復(fù)位函數(shù)clearerr( )的作用是將文件的錯(cuò)誤標(biāo)志重新置為0。假設(shè)當(dāng)調(diào)用一個(gè)文件操作函數(shù)時(shí)出現(xiàn)了錯(cuò)誤,則ferror 函數(shù)會(huì)返回一個(gè)非0 值, 這時(shí)如果再調(diào)用clearerr函數(shù),ferror函數(shù)的返回值就會(huì)變?yōu)?。該函數(shù)語(yǔ)法結(jié)構(gòu)定義一般為: void clearerr(FILE *fp) 【格式說(shuō)明】clearerr()函數(shù)用于重新設(shè)置文件出錯(cuò)標(biāo)志。在文件操作出現(xiàn)錯(cuò)誤后,該錯(cuò)誤信息將一直保留在系統(tǒng)中,出錯(cuò)時(shí)通過(guò)函數(shù)clearerr()可以獲取該出錯(cuò)信息。 共六十三頁(yè)8.5.3 文件出錯(cuò)(ch cu)復(fù)位函數(shù) 實(shí)

38、例(shl)812】設(shè)計(jì)一個(gè)程序,當(dāng)檢測(cè)到發(fā)生文件讀寫(xiě)錯(cuò)誤時(shí),要求用函數(shù)clearerr( )清除文件出錯(cuò)信息。程序代碼如下:# include “stdio.h”# includevoid main() FILE * fp; char ch; if(fp=fopen(test.dat,w)=NULL); /以寫(xiě)方式打開(kāi)文件 printf(Can not open the file.n); exit(0); ch=fgettc(fp); printf(%c,%dn,ch,ch);共六十三頁(yè)8.5.3 文件(wnjin)出錯(cuò)復(fù)位函數(shù)if(ferror(fp) printf(Error occur

39、red in reading test.datn); clearerr(fp); printf(“File error code=%dn”, ferror(fp);fclose(fp);共六十三頁(yè)8.6 算法案例(n l)程序設(shè)計(jì) 1、案例描述 這是法國(guó)(f u)數(shù)學(xué)家加思帕提出來(lái)的一個(gè)趣味問(wèn)題:有15個(gè)基督徒和15個(gè)非基督徒乘坐的船在海上遇險(xiǎn),必須將一半的人投入海中,其余的人才能逃生。有人提出一個(gè)辦法,讓30個(gè)人圍成一圈,從第一個(gè)人開(kāi)始報(bào)數(shù),數(shù)到第9的那個(gè)人就被投入海中,如此下去,直到剩下15人為止。結(jié)果15個(gè)基督徒全部幸運(yùn)地留了下來(lái)。請(qǐng)問(wèn):當(dāng)初30個(gè)人是如何排列的? 2. 案例分析 可以使

40、用一個(gè)具有30個(gè)數(shù)據(jù)元素的數(shù)組模擬30個(gè)人圍成的圈,數(shù)組元素值為1時(shí),表示該人留在船上,值為0時(shí)表示被投入海中。8.6.1海上逃生共六十三頁(yè) 8.6.1 海上(hi shn)逃生 3. 算法描述 此題與第6章案例程序設(shè)計(jì)“猴子選大王(dwng)”和“約瑟夫問(wèn)題”是相似的,此題最簡(jiǎn)單方法就是利用數(shù)組編程。 4. 程序?qū)崿F(xiàn)# includevoid throw(int a30,int n); /聲明throw函數(shù)原型int people30; /定義全局?jǐn)?shù)組peoplevoid throw(int a30,int n); /指定報(bào)數(shù)為n即被投入大海 int i,k,j=0; for(i=0,i5;

41、i+) for(k=0;) k=k+aj; if(k=n) /報(bào)數(shù)為n,則修改該元素值為0,并進(jìn)行下一輪報(bào)數(shù) aj=0; j=(j+1)30;/下標(biāo)移動(dòng)到第29后下一個(gè)位置自動(dòng)轉(zhuǎn)到0共六十三頁(yè)8.6.1 海上(hi shn)逃生break;j=(j+1)30;# include /此處應(yīng)寫(xiě)出filel.c的完整路徑# includeint main(void) extern people30; int i; for(i=0;i30;i+) peoplei=l; /初始化全局?jǐn)?shù)組 throw(people,9); /調(diào)用throw函數(shù) printf(“n”); for(i=0;i30;i+) p

42、rintf(“d”,peoplei);運(yùn)行(ynxng)程序11100000110111010011000100110共六十三頁(yè)8.6.2 誰(shuí)去誰(shuí)留 1、案例描述 某班拿到了n 張創(chuàng)新思維報(bào)告會(huì)的入場(chǎng)券,因?yàn)橹挥衝 張票,可是有2n個(gè)學(xué)生, 人人都想去,讓誰(shuí)去呢?班委會(huì)經(jīng)過(guò)討論,產(chǎn)生一個(gè)很有趣的規(guī)則:全班同學(xué)依次抽簽, 借助一張只有“去”或“留”兩面的卡片。每個(gè)人能否去聽(tīng)報(bào)告會(huì), 不是自己選擇,而是由班長(zhǎng)扔卡片決定, 看到“去”的同學(xué)就將得到入場(chǎng)券. 有位同學(xué)想和他的好朋友希望最好能夠兩個(gè)人都拿到入場(chǎng)券, 可是抽簽的方式讓他們很無(wú)奈??吹角懊嬗腥藲g喜有人憂,你們就一拖再拖,終于,他們成了隊(duì)伍的

43、最后(zuhu)兩人, 等待他們的將是什么呢? 如果前面已經(jīng)有n個(gè)人留下, 他們就不必選擇, 班長(zhǎng)也不必扔卡片了, 他們理所當(dāng)然是“去”聽(tīng)報(bào)告會(huì)了,這是一個(gè)多好的結(jié)局?。】墒浅霈F(xiàn)這種可能的概率是多少?共六十三頁(yè)8.6.2 誰(shuí)去誰(shuí)留 2. 案例分析 每個(gè)人“去”和“留”的概率實(shí)際上是不同的,對(duì)于某些人,他的情況是與前面的情況有關(guān)系的。題中需要的實(shí)際上相當(dāng)于前面的2n-2個(gè)人拿到n次“留”的情況。 3. 算法描述 如果用fi, j表示前i個(gè)人拿到j(luò)次“留”的概率,那么可以(ky)應(yīng)用遞推思想來(lái)考慮 4. 程序?qū)崿F(xiàn)#include FILE *fin, *fout;main() int i, j,

44、m, n;float f1001501 = 0;fin = fopen(torf.in, r);共六十三頁(yè)8.6.2 誰(shuí)去誰(shuí)留fout = fopen(torf.out, w);fscanf(fin, %d, &m); /這里的m2n,是總?cè)藬?shù)n = m / 2;f10 = 0.5;f11 = 0.5; printf(%dn,n);for (i = 2; i = m-2; i+ ) if (i = n)fi0 = fi-10 * 0.5;elsefi0 = 0; /得到(d do)0個(gè)“留”for (j = 1; j i) fij = 0; if (j n) fij = 0.5 * (fi-1

45、j-1 + fi-1j); if (j = n) fij = 0.5 * fi-1j-1 + fi-1j; fprintf(fout, “%.4lfn”, fm-2n); /按格式要求(yoqi)輸出結(jié)果fclose(fin);fclose(fout);return 0;共六十三頁(yè)8.6.3 探險(xiǎn)隊(duì)走出泥潭(ntn) 1. 案例描述 探險(xiǎn)隊(duì)想穿越泥潭,必須選擇可踩踏的落腳點(diǎn)??墒悄嗵睹娣e很大,落腳點(diǎn)又實(shí)在少得可憐,一不小心,就會(huì)深陷泥潭而無(wú)法脫身(tu shn)。偵查員費(fèi)盡周折才從老鄉(xiāng)手里搞到了一份地圖,圖中標(biāo)出了落腳點(diǎn)的位置,而且令人震驚的是:泥潭只有一條穿越路線, 而且對(duì)于nm的地圖,路線長(zhǎng)度為nm11現(xiàn)在請(qǐng)你幫探險(xiǎn)隊(duì)找出穿越路線吧。 2. 案例分析 由于本題數(shù)據(jù)如此特殊, 可以采用鏈表存放數(shù)據(jù)。從(1,1)開(kāi)始僅記錄1的位置,數(shù)據(jù)讀入完畢,鏈表中存放的就是穿越路線了。共六十三頁(yè)8.6.3 探險(xiǎn)隊(duì)走出泥潭(ntn) 3. 算法描述 本題(bnt)采用窮舉法進(jìn)行求解。 4. 程序?qū)崿F(xiàn)#include#includeFILE *fin,*fout;struct node int row,line; struct node *next;struct node *head,*p,*q;int n,m;void print() /定義輸出鏈表的過(guò)程 p=head; /從頭指針開(kāi)始

溫馨提示

  • 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ù)覽,若沒(méi)有圖紙預(yù)覽就沒(méi)有圖紙。
  • 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ì)自己和他人造成任何形式的傷害或損失。

最新文檔

評(píng)論

0/150

提交評(píng)論