第7章文件和結(jié)構(gòu)體(C++版)_第1頁(yè)
第7章文件和結(jié)構(gòu)體(C++版)_第2頁(yè)
免費(fèi)預(yù)覽已結(jié)束,剩余6頁(yè)可下載查看

下載本文檔

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

文檔簡(jiǎn)介

1、第7章 文件和結(jié)構(gòu)體(c+版) 第七章 文件 與 結(jié)構(gòu)體文件是依據(jù)特定的目的而收集在一起的有關(guān)數(shù)據(jù)的集合。c+把每一個(gè)文件都 看成是一個(gè)有序的字節(jié)流,每個(gè)文件都以文件結(jié)束標(biāo)志結(jié)束,假如要操作某個(gè)文件, 程序必需首先打開該文件。當(dāng)一個(gè)文件被打開后,該文件就和一個(gè)流關(guān)聯(lián)起來,這 里的流實(shí)際上是一個(gè)字節(jié)序列。 c+將文件分為文本文件和二進(jìn)制文件。二進(jìn)制文件一般含有特別的格式或計(jì) 算機(jī)代碼,如圖文件和可執(zhí)行文件等。文本文件則是可以用任何文字處理程序閱讀 和編輯的簡(jiǎn)潔ascii文件。 下面我們學(xué)習(xí)如何編寫c+代碼來實(shí)現(xiàn)對(duì)文本文件的輸入和輸出。 第一節(jié) 文件操作 c+語(yǔ)言供應(yīng)了一批用于文件操作的標(biāo)準(zhǔn)函數(shù),

2、本節(jié)不是 介紹文件打開函數(shù)fopen,而是介紹另一個(gè)函數(shù)freopen,它 們都包含于標(biāo)準(zhǔn)庫(kù)cstdio中,文件操作基本步驟如下: (1)打開文件,將文件指針指向文件,打算打開文件類型; (2)對(duì)文件進(jìn)行讀、寫操作; (3)在使用完文件后,關(guān)閉文件。 一、重定向版【命令格式】 file * freopen ( const char * filename, const char * mode, file * stream ); 【參數(shù)說明】 filename: 要打開的文件名 mode: 文件打開的模式,和fopen中的模式(r/w)相同 stream: 文件指針,通常使用標(biāo)準(zhǔn)流文件(stdin

3、/stdout/stderr)其中stdin是標(biāo)準(zhǔn)輸入流,默認(rèn)為鍵盤;stdout是標(biāo)準(zhǔn)輸出流,默認(rèn)為屏幕; stderr是標(biāo)準(zhǔn)錯(cuò)誤流,一般把屏幕設(shè)為默認(rèn)。通過調(diào)用freopen,就可以修改標(biāo)準(zhǔn) 流文件的默認(rèn)值,實(shí)現(xiàn)重定向。 【使用方法】 由于文件指針使用的是標(biāo)準(zhǔn)流文件,因此我們可以不定義文件指針。接下來我們使用 freopen()函數(shù)以只讀方式r(read)打開輸入文件slyar.in。 格式:freopen(slyar.in, r, stdin); 然后使用freopen()函數(shù)以寫入方式w(write)打開輸出文件slyar.out。 格式:freopen(slyar.out, w, s

4、tdout); 接下來的事情就是使用freopen()函數(shù)的優(yōu)點(diǎn)了,我們不再需要修改scanf,printf,cin和 cout。而是維持代碼的原樣就可以了。由于freopen()函數(shù)重定向了標(biāo)準(zhǔn)流,使其指向前面 指定的文件,省時(shí)省力。最終只要使用fclose關(guān)閉輸入文件和輸出文件即可。 格式:fclose(stdin);fclose(stdout);若要恢復(fù)句柄,可以重新打開標(biāo)準(zhǔn)掌握臺(tái)設(shè)備文件,只是這個(gè)設(shè)備文件的名字是與操作 系統(tǒng)相關(guān)的。 格式:freopen(con, r, stdin); 代碼模版: #includecstdio /使用freopen語(yǔ)句,須調(diào)用cstdio庫(kù) int m

5、ain() freopen(slyar.in, r, stdin); freopen(slyar.out, w, stdout); /* 中間按原樣寫代碼,什么都不用修改 */ fclose(stdin);fclose(stdout); return 0; 例9.1 從in.txt文件中讀入數(shù)據(jù),把它們的和保存out.txt文件中。 #includecstdio int main() freopen(in.txt,r,stdin); /定義輸入文件名 freopen(out. txt,w,stdout); /定義輸出文件名 int temp,sum=0; while (scanf(%d,tem

