




版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領
文檔簡介
1、C程序設計第13章 文件文件(file)是程序設計中一個重要的概念。所謂“文件”一般指存儲在外部介質上數據的集合。一批數據是以文件的形式存放在外部介質(如磁盤)上的。操作系統是以文件為單位對數據進行管理的,也就是說,如果想找存在外部介質上的數據,必須先按文件名找到所指定的文件,然后再從該文件中讀取數據。要向外部介質上存儲數據也必須先建立一個文件(以文件名標識),才能向它輸出數據。以前各章中所用到的輸入和輸出,都是以終端為對象的,即從終端鍵盤輸入數據,運行結果輸出到終端上。從操作系統的角度看,每一個與主機相聯的輸入輸出設備都看作是一個文件。例如,終端鍵盤是輸入文件,顯示器和打印機是輸出文件。在程
2、序運行時,常常需要將一些數據(運行的最終結果和中間數據)輸出到磁盤上存放起來,以后需要時再從磁盤中輸入到計算機內存。這就要用到磁盤文件。C語言把文件看作是一個字符(字節)的序列,即一個一個字符(字節)的數據順序組成。根據數據的組織形式,可分為ASCII文件和二進制文件。ASCII文件又稱文本文件,它的每一個字節放一個ASCII代碼,代表一個字符。二進制文件是把內存中的數據按其在內存中的存儲形式原樣輸出到磁盤上存放。由前所述,一個C文件是一個字節流或二進制流。它把數據看作是一連串的字符(字節),而不考慮記錄的界限。換句話說,C語言中文件并不是由記錄(record)組成的(這是和PASCAL或其他
3、高級語言不同的)。在C語言中對文件的存取是以字符(字節)為單位的。輸入輸出的數據流的開始和結束僅受程序控制而不受物理符號(如回車換行符)控制。也就是說,在輸出時不會自動增加回車換行符以作為記錄結束的標志,輸入時不以回車換行符作為記錄的間隔(事實上C文件并不由記錄構成)。把這種文件稱為流式文件。C語言允許對文件存取一個字符,這就增加了處理的靈活性。在過去使用的C版本(如UNIX系統下使用的C)有兩種對文件的處理方法:一種叫“緩沖文件系統”,一種叫“非緩沖文件系統”。所謂緩沖文件系統是指系統自動地在內存中為每一個正在使用的文件名開辟一個緩沖區。從內存向磁盤輸出數據必須先送到內存中的緩沖區,裝滿緩沖
4、區后才一起送到磁盤去。如果從磁盤向內存讀入數據,則一次從磁盤文件將一批數據輸入到內存緩沖區(充滿緩沖區),然后再從緩沖區逐個地將數據送到程序數據區(給程序變量)。緩沖區的大小由各個具體的C版本確定,一般為512字節。所謂“非緩沖文件系統”是指系統不自動開辟確定大小的緩沖區,而由程序為每個文件設定緩沖區。在UNIX系統下,用緩沖文件系統來處理文本文件,用非緩沖文件系統處理二進制文件。用緩沖文件系統進行的輸入輸出又稱為高級(或高層)磁盤輸入輸出(高層I/O),用非緩沖文件系統進行的輸入輸出又稱為低級(低層)輸入輸出系統。ANSI C標準決定不采用非緩沖文件系統,而只采用緩沖文件系統。即既用緩沖文件
5、系統處理文本文件,也用它來處理二進制文件。也就是將緩沖文件系統擴充為可以處理二進制文件。在C語言中,沒有輸入輸出語句,對文件的讀寫都是用庫函數來實現的。ANSI規定了標準輸入輸出函數,用它們對文件進行讀寫。13.2 文件類型指針緩沖文件系統中,關鍵的概念是“文件指針”。每個被使用的文件都在內存中開辟一個區,用來存放文件的有關信息(如文件的名字、文件狀態及文件當前位置等)。這些信息是保存在一個結構體變量中的。該結構體類型是由系統定義的,取名為FILE。13.3 文件的打開與關閉13.3.1 文件的打開(fopen函數)文件使用方式含義“r”(只讀)為輸入打開一個文本文件“w”(只寫)為輸出打開一
6、個文本文件“a”(追加)向文本文件尾增加數據“rb”(只讀)為輸入打開一個二進制文件“wb”(只寫)為輸出打開一個二進制文件“ab”(追加)向二進制文件尾增加數據“r+”(讀寫)為讀/寫打開一個文本文件“w+”(讀寫)為讀/寫簡歷一個新的文本文件“a+”(讀寫)為讀/寫打開一個文本文件“rb+”(讀寫)為讀/寫打開一個二進制文件“wb+”(讀寫)為讀/寫建立一個新的二進制文件“ab+”(讀寫)為讀/寫打開一個二進制文件說明:(1)用“r”方式打開的文件只能用于向計算機輸入而不能用作向該文件輸出數據,而且該文件應該已經存在,不能用“r”方式打開一個并不存在的文件(即輸入文件),否則出錯。(2)用
7、“w”方式打開的文件只能用于向該文件寫數據(即輸出文件),而不能用來向計算機輸入。如果原來不存在該文件,則在打開時新建立一個以指定的名字命名的文件。如果原來已存在一個以該文件名命名的文件,則在打開時將該文件刪去,然后重新建立一個新文件。(3)如果希望向文件末尾添加新的數據(不希望刪除原有數據),則應該用“a”方式打開。但此時該文件必須已存在,否則將得到出錯信息。打開時,位置指針移到文件末尾。(4)用“r+”、“w+”、 “a+”方式打開的文件既可以用來輸入數據,也可以用來輸出數據。用“r+”方式時該文件應該已經存在,以便能向計算機輸入數據。用“w+”方式則新建立一個文件,先向此文件寫數據,然后
8、可以讀此文件中的數據。用“a+”方式打開的文件,原來的文件不被刪去,位置指針移到文件末尾,可以添加,也可以讀。(5)如果不能實現“打開”的任務,fopen函數將會帶回一個出錯信息。出錯的原因可能是用“r”方式打開一個并不存在的文件;磁盤出故障;磁盤已滿無法建立新文件等。此時fopen函數將帶回一個空指針值NULL。(6)在向計算機輸入文本文件時,將回車換行符轉換為一個換行符,在輸出時把換行符轉換成為回車和換行兩個字符。在用二進制文件時,不進行這種轉換,在內存中的數據形式與輸出到外部文件中的數據形式完全一致,一一對應。(7)在程序開始運行時,系統自動打開3個標準文件:標準輸入、標準輸出、標準出錯
9、輸出。這3個文件都與終端相聯系。因此以前所用到的從終端輸入或輸出都不需要打開終端文件。系統自動定義了3個文件指針stdin、stdout和stderr,分別指向終端輸入、終端輸出和標準出錯輸出(也從終端輸出)。如果程序中指定要從stdin所指的文件輸入數據,就是指從終端鍵盤輸入數據。13.3.2 文件的關閉(fclose函數)在使用完一個文件后應該關閉它,以防止它再被誤用?!瓣P閉”就是使文件指針變量不指向該文件,也就是文件指針變量與文件“脫鉤”,以后不能再通過該指針對原來與其相聯系的文件進行讀寫操作。除非再次打開,使該指針變量重新指向該文件。13.4 文件的讀寫13.4.1 文本文件的讀寫1、
10、寫字符函數fputc和讀字符函數fgetc例13.1從鍵盤輸入一些字符,逐個把它們送到磁盤上去,直到輸入一個“#”為止例13.2將一個磁盤文件中的信息復制到另一個磁盤文件中2、寫字符串函數fputs和讀字符串函數fgets例13.3將學生數據,由鍵盤輸入并存儲到磁盤文件中例13.4從上例文件中讀取學生數據,并顯示在屏幕上3、格式化寫函數fprintf和格式化讀函數fscanf例13.5將學生數據,由鍵盤輸入并存儲到磁盤文件中例13.6從上例文件中讀取學生數據,并顯示在屏幕上13.4.2 二進制文件的讀寫1、fread函數和fwrite函數例13.7從鍵盤輸入4個學生數據,然后把它們轉存到磁盤文
11、件上去,然后再從磁盤文件中一次性讀入內存并顯示出來13.5 文件的定位文件中有一個位置指針,指向當前讀寫的位置。如果順序讀寫一個文件,每次讀寫一個字符,則讀寫完一個字符后,該位置指針自動移動指向下一個字符位置。如果想改變這樣的規律,強制使位置指針指向其他指定的位置,可以用后面介紹的有關函數。13.5.1 rewind函數rewind函數的作用是使位置指針重新返回文件的開頭,此函數沒有返回值。例13.8有一個磁盤文件,第一次將它的內容顯示在屏幕上,第二次把它復制到另一文件上13.5.2 fseek函數和隨機讀寫對流式文件可以進行順序讀寫,也可以進行隨機讀寫,關鍵在于控制文件的位置指針。如果位置指
12、針是按字節位置順序移動的,就是順序讀寫;如果能將位置指針按需要移動到任意位置,就可以實現隨機讀寫。所謂隨機讀寫,是指讀寫完上一個字符(字節)后,并不一定要讀寫其后的字符(字節),而可以讀寫文件中任意位置上所需要的字符(字節)。用fseek函數可以實現改變文件的位置指針。例13.9在磁盤文件上存有10個學生的數據。要求將第1、3、5、7、9個學生數據輸入計算機,并在屏幕上顯示出來13.5.3 ftell函數ftell函數的作用是得到流失文件中的當前位置,用相對于文件開頭的位移量來表示。由于文件中的位置指針經常移動,往往不容易知道其當前位置。用ftell函數可以得到當前位置。13.6 出錯的檢測1
13、3.6.1 ferror函數13.6.2 clearerr函數13.7 文件輸入輸出小結分類分類函數名函數名功能功能打開文件打開文件fopen()打開文件打開文件關閉文件關閉文件fclose()關閉文件關閉文件文件定位文件定位fseek()改變文件位置指針的位置改變文件位置指針的位置rewind()使文件位置指針重新置于文件開頭使文件位置指針重新置于文件開頭ftell()返回文件位置指針的當前值返回文件位置指針的當前值文件讀寫文件讀寫fgetc(), getc()從指定文件取得一個字符從指定文件取得一個字符fputc(), putc()把字符輸出到指定文件把字符輸出到指定文件fgets()從指
14、定文件讀取字符串從指定文件讀取字符串fputs()把字符串輸出到指定文件把字符串輸出到指定文件getw()從指定文件讀取一個字從指定文件讀取一個字(int型型)putw()把一個字把一個字(int型型)輸出到指定文件輸出到指定文件fread()從指定文件中讀取數據項從指定文件中讀取數據項fwrite()把數據項寫到指定文件把數據項寫到指定文件fscanf()從指定文件按格式輸入數據從指定文件按格式輸入數據fprintf()按指定格式將數據寫到指定文件中按指定格式將數據寫到指定文件中文件狀態文件狀態feof()若到文件末尾,函數值為若到文件末尾,函數值為“真真”(非非0)ferror()若對文件操作出錯,函數值為若對文件操作出錯,函數值為“真真”(非非0)clearerr()使使ferror和和feof函數值置零函數值置零習題13.4 從鍵盤輸入一個字符串,將其中的小寫字母全部轉換成大寫字母,然后輸出到一個磁盤文件“test”中保存。輸入的字符以“!”結束。13.5 有兩個磁盤文件“A”和“B”,各存放一行字母,今要求把這兩個文件中的信息合并(按字母順序排列),輸出到一個新文件“C”中去。13.
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯系上傳者。文件的所有權益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網頁內容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
- 4. 未經權益所有人同意不得將文件中的內容挪作商業或盈利用途。
- 5. 人人文庫網僅提供信息存儲空間,僅對用戶上傳內容的表現方式做保護處理,對用戶上傳分享的文檔內容本身不做任何修改或編輯,并不能對任何下載內容負責。
- 6. 下載文件中如有侵權或不適當內容,請與我們聯系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- c語言機考考試題及答案
- 2025年投資學考研試題及答案
- 抖店內衣考試題庫及答案
- 現代網絡存儲技術試題及答案
- 西方政治制度與社會責任試題及答案
- 學習機電工程考試中的含金量知識試題及答案
- 2024年片劑機械資金籌措計劃書代可行性研究報告
- 網絡工程師技能提升建議試題及答案
- 西方政治制度對原住民權利的影響試題及答案
- 輕松應對2025年網絡工程師試題及答案
- 上海韻達java面試題及答案
- GB/T 196-2025普通螺紋基本尺寸
- 清掃保潔綠化養護 投標方案(技術標 )
- 血橙生產技術規程
- JJF 1702-2018α、β平面源校準規范
- GB/T 8626-2007建筑材料可燃性試驗方法
- GB/T 19929-2014土方機械履帶式機器制動系統的性能要求和試驗方法
- GB 2714-2015食品安全國家標準醬腌菜
- 烏魯木齊租房合同范本
- 導數在經濟中的應用課件
- 遼寧省錦州市招考引進“雙一流”建設高校和部分重點高校急需專業屆畢業生到市屬事業單位工作模擬試卷【共500題附答案解析】
評論
0/150
提交評論