第12章文件處理_第1頁
第12章文件處理_第2頁
第12章文件處理_第3頁
第12章文件處理_第4頁
第12章文件處理_第5頁
已閱讀5頁,還剩21頁未讀, 繼續(xù)免費閱讀

下載本文檔

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

文檔簡介

1、12.1 概述12.2 文件和流12.3 順序文件的訪問12.4 隨機文件的訪問第12章 文件處理 文件一般指存儲在外部介質(zhì)上的數(shù)據(jù)集合,操作系統(tǒng)以文件為單位對數(shù)據(jù)進行管理。磁盤上的文件稱為磁盤文件。對磁盤文件的輸入/輸出簡稱為文件I/O。 C+語言中沒有文件輸入/輸出語句,對文件的讀寫是用流或C+的庫函數(shù)來實現(xiàn)。 在C+語言中,用擴展名h表示頭文件,用擴展名cpp表示源程序文件,用擴展名obj表示程序文件被編譯后生成的目標文件,用擴展名exe表示連接目標文件后形成的可執(zhí)行文件。對于用戶建立的用于保存數(shù)據(jù)的文件,通常用dat作擴展名,若它是由字符構成的文本文件,則可用txt作為擴展名。 在C+

2、中,按存儲格式可以把文件分為兩種類型:ASCII碼文件或文本文件;內(nèi)部格式文件或二進制文件。兩種存儲格式所占用的存儲空間不同。用ASCII碼形式輸出與字符一一對應,一個字節(jié)代表一個字符。用二進制形式輸出數(shù)據(jù),可以節(jié)省外存空間和轉換時間,但一個字節(jié)并不對應一個字符,不能直接輸出字符形式。 根據(jù)存取方式可以把文件分為順序存取文件和隨機存取文件。 12.1 概述12.2.1 打開文件12.2.2 關閉文件12.2 文件和流 打開文件操作包括建立文件流對象,與外部文件關聯(lián),指定文件的打開方式。打開文件有兩種方式: (1)首先建立流對象,然后調(diào)用函數(shù)open連接外部文件。格式為: 流類 對象名; 對象名

3、.open(文件名,方式); (2)調(diào)用流類帶參數(shù)的構造函數(shù),建立流對象的同時連接外部文件。語句格式為: 流類 對象名(文件名,方式); 其中,“流類”是流類庫中定義的文件流類,ifstream用于讀方式打開文件,ofstream用于寫方式打開文件,而fstream用于讀/寫方式打開文件?!胺绞健笔莍os定義的標識常量,表示文件的打開。 open函數(shù)的函數(shù)原型為:void open( const char* szName, int nMode, int nProt = filebuf:openprot ); 其中,“szName”是文件名,它可包含驅動器符和路徑說明;“nMode”說明文件打開

4、方式,表12.1給出了nMode的取值范圍。12.2.1 打開文件選 項ios:app添加模式,所有新數(shù)據(jù)都寫入文件尾部ios:ate打開文件時文件指針定位到文件尾,如果程序移動了文件指針,就把數(shù)據(jù)寫入當前位置ios:in打開文件進行讀操作,文件不存在時出錯ios:out打開文件進行寫操作,如文件已存在則更新該文件ios:trunc如果文件已存在則清空原文件ios:nocreate打開一個已經(jīng)存在的文件,如果文件不存在則打開失敗ios:noreplace打開一個不存在的文件,如果文件存在則打開失敗ios:binary二進制文件(非文本文件)表12.1 文件打開方式 關閉文件操作主要是將緩沖區(qū)數(shù)

5、據(jù)完整地寫入文件,添加文件結束標志,使文件流與對應的物理文件斷開聯(lián)系。關閉文件時,調(diào)用fstream的成員函數(shù)close()?!纠?2.1】打開文件和關閉文件舉例。#include iostream.h#include fstream.hvoid main() ofstream outfile(d:f1.txt,ios:out);if(!outfile) cerr打開文件錯誤!endl;else outfile120endl; outfile310.65endl; outfile.close(); 12.2.2 關閉文件程序執(zhí)行結果為在D盤上建立f1.txt文件,文件內(nèi)容為:120310.65