6、p)=1) /(cintemp)從輸入文件中讀入數(shù)據(jù) /在c+中非0為真 sum=sum+temp; printf(%dn,sum); / coutsumendl; fclose(stdin);fclose(stdout); /關(guān)閉文件,可省略 return 0; in.txt數(shù)據(jù): 1 2 3 4 5 out.txt結(jié)果: 15 說明: while (fintemp)和(scanf(%d,temp)=1)主要是用于推斷數(shù)據(jù)是否已經(jīng)讀完,以 便準(zhǔn)時(shí)終止循環(huán)。還可以用成員函數(shù)eof來推斷是否達(dá)到數(shù)據(jù)流的末尾。對(duì)scanf、printf 和cin、cout語(yǔ)句都適用。 二、fopen版 重定向用起

7、來很便利,但并不是全部算法競(jìng)賽都允許讀寫文件。甚 至有的競(jìng)賽允許訪問文件,但不允許使用freopen這樣的重定向方式讀 寫文件,可以使用fopen版,對(duì)scanf和printf語(yǔ)句適用。程序如下:#includecstdio using namespace std; int main() file *fin,*fout; fin = fopen(in.txt,rb); fout = fopen(out.txt,wb); int temp,sum=0; while (fscanf(fin,%d,temp)=1) sum=sum+temp; fprintf(fout,%dn,sum); fclos

8、e(fin);fclose(fout); return 0; /定義輸入文件名 /定義輸出文件名 /從輸入文件中讀入數(shù)據(jù) / coutsumendl; /關(guān)閉文件,可省略 先聲明變量fin和fout(暫且不用管file *為何物),把scanf改成fscanf,第 一個(gè)參數(shù)為fin;把printf改成fprintf,第一個(gè)參數(shù)為fout,最終執(zhí)行fclose,關(guān)閉 兩個(gè)文件。重定向和fopen兩種方法各有優(yōu)劣。重定向的方法寫起來簡(jiǎn)潔、自然,但是不 能同時(shí)讀寫文件和標(biāo)準(zhǔn)輸入輸出;fopen的寫法稍顯繁瑣,但是敏捷性比較大(例 如可以反復(fù)打開并讀寫文件)。順便說一句,如 果把fopen版的程序改成

9、讀寫標(biāo) 準(zhǔn)輸入輸出,只需賦值fin=stdin;fout=stdout;即可,不要調(diào)用fopen和fclose。 程序如下: #includecstdio using namespace std; int main() file *fin,*fout; fin=stdin; fout=stdout; /* 本處語(yǔ)句同上 */ fprintf(fout,%dn,sum); return 0; 三、文件輸入輸出流在c+中,文件輸入流(ifstream)和文件輸出流(ofstream)的類,它們的 默認(rèn)輸入輸出設(shè)備都是磁盤文件。c+可以在創(chuàng)建對(duì)象時(shí),設(shè)定輸入或輸 出到哪個(gè)文件。由于這些類的定義是在f

10、stream中進(jìn)行的,因此,在使用這 此類進(jìn)行輸入輸出操作時(shí),必需要在程序的首部利用#include指令包進(jìn) fstream頭文件。 例如:若想用fin作為輸入對(duì)象,fout作為輸出對(duì)象,則可以使用如下 定義: ifstream fin(輸入文件名.擴(kuò)展名); ofstream fout(輸出文件名.擴(kuò)展名); 程序如下: #includefstream /使用文件輸入輸出流,對(duì)cin、cout語(yǔ)句適用 using namespace std; int main() ifstream fin(in.txt); /定義輸入文件名 ofstream fout(out.txt); /定義輸出文件名

11、int temp,sum=0; while (fintemp) sum=sum+temp; /從輸入文件中讀入數(shù) 據(jù) foutsumendl; fin.close();fout.close(); /關(guān)閉文件,可省略 return 0; 假如想再次使用cin和cout,是否要逐個(gè)把程序中的全部fin和fout替換為cin和cout? 不用這么麻煩,只需要把fin和fout的聲明語(yǔ)句去掉,并加上這樣兩行即可: #define fin cin #define fout cout 用條件編譯,還可以讓程序在本機(jī)上讀寫標(biāo)準(zhǔn)輸入輸出,競(jìng)賽測(cè)試時(shí)讀寫文件(請(qǐng)讀 者自行試驗(yàn))。 其次節(jié) 結(jié)構(gòu)體在實(shí)際問題中,一

12、組數(shù)據(jù)往往具有不同的數(shù)據(jù)類型。 例如,人口大普查時(shí),我們需要記錄每一位公民的 姓名,年齡,性別,住址,身份證號(hào)碼。這些信息 分別要用整型,字符型,字符串型來記錄。為了解 決問題,c+語(yǔ)言給出了另一種構(gòu)造數(shù)據(jù)類型 “結(jié)構(gòu)體”,它在數(shù)據(jù)存儲(chǔ)方面相當(dāng)于其他高級(jí)語(yǔ)言 中的記錄,但它有著面對(duì)對(duì)象的優(yōu)勢(shì)。 7.2.1 結(jié)構(gòu)體定義和操作 1. 定義結(jié)構(gòu)體及結(jié)構(gòu)體變量 結(jié)構(gòu)體變量的定義有兩種方式: 定義結(jié)構(gòu)體的同時(shí)定義結(jié)構(gòu)體變量 struct 結(jié)構(gòu)體名 /其中 struct 是關(guān)鍵字 成員表 /可以有多個(gè)成員 成員函數(shù) /可以有多個(gè)成員函數(shù),也可以沒有 結(jié)構(gòu)體變量表; /可以同時(shí)定義多個(gè)結(jié)構(gòu)體變量結(jié)構(gòu)體變量名

