《C語言程序設計基礎》課件第11章_第1頁
《C語言程序設計基礎》課件第11章_第2頁
《C語言程序設計基礎》課件第11章_第3頁
《C語言程序設計基礎》課件第11章_第4頁
《C語言程序設計基礎》課件第11章_第5頁
已閱讀5頁,還剩55頁未讀 繼續(xù)免費閱讀

下載本文檔

版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領

文檔簡介

第11章

文件輸入/輸出11.1文件的基本概念11.2文件的打開與關閉11.3順序讀/寫數據文件11.4隨機讀/寫數據文件11.5文件讀/寫的出錯檢測實訓任務二十一

熟悉數據文件的建立與讀/寫實訓任務二十二

學習程序與數據文件交互的程序設計方法

11.1文件的基本概念

程序文件與數據文件有何異同?程序文件通過什么方式與數據文件交互?

文件是指存儲在外部介質上數據的集合。文件有不同的類型。在程序設計中,主要用到程序文件和數據文件。

程序文件包括源程序文件(后綴為.c)、目標文件(后綴為.obj)、可執(zhí)行文件(后綴為.exe)等。這種文件的內容都是程序代碼。

數據文件的內容是供程序運行時讀/寫的數據。

每個文件都有一個唯一的文件標識符,便于識別和使用。文件標識包括3個部分,即文件路徑、主文件名和擴展名(也稱為后綴)。例如:

文件路徑表示文件的存儲位置。文件名包括主文件名和文件擴展名。主文件名是文件的主要標識符號,由用戶命名,擴展名(后綴)用來表示文件的性質,一般不超過3個字符,一般采用一些約定的符號。例如dat(數據文件)、txt(文本文件)、c(C語言源程序)、cpp(C++語言源程序)、exe(可執(zhí)行文件)等。

11.1.1數據文件的概念

數據在文件中的存儲形式是:字符以ASCII碼形式存儲,即一個字符占一個字節(jié);數值型數據可以按數字的ASCII碼形式存儲,即一位數字的ASCII碼占一個字節(jié),也可以按二進制數存儲。如果一個文件都以字符的ASCII碼形式存儲數據,則稱之為文本文件;如果一個文件都以二進制形式存儲數據,則稱之為二進制文件。文本文件(ASCII碼)中,一個數據的每一位數字的ASCII碼占一個字節(jié),調入內存時需轉換成二進制數,存入文件時又要轉換成ASCII碼,占用內存空間大,而且有轉換時間,但可直接向外設輸出。二進制文件中數據的存儲形式與內存存儲數據的形式一致,占用空間小,從文件輸入或向文件輸出時不需要轉換,但向外設輸出時需要轉換成ASCII碼。

11.1.2文件緩沖區(qū)

所謂文件緩沖區(qū),是系統(tǒng)與磁盤文件傳輸數據時在內存中開辟的一個暫存區(qū)域。向磁盤文件輸出數據時,必須先送到緩沖區(qū),裝滿緩沖區(qū)后,才送到磁盤文件中。從磁盤讀入數據時,則從磁盤文件輸入數據裝滿緩沖區(qū),然后從緩沖區(qū)將數據逐個地送到程序數據區(qū)(給程序變量),如圖11.1所示。緩沖區(qū)的大小由各個具體的C編譯系統(tǒng)確定。

圖11.1程序與數據文件傳輸數據示意圖

11.1.3文件類型指針

程序中對文件的各種操作是通過文件指針進行的。每個文件被使用時,系統(tǒng)在內存中開辟一個“文件信息描述區(qū)”,用來存放文件的有關信息(如文件名、文件狀態(tài)、文件使用方式、文件當前位置、文件緩沖區(qū)所剩余的字節(jié)數等)。該信息描述區(qū)是用一個結構體變量來實現的,其類型由系統(tǒng)定義,取名為FILE。例如,一種C編譯系統(tǒng)的stdio.h中有以下的文件類型結構體定義:

不同的C編譯系統(tǒng)的FILE類型包含的內容不盡相同,但都大同小異。用戶可以在程序中使用該類型來定義文件指針變量,通過指針變量來引用文件信息。例如:

FILE*fp1;

定義fp1為一個指向FILE類型的指針變量。fp1指向某一個文件的文件信息區(qū)(一個結構體變量),通過該文件信息區(qū)中的信息能夠訪問該文件。如果程序中使用n個文件,一般應定義n個指針變量。

11.2文件的打開與關閉

11.2.1打開文件

使用標準函數fopen來打開一個文件。函數調用的一般形式為

fopen("文件名","文件使用方式");

函數的功能:把指定的文件按使用方式打開,系統(tǒng)自動給該文件建立信息描述區(qū),把文件信息區(qū)的起始地址作為返回值。通常是將返回地址賦給一個指向文件的指針變量。如果打開文件不成功,則返回值為0

使用文件的方式有多種,見表11.1。

表11.1使用文件的方式11.2.2文件的關閉

使用標準函數fclose來關閉一個已經打開的文件。函數調用的一般形式為

fclose(文件指針);

函數的功能:解除文件指針與文件的聯(lián)系,釋放緩沖區(qū)。如果文件關閉成功則返回值為0,否則返回EOF(-1)。

11.3順序讀/寫數據文件

11.3.1字符方式讀/寫文件

字符方式讀/寫文件是一次從文件中讀/寫一個字符。使用文件的字符輸入/輸出函數調用來實現字符讀/寫操作。

1.讀入字符函數fgetc

該函數調用的一般形式為

fgetc(fp);

fp是指向要輸入數據文件的指針變量。其功能是從fp所指向的文件中讀取一個字符,返回字符值;如果讀取失敗,則返回文件結束標志EOF(-1)。

2.寫入字符函數fputc

該函數調用的一般形式為

fputc(ch,fp);

其中,包含兩個參數:ch是要寫入文件的字符,可以是字符常量、字符變量或字符表達式等;fp是要寫入文件的指針變量。其功能是將字符寫入fp所指向的文件,寫入成功則返回值是輸出的字符,寫入失敗則返回EOF(-1)。

例11.1

從鍵盤輸入一行字符,寫入file1.dat文件中。

編程思路:用fgetc函數從鍵盤逐個輸入字符,再用fputc函數寫到磁盤文件中。

運行結果:

分析:運行程序后,在當前目錄下可查找到“file1.dat”,打開文件可看到內容是輸入的字符串。if語句中使用“fopen("file1.dat","w")”函數調用,先建立一個新文件,將指針賦給文件指針變量fp。在循環(huán)中將輸入的一個字符寫入fp所指向的文件中。

例11.2

將一個磁盤文件中的內容復制到另一個磁盤文件中。現將例11.1建立的文件file1.dat復制到文件file2.dat中。

編程思路:從file1.dat中逐個字符讀出,再寫入到file2.dat中。

運行結果:

分析:f_in=fopen("file1.dat","r")是打開已存在的文本文件,使f_in指向file1.dat。fopen("file2.dat","w")是打開不存在的文件,則建立新文件,將返回建立的文件地址賦給f_out。在while循環(huán)中的表達式測試文件是否到達結尾,未到結尾,從file1.dat讀取f_in指向的字符,寫入file2.dat中f_out指向的位置,同時輸出當前讀/寫的字符。運行程序后,在當前目錄下可查找到“file1.dat”和“file2.dat”,打開文件可看到兩個文件內容相同。

11.3.2字符串方式讀/寫文件

1.讀取字符串函數fgets

該函數調用的一般形式為

fgets(str,n,fp);

其中,包含三個參數:str是數組名(數組指針);n是字符串長度(包含結束符);fp是要讀文件的指針變量。

函數功能:從fp所指向文件中讀取n-1個字符的串,并在最后加一個字符串結束符“\0”,存入字符數組str中。讀取成功,返回數組指針str,失敗則返回NULL。

2.寫入字符串函數fputs

該函數調用的一般形式為

fputs(str,fp);

其中,包含兩個參數:str是數組名(數組指針);fp是要寫入文件的指針變量。