6、12.3.1 建立順序文件12.3.2 讀取順序文件中的數(shù)據(jù)12.3.3 更新順序文件中的數(shù)據(jù)12.3 順序文件的訪問 如果對文件的操作總是從文件指針位置開始順序向后移動,就稱之為順序文件。 1建立文本文件 文件打開后,就可以用文件流對象和插入操作符向文件中寫入數(shù)據(jù)。其使用方法與標準I/O完全類似。例如: outputfileThis is the beginning of file I/Oendl; 可根據(jù)需要打開不同模式的文件,例如:fstream outputfile;outputfile.open(test.dat,ios:out|ios:in); /輸入輸出文件fstream out

7、putfile;outputfile.open(test.dat,ios:out|ios:binary); /二進制輸出文件fstream outputfile(test.dat,ios:app); /添加方式輸出文件12.3.1 建立順序文件【12.2】使用操作器、設置標志位和成員函數(shù)向輸出文件中輸出文本。#include #include #include void main(void)fstream output;output.open(d:datatest.dat,ios:out);if(output.fail() cerrCan not open test.datendl; /打開文

8、件錯誤時,給出錯誤提示 abort(); /終止程序運行outputsetiosflags(ios:left)setw(13)Namesetw(10)Class“setw(10)Ageendl;outputsetiosflags(ios:left)setw(13)Zhang san“setw(10)10setw(10)21endl;outputsetiosflags(ios:left)setw(13)Li Sisetw(10)10setw(10)19endl;outputsetiosflags(ios:left)setw(13)Wang Wusetw(10)10setw(10)20endl;o

9、utputsetiosflags(ios:left)setw(13)Zhao Liusetw(10)10setw(10)22endl;for(char ch=a;ch=z;ch+) output.put(ch);output.write(n1234567890,11);output.close();輸出到d:datatest.dat文件中的數(shù)據(jù)為:NameClassAge Zhang San1021 Li Si1019 Wang Wu1020 Zhao Liu1022 abcdefghijklmnopqrstuvwxyz1234567890 2建立二進制文件 當程序對文件中數(shù)據(jù)讀寫速度要求很高

10、時,用二進制文件比較合適。例如大量讀寫浮點數(shù)、整數(shù)或數(shù)據(jù)結構。 為執(zhí)行二進制文件操作,必須首先使用ios:binary模式指示符打開文件。下面的語句為二進制輸出在當前路徑中打開名為binary_data的文件: fstream outfile(binary_data.dat,ios:out|ios:binary); 應使用read和write成員函數(shù)來執(zhí)行二進制文件的輸入輸出操作。不能使用插入操作符向二進制文件中輸入/輸出數(shù)據(jù),否則可能會遇到莫名其妙的錯誤,得不到正確的結果?!?2.3】打開一個二進制文件并向其中寫入數(shù)據(jù)。#include #include void main(void)fst

11、ream output;output.open(d:databinary_data.dat,ios:out|ios:binary);if(!output)cerrCan not open binary_data.datendl;abort();double x=3.1415926,6.2831852,9.4247778,12.5663704,15.707963;for(int i=0;i5;i+)output.write(char*)&xi,sizeof(double); /write成員函數(shù)output.close();1讀取文本文件 【12.4】讀取文件內(nèi)容到顯示器。#includ

12、e #include void main(void)fstream input(d:datatest.dat,ios:in);if(input.fail()cerrCan not open test.datendl;abort();while(!input.eof()cout.put(char)input.get();12.3.2 讀取順序文件中的數(shù)據(jù)2讀取二進制文件【12.5】讀寫二進制文件。該程序先打開輸入文件,在文件中輸入二進制數(shù)據(jù),關閉文件。然后再打開該文件,從中讀取二進制數(shù)據(jù)并顯示在屏幕上。#include #include #include void main(void)fstre