13、列表的各個(gè)變量用“,”隔開。 例如: struct data int a2; /成員為一個(gè)數(shù)組 int c; data_a,data_b; 當(dāng)然,我們也可以先定義結(jié)構(gòu)體再定義結(jié)構(gòu)體變量 struct 結(jié)構(gòu)體名 成員表 成員函數(shù) ; 結(jié)構(gòu)體名 結(jié)構(gòu)體變量表;/同樣可以同時(shí)定義多個(gè)結(jié)構(gòu)體變量 例如: struct data int a2; int c; ; data data_a,data_b;/這種定義方式與上一種方式的效果是相同的 在定義結(jié)構(gòu)體變量時(shí)留意,結(jié)構(gòu)體變量名和結(jié)構(gòu)體名不能相同。在定 義結(jié)構(gòu)體時(shí),系統(tǒng)對(duì)之不安排實(shí)際內(nèi)存。只有定義結(jié)構(gòu)體變量時(shí),系統(tǒng)才 為其安排內(nèi)存。 2.成員調(diào)用 結(jié)構(gòu)體

14、變量與各個(gè)成員之間引用的一般形式為: 結(jié)構(gòu)體變量名. 成員名 對(duì)于上面定義的結(jié)構(gòu)體變量,我們可以這樣操作: cindata_a.a0data_a.a1; /一般狀況下不能寫 cindata_a; int a=data_a.a0+data_a.a1; /就像用整形變量一樣用a0、a1 data_b=data_a; /結(jié)構(gòu)體之間的相互賦值是合法的 data_a.c=0; /就猶如給整形變量賦值 實(shí)際上結(jié)構(gòu)體成員的操作與該成員類型所具有的操作是全都的。 成員運(yùn)算符“.”在存取成員數(shù)值時(shí)使用,其優(yōu)先級(jí)最高,并具有左結(jié)合 性。在處理包含結(jié)構(gòu)體的結(jié)構(gòu)體時(shí),可記作: strua. strub. membb

15、這說名結(jié)構(gòu)體變量 strua 有結(jié)構(gòu)體成員 strub;結(jié)構(gòu)體變量 strub 有 成員 membb。 3.成員函數(shù)調(diào)用 結(jié)構(gòu)體成員函數(shù)調(diào)用的一般形式為: 結(jié)構(gòu)體變量名. 成員函數(shù) 結(jié)構(gòu)體成員函數(shù)默認(rèn)將結(jié)構(gòu)體變量作為引用參數(shù)。 7.2.2 結(jié)構(gòu)體操作實(shí)例 現(xiàn)在,我們先定 義一個(gè)簡(jiǎn)潔的結(jié)構(gòu)體,這個(gè)結(jié)構(gòu)體將用來記錄一個(gè) 同學(xué)的大致狀況,所以它的成員應(yīng)當(dāng)有學(xué)號(hào)、姓名、性別、年齡、成果、 家庭住址等。#includeiostream using namespace std; struct student int num; /學(xué)號(hào) char name21; /姓名 char sex; /性別 int a

16、ge; /年齡 float score; /成果 char address51; /家庭住址 ; /此處不行忽視分號(hào) struct student a,b; int main() cina.numa.sexa.agea.scorea.address; cinb.numb.sexb.ageb.scoreb.address; couta.num' '' 'a.sex' 'a.age' 'a.score' 'a.addressendl; coutb.num' '' 'b.sex'

17、'b.age' 'b.score' 'b.addressendl; return 0; 這里再舉出一個(gè)的例子,盼望競(jìng)賽學(xué)子能夠舉一反三,從中受益。 #includeiostream using namespace std; struct data int a2; /成員為一個(gè)數(shù)組 int c; /用來計(jì)算總和 int max() /定義成員函數(shù) return a0a1?a0:a1; /默認(rèn)該結(jié)構(gòu)體變量的成員作為引用參數(shù) data_a5; /我們可以定義結(jié)構(gòu)體數(shù)組 /*結(jié)構(gòu)體的初始化,按成員定義的挨次賦值,每個(gè)成員用“,”隔開*/ data data_b=15,20,35; /*每個(gè)成員初始化和同類型變量初 始化方式相同*/ int main() coutdata_b.max()endl; for (int i=0;i5;+i) cindata_ai.a0data_ai.a1; data_ai.c=data_ai.a0+data_ai.a1; for (int i=0;i5;+i) coutdata_ai

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝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ù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 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)論