函數功能:將str中的字符串寫入fp所指向的文件中。寫入成功返回0,寫入失敗則返回非0。

例11.3

從鍵盤輸入多個字符串,對它們按字母大小的順序排序,然后把排好序的字符串存到文件中。

編程思路:實現問題要求,可采取3個步驟:

(1)從鍵盤輸入多個字符串并存入一個二維數組中;

(2)對字符數組中的n個字符串按字母順序排序,仍存在原字符數組中;

(3)將字符數組中的字符串輸出到文件中。運行結果:

分析:

(1)用單重循環(huán)實現3個字符串的輸入,分別存入二維數組中的3個行一維數組中。

(2)利用雙重循環(huán)實現3個字符串的比較和交換,將排好序的串,按序存入3個行一維數組中。

(3)用fputs函數調用,將排好序的3個行一維數組中的字符串寫入文件。向文件中寫入數據時,只寫入字符串的有效字符,不包括字符串結束標志,所以“fputs(str[i],fp);”存串之后用“fputs("\n",fp);”將串結束標志加存在串后。11.3.3用格式化方式讀/寫文件

C語言系統(tǒng)提供了與終端格式化輸入/輸出函數scanf、printf相仿的文件格式化輸入/輸出函數fscanf、fprintf。這兩個函數調用的一般形式為

fprintf(文件指針,格式字符,輸出列表);

fscanf(文件指針,格式字符,輸入列表);

其中,“格式字符”、“輸入列表”、“輸出列表”都同scanf、printf函數。例如:

fprintf(fp,"%d,%6.2f",i,f);

該語句把整型i和實型變量f的值按%d、%6.2f的格式輸出到fp指向的文件中。

fscanf(fp,"%d,%f",&i,&f);

從fp所指文件中讀取一個整型數據賦給變量i,讀取一個實型數據賦給變量f。

用格式化讀/寫函數fscanf、fprintf對磁盤文件進行讀/寫,比較直觀,容易理解,但因輸入時要將ASCII碼轉換成二進制形式,再保存在變量中,輸出時又要將二進制形式轉換成ASCII碼,所以花費的時間較多。因此,在內存與磁盤交換數據頻繁的情況下,最好不用fscanf、fprintf函數,而用下面介紹的fread、fwrite函數進行二進制的讀/寫。11.3.4用二進制方式向文件讀/寫一組數據

C語言提供的fread和fwrite函數能實現一次輸入/輸出一個數據塊,以二進制形式進行讀/寫。

這兩個函數調用的一般形式為

fread(buffer,size,n,fp);

fwrite(buffer,size,n,fp);

參數說明:

“buffer”表示緩沖區(qū)地址。對fread,表示從文件中讀出數據存放在內存緩沖區(qū)首地址;對fwrite,表示向文件輸出數據的內存緩沖區(qū)首地址。

“size”表示要讀/寫的數據的存儲長度(字節(jié)數)。“n”表示要讀/寫數據的個數。

“fp”表示要讀/寫的文件指針。

fread的功能是從fp所指向的文件中讀取n個數據(每個數據有size個字節(jié)),存到buffer為首地址的存儲區(qū)中。如果讀數據成功,返回輸入數據的個數n。如遇文件結束或出錯則返回值0。

fwrite的功能是把buffer為首地址的n個數據(每個數據有size個字節(jié))寫到fp所指的文件中。如果寫數據成功,返回輸出數據的個數n。

例11.4

從鍵盤輸入3個學生的相關數據,存到一個文件中,再從文件中讀取數據,輸出到屏幕上。

編程思路:定義有3個元素的結構體數組,用來存放3個學生的數據。在主函數中輸入3個學生的數據。用save函數實現向磁盤文件輸出學生數據。在主函數中從磁盤文件讀取學生數據輸出到屏幕上。

運行結果:

分析:

(1)在main(

)函數中輸入3個學生數據,存入結構體數組stud1中。調用save函數將stud1中的數據輸出到“stu.dat”文件中。fwrite將一個結構體數據送到“stu.dat”文件中。結構體長度用“sizeof(structstudent)”測試得到,得到的測試值為36(數據長度=4+10+4+15=33,但按字節(jié)的整數倍存儲)。

