版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報或認(rèn)領(lǐng)
文檔簡介
1、第7章 文件和結(jié)構(gòu)體(c+版) 第七章 文件 與 結(jié)構(gòu)體文件是依據(jù)特定的目的而收集在一起的有關(guān)數(shù)據(jù)的集合。c+把每一個文件都 看成是一個有序的字節(jié)流,每個文件都以文件結(jié)束標(biāo)志結(jié)束,假如要操作某個文件, 程序必需首先打開該文件。當(dāng)一個文件被打開后,該文件就和一個流關(guān)聯(lián)起來,這 里的流實際上是一個字節(jié)序列。 c+將文件分為文本文件和二進(jìn)制文件。二進(jìn)制文件一般含有特別的格式或計 算機(jī)代碼,如圖文件和可執(zhí)行文件等。文本文件則是可以用任何文字處理程序閱讀 和編輯的簡潔ascii文件。 下面我們學(xué)習(xí)如何編寫c+代碼來實現(xiàn)對文本文件的輸入和輸出。 第一節(jié) 文件操作 c+語言供應(yīng)了一批用于文件操作的標(biāo)準(zhǔn)函數(shù),
2、本節(jié)不是 介紹文件打開函數(shù)fopen,而是介紹另一個函數(shù)freopen,它 們都包含于標(biāo)準(zhǔn)庫cstdio中,文件操作基本步驟如下: (1)打開文件,將文件指針指向文件,打算打開文件類型; (2)對文件進(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)錯誤流,一般把屏幕設(shè)為默認(rèn)。通過調(diào)用freopen,就可以修改標(biāo)準(zhǔn) 流文件的默認(rèn)值,實現(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)點了,我們不再需要修改scanf,printf,cin和 cout。而是維持代碼的原樣就可以了。由于freopen()函數(shù)重定向了標(biāo)準(zhǔn)流,使其指向前面 指定的文件,省時省力。最終只要使用fclose關(guān)閉輸入文件和輸出文件即可。 格式:fclose(stdin);fclose(stdout);若要恢復(fù)句柄,可以重新打開標(biāo)準(zhǔn)掌握臺設(shè)備文件,只是這個設(shè)備文件的名字是與操作 系統(tǒng)相關(guān)的。 格式:freopen(con, r, stdin); 代碼模版: #includecstdio /使用freopen語句,須調(diào)用cstdio庫 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)時終止循環(huán)。還可以用成員函數(shù)eof來推斷是否達(dá)到數(shù)據(jù)流的末尾。對scanf、printf 和cin、cout語句都適用。 二、fopen版 重定向用起
7、來很便利,但并不是全部算法競賽都允許讀寫文件。甚 至有的競賽允許訪問文件,但不允許使用freopen這樣的重定向方式讀 寫文件,可以使用fopen版,對scanf和printf語句適用。程序如下:#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,第 一個參數(shù)為fin;把printf改成fprintf,第一個參數(shù)為fout,最終執(zhí)行fclose,關(guān)閉 兩個文件。重定向和fopen兩種方法各有優(yōu)劣。重定向的方法寫起來簡潔、自然,但是不 能同時讀寫文件和標(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; /* 本處語句同上 */ fprintf(fout,%dn,sum); return 0; 三、文件輸入輸出流在c+中,文件輸入流(ifstream)和文件輸出流(ofstream)的類,它們的 默認(rèn)輸入輸出設(shè)備都是磁盤文件。c+可以在創(chuàng)建對象時,設(shè)定輸入或輸 出到哪個文件。由于這些類的定義是在f
10、stream中進(jìn)行的,因此,在使用這 此類進(jìn)行輸入輸出操作時,必需要在程序的首部利用#include指令包進(jìn) fstream頭文件。 例如:若想用fin作為輸入對象,fout作為輸出對象,則可以使用如下 定義: ifstream fin(輸入文件名.擴(kuò)展名); ofstream fout(輸出文件名.擴(kuò)展名); 程序如下: #includefstream /使用文件輸入輸出流,對cin、cout語句適用 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,是否要逐個把程序中的全部fin和fout替換為cin和cout? 不用這么麻煩,只需要把fin和fout的聲明語句去掉,并加上這樣兩行即可: #define fin cin #define fout cout 用條件編譯,還可以讓程序在本機(jī)上讀寫標(biāo)準(zhǔn)輸入輸出,競賽測試時讀寫文件(請讀 者自行試驗)。 其次節(jié) 結(jié)構(gòu)體在實際問題中,一
12、組數(shù)據(jù)往往具有不同的數(shù)據(jù)類型。 例如,人口大普查時,我們需要記錄每一位公民的 姓名,年齡,性別,住址,身份證號碼。這些信息 分別要用整型,字符型,字符串型來記錄。為了解 決問題,c+語言給出了另一種構(gòu)造數(shù)據(jù)類型 “結(jié)構(gòu)體”,它在數(shù)據(jù)存儲方面相當(dāng)于其他高級語言 中的記錄,但它有著面對對象的優(yōu)勢。 7.2.1 結(jié)構(gòu)體定義和操作 1. 定義結(jié)構(gòu)體及結(jié)構(gòu)體變量 結(jié)構(gòu)體變量的定義有兩種方式: 定義結(jié)構(gòu)體的同時定義結(jié)構(gòu)體變量 struct 結(jié)構(gòu)體名 /其中 struct 是關(guān)鍵字 成員表 /可以有多個成員 成員函數(shù) /可以有多個成員函數(shù),也可以沒有 結(jié)構(gòu)體變量表; /可以同時定義多個結(jié)構(gòu)體變量結(jié)構(gòu)體變量名
13、列表的各個變量用“,”隔開。 例如: struct data int a2; /成員為一個數(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)體變量表;/同樣可以同時定義多個結(jié)構(gòu)體變量 例如: struct data int a2; int c; ; data data_a,data_b;/這種定義方式與上一種方式的效果是相同的 在定義結(jié)構(gòu)體變量時留意,結(jié)構(gòu)體變量名和結(jié)構(gòu)體名不能相同。在定 義結(jié)構(gòu)體時,系統(tǒng)對之不安排實際內(nèi)存。只有定義結(jié)構(gòu)體變量時,系統(tǒng)才 為其安排內(nèi)存。 2.成員調(diào)用 結(jié)構(gòu)體
14、變量與各個成員之間引用的一般形式為: 結(jié)構(gòu)體變量名. 成員名 對于上面定義的結(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; /就猶如給整形變量賦值 實際上結(jié)構(gòu)體成員的操作與該成員類型所具有的操作是全都的。 成員運算符“.”在存取成員數(shù)值時使用,其優(yōu)先級最高,并具有左結(jié)合 性。在處理包含結(jié)構(gòu)體的結(jié)構(gòu)體時,可記作: 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)體操作實例 現(xiàn)在,我們先定 義一個簡潔的結(jié)構(gòu)體,這個結(jié)構(gòu)體將用來記錄一個 同學(xué)的大致狀況,所以它的成員應(yīng)當(dāng)有學(xué)號、姓名、性別、年齡、成果、 家庭住址等。#includeiostream using namespace std; struct student int num; /學(xué)號 char name21; /姓名 char sex; /性別 int a
16、ge; /年齡 float score; /成果 char address51; /家庭住址 ; /此處不行忽視分號 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; 這里再舉出一個的例子,盼望競賽學(xué)子能夠舉一反三,從中受益。 #includeiostream using namespace std; struct data int a2; /成員為一個數(shù)組 int c; /用來計算總和 int max() /定義成員函數(shù) return a0a1?a0:a1; /默認(rèn)該結(jié)構(gòu)體變量的成員作為引用參數(shù) data_a5; /我們可以定義結(jié)構(gòu)體數(shù)組 /*結(jié)構(gòu)體的初始化,按成員定義的挨次賦值,每個成員用“,”隔開*/ data data_b=15,20,35; /*每個成員初始化和同類型變量初 始化方式相同*/ 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等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 2024版星巴克加盟店設(shè)備維護(hù)合同
- 個人影視作品版權(quán)轉(zhuǎn)讓合同(2024版)3篇
- 2024示范文本:二手車買賣合同車輛安全檢測規(guī)范2篇
- 2024試乘試駕活動電子合同范本12篇
- 2025年度二手吊車評估與交易中介合同3篇
- 項目建議書(含設(shè)計任務(wù)書)及可行性研究報告編制技術(shù)咨詢合同模板
- 2025年度碼頭船舶??颗c貨物倉儲一體化租賃合同4篇
- 2025年度臨時醫(yī)療護(hù)理人員派遣服務(wù)合同4篇
- 2025年稅務(wù)顧問服務(wù)合同協(xié)議書適用于企業(yè)集團(tuán)6篇
- 眾維重工2025年度鋼結(jié)構(gòu)建筑工程智能化控制系統(tǒng)采購合同2篇
- 《穿越迷宮》課件
- 《C語言從入門到精通》培訓(xùn)教程課件
- 2023年中國半導(dǎo)體行業(yè)薪酬及股權(quán)激勵白皮書
- 2024年Minitab全面培訓(xùn)教程
- 社區(qū)電動車棚新(擴(kuò))建及修建充電車棚施工方案(純方案-)
- 項目推進(jìn)與成果交付情況總結(jié)與評估
- 鐵路項目征地拆遷工作體會課件
- 醫(yī)院死亡報告年終分析報告
- 建設(shè)用地報批服務(wù)投標(biāo)方案(技術(shù)方案)
- 工會工作人年度考核個人總結(jié)
- 上海民辦楊浦實驗學(xué)校初一新生分班(摸底)語文考試模擬試卷(10套試卷帶答案解析)
評論
0/150
提交評論