13、am output;output.open(d:databinary_data.dat,ios:out|ios:binary);if(!output)cerrCan not open binary_data.datendl;abort();double x=3.1415926,6.2831852,9.4247778,12.5663704,15.707963;for(int i=0;i5;i+)output.write(char*)&xi,sizeof(double);output.close();fstream input(d:databinary_data.dat,ios:in|io

14、s:binary);double z5;if(input.fail()cerrCan not open binary_data.datendl;abort();for(i=0;i5;i+)input.read(char*)&zi,sizeof(double);coutsetprecision(10)ziendl;input.close();運行程序,輸出結果為:3.14159266.28318529.424777812.566370415.707963 對于一個已經(jīng)存在的文件,可以用添加的方式修改文件的內(nèi)容。例如,有一份學生成績單,需要在后面追加一些記錄。文件打開模式為: fstrea

15、m outapp(d:datatest.dat,ios:app); /數(shù)據(jù)始終輸出到文件尾部 fstream outapp(d:datatest.dat,ios:ate); /數(shù)據(jù)輸出到尾部,文件指針可移動 fstream outapp(d:datatest.dat,ios:trunc); /刪除文件中存在的數(shù)據(jù),輸出新數(shù)據(jù) 12.3.3 更新順序文件中的數(shù)據(jù)12.4.1 建立隨機文件12.4.2 讀取隨機文件中的數(shù)據(jù)12.4.3 數(shù)據(jù)寫入隨機文件12.4 隨機文件的訪問 程序讀寫完一個數(shù)據(jù)后,通過移動文件指針,讀寫文件中其他位置的數(shù)據(jù)。這就是所謂的隨機訪問文件。如果同時為讀寫操作打開文件,程

16、序就可將讀文件指針移到一個位置,而將寫文件指針移向另一位置,二者互不干擾。 對于隨機文件,可以按任何順序進行讀寫操作。所以,隨機文件特別適合于對二進制文件的操作。 使用seekg和seekp兩個重載成員函數(shù)控制文件指針。seekg用于輸入文件,seekp用于輸出文件。seekg函數(shù)和seekp函數(shù)的格式如下: seekg(offset,dir);或 seekg(pos); seekp(offset,dir);或 seekp(pos); 其中,offset參數(shù)指定了新的位移值(以字節(jié)為單位),為long型;pos參數(shù)指定文件指針的新位置;dir參數(shù)指定了文件中讀位移量的起始位置,必須是下列枚舉值

17、之一: ios:beg:從文件起始位置開始。 ios:cur:從當前文件指針位置開始。 ios:end:從文件結束位置開始。12.4.1 建立隨機文件 例如: iuput.seekg(250L,ios:beg); /將讀取文件指針移到離文件開頭250個字節(jié)處 output.seekp(20L,ios:cur); /將寫入文件指針移到離文件開頭20個字節(jié)處 input.seekg(-30L,ios:end); /將讀取文件指針移到離文件末30個字節(jié)處 另外,隨機文件有時需要確定文件指針的當前位置,可以使用tellg()和tellp()兩個成員函數(shù)獲取文件指針的當前位置,返回值為從文件起始位置開始

18、到當前位置的字節(jié)總數(shù)。 用open成員函數(shù)或文件流的構造函數(shù)打開文件,用seekg和seekp調(diào)整文件指針,就可進行隨機文件的存取。 【12.6】隨機文件的建立和存取。假定有10名學生的姓名、學號、年齡、性別、總成績等數(shù)據(jù),假定需要讀取第1、3、5、7、9個學生的數(shù)據(jù)。#include #include struct student_infochar name20;int num;int age;char sex;double score;void main(void)student_info cls1=zhao,1,20,M,290.5,qian,2,19,M,282.5,sun,3,20,

19、F,288.5,li,4,21,M,275.5,zhou,5,22,M,256.5,wu,6,20,F,289.5,zheng,7,19,M,265.5,wang,8,20,F,278.5,feng,9,21,F,268.5,chen,10,20,F,287.5,;fstream inout(random.dat,ios:out|ios:in|ios:binary);if(!inout)cerrCan not open random.datendl;abort();for(int i=0;i10;i+) inout.write(char*)&cls1i,sizeof(cls1i);st

20、udent_info cls210;for(i=0;i10;i+=2)inout.seekg(i*sizeof(cls1i),ios:beg);inout.read(char*)&cls2i,sizeof(cls2);tcls2i.numtcls2i.agetcls2i.sextcls2i.scoretendl;inout.close();運行程序,輸出結果為:zhao120M290.5,sun320F288.5,zhou522M256.5,zheng719M265.5,feng921F268.5, 【12.7】在一個文件中存入一串整型數(shù)據(jù),根據(jù)屏幕提示輸入

21、序號,顯示文件指針的位置和數(shù)據(jù)。#include #include void main(void)fstream inout(random_r.dat,ios:out|ios:in|ios:binary);if(!inout)cerrCan not open random_r.datendl;abort();for(int i=0;i100;i+)12.4.2 讀取隨機文件中的數(shù)據(jù)inout.write(char*)&i,sizeof(int);int n,m;coutPlease type in a number:between 0-99n;inout.seekg(n*sizeof(int),ios:beg);coutThe positon of file pointer after read is

溫馨提示

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

評論

0/150

提交評論