(2)在save函數中的“fopen("stu.dat","wb")”是按二進制寫方式打開文件,此時文件不存在,建立一個新文件。在main函數中的“fopen("stu.dat","rb")”是為了讀而打開二進制文件。fread函數從“stu.dat”文件中讀取一個結構體數據(一個學生數據)存入結構體數組stud2中,采用數組元素和結構體成員的輸出方式輸出到屏幕上。

(3)只要修改宏定義中常數3,可實現任意多學生數據的輸入、存儲和輸出。

11.4隨機讀/寫數據文件

怎樣按用戶需要讀/寫數據文件中任一數據?

順序讀/寫數據文件是按數據在文件中的存儲順序進行讀/寫。隨機讀/寫數據文件,是讀/寫文件中任一位置的數據。

為了實現數據文件的讀/寫控制,系統(tǒng)給文件內部設置了一個位置指針。位置指針總是指向當前要讀/寫數據的位置。順序讀寫方式中,位置指針是由系統(tǒng)控制的。讀/寫總是從文件開頭進行,每讀/寫一個數據,指針就后移一個數據位置,指向下一個數據位置,一直到文件尾部,指針又重返文件開頭。隨機讀/寫就是把位置指針控制在需要的位置上進行讀/寫的方式。隨機讀/寫文件的關鍵是控制文件位置指針,也就是指針定位。C語言提供了文件位置指針定位的函數,利用這些函數,就可方便地實現隨機讀/寫文件。

11.4.1位置指針定位函數

C語言提供了文件定位、測試和移動函數。

1.設置文件位置指針到文件開頭函數rewind

該函數調用的一般形式為

rewind(fp);

其中,參數fp是文件類型指針。

函數功能:將fp所指向文件中的位置指針置于文件的開頭位置,并清除文件結束標志和出錯標志。函數無返回值。

2.檢測文件是否結束函數feof

該函數調用的一般形式為

feof(fp);

函數功能:檢測是否到fp所指向文件的結束位置,檢測到文件結束,返回非0值,否則返回0。

3.檢測文件位置指針的當前位置ftell

該函數調用的一般形式為

ftell(fp);

函數功能:檢測fp所指向文件的當前讀/寫位置,返回一長整型數,表示當前讀/寫位置距文件開頭的偏移量。偏移量是指當前讀/寫位置距離文件開頭的字節(jié)數。

4.設置文件位置指針函數fseek

該函數調用的一般形式為

fseek(fp,offset,base);

其中,“offset”表示偏移量;“base”表示改變位置指針的相對基準位置,參數的取值見表11.2。

函數功能:fp所指向文件的位置指針移到以“base”所給出的位置為基準、以“offset”為偏移量的位置。移動成功返回當前位置,否則返回-1。

表11.2fseek中的基準位置參數取值11.4.2隨機讀/寫文件

例11.5

在磁盤文件中存有10個學生的數據,要求讀取第1、3、5、7、9個學生數據并在屏幕上顯示。

編程思路:實現問題要求,需經過以下步驟。

(1)利用例11.4程序建立10個學生數據文件;

(2)按“二進制只讀”方式打開學生數據文件,準備從文件中讀取數據;

(3)將文件位置指針指向文件開頭,讀取第一個學生數據,輸出到屏幕上;

(4)分別使文件位置指針指向第3、5、7、9個學生數據區(qū)的開始位置,讀取一個學生數據,并輸出到屏幕上。運行結果:

分析:本例是在例11.4程序建立的學生數據文件的基礎上,用“fopen("stu.dat","rb")”打開文件,即以“二進制只讀”方式打開文件;采用步長為2的循環(huán)和“i*sizeof(structstudent)”確定讀/寫位置偏移量,使位置指針指向第1、3、5、7、9個學生數據;把學生數據讀入到結構體數組中,然后再按結構體數組元素輸出。

11.5文件讀/寫的出錯檢測

1.錯誤檢測函數ferror

溫馨提示

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

最新文檔

評論

0/150

提交評論