版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報或認(rèn)領(lǐng)
文檔簡介
第七章文件與結(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)對文本文件的輸入和輸出。
1.第一節(jié)文件操作C++語言提供了一批用于文件操作的標(biāo)準(zhǔn)函數(shù),本節(jié)不是介紹文件打開函數(shù)fopen,而是介紹另一個函數(shù)freopen,它們都包含于標(biāo)準(zhǔn)庫cstdio中,文件操作基本步驟如下: (1)打開文件,將文件指針指向文件,決定打開文件類型; (2)對文件進(jìn)行讀、寫操作; (3)在使用完文件后,關(guān)閉文件。2.一、重定向版【命令格式】FILE*freopen(constchar*filename,constchar*mode,FILE*stream);【參數(shù)說明】
filename:要打開的文件名
mode:文件打開的模式,和fopen中的模式(r/w)相同
stream:文件指針,通常使用標(biāo)準(zhǔn)流文件(stdin/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)重定向。3.
【使用方法】因為文件指針使用的是標(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",stdout);接下來的事情就是使用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);4.代碼模版:#include<cstdio>//使用freopen語句,須調(diào)用cstdio庫intmain(){freopen("slyar.in","r",stdin);freopen("slyar.out","w",stdout);
/*中間按原樣寫代碼,什么都不用修改*/
fclose(stdin);fclose(stdout);return0;}5.例9.1從in.txt文件中讀入數(shù)據(jù),把它們的和保存out.txt文件中。#include<cstdio>intmain(){freopen("in.txt","r",stdin);//定義輸入文件名freopen("out.txt","w",stdout);//定義輸出文件名inttemp,sum=0;while(scanf("%d",&temp)==1)//(cin>>temp)從輸入文件中讀入數(shù)據(jù)//在C++中非0為真{sum=sum+temp;}printf("%d\n",sum);//cout<<sum<<endl;fclose(stdin);fclose(stdout);//關(guān)閉文件,可省略return0;}in.txt數(shù)據(jù):12345out.txt結(jié)果:15說明:while(fin>>temp)和(scanf("%d",&temp)==1)主要是用于判斷數(shù)據(jù)是否已經(jīng)讀完,以便及時終止循環(huán)。還可以用成員函數(shù)eof來判斷是否達(dá)到數(shù)據(jù)流的末尾。對scanf、printf和cin、cout語句都適用。6.二、fopen版
重定向用起來很方便,但并不是所有算法競賽都允許讀寫文件。甚至有的競賽允許訪問文件,但不允許使用freopen這樣的重定向方式讀寫文件,可以使用fopen版,對scanf和printf語句適用。程序如下:#include<cstdio>usingnamespacestd;intmain(){FILE*fin,*fout;fin=fopen("in.txt","rb");//定義輸入文件名fout=fopen("out.txt","wb");//定義輸出文件名inttemp,sum=0;while(fscanf(fin,"%d",&temp)==1)//從輸入文件中讀入數(shù)據(jù){sum=sum+temp;}fprintf(fout,"%d\n",sum);//cout<<sum<<endl;fclose(fin);fclose(fout);//關(guān)閉文件,可省略return0;}7.
先聲明變量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版的程序改成讀寫標(biāo)準(zhǔn)輸入輸出,只需賦值fin=stdin;fout=stdout;即可,不要調(diào)用fopen和fclose。程序如下:#include<cstdio>usingnamespacestd;intmain(){FILE*fin,*fout;fin=stdin;fout=stdout;/*本處語句同上*/fprintf(fout,"%d\n",sum);return0;}8.三、文件輸入輸出流
在C++中,文件輸入流(ifstream)和文件輸出流(ofstream)的類,它們的默認(rèn)輸入輸出設(shè)備都是磁盤文件。C++可以在創(chuàng)建對象時,設(shè)定輸入或輸出到哪個文件。由于這些類的定義是在fstream中進(jìn)行的,因此,在使用這此類進(jìn)行輸入輸出操作時,必須要在程序的首部利用#include指令包進(jìn)fstream頭文件。例如:若想用fin作為輸入對象,fout作為輸出對象,則可以使用如下定義:ifstreamfin("輸入文件名.擴(kuò)展名");ofstreamfout("輸出文件名.擴(kuò)展名");9.程序如下:#include<fstream>//使用文件輸入輸出流,對cin、cout語句適用usingnamespacestd;intmain(){ifstreamfin("in.txt");//定義輸入文件名ofstreamfout("out.txt");//定義輸出文件名inttemp,sum=0;while(fin>>temp)sum=sum+temp;//從輸入文件中讀入數(shù)據(jù)fout<<sum<<endl;fin.close();fout.close();//關(guān)閉文件,可省略return0;}如果想再次使用cin和cout,是否要逐個把程序中的所有fin和fout替換為cin和cout?不用這么麻煩,只需要把fin和fout的聲明語句去掉,并加上這樣兩行即可:#definefincin#definefoutcout用條件編譯,還可以讓程序在本機(jī)上讀寫標(biāo)準(zhǔn)輸入輸出,比賽測試時讀寫文件(請讀者自行實驗)。10.第二節(jié)結(jié)構(gòu)體在實際問題中,一組數(shù)據(jù)往往具有不同的數(shù)據(jù)類型。例如,人口大普查時,我們需要記錄每一位公民的姓名,年齡,性別,住址,身份證號碼。這些信息分別要用整型,字符型,字符串型來記錄。為了解決問題,C++語言給出了另一種構(gòu)造數(shù)據(jù)類型——“結(jié)構(gòu)體”,它在數(shù)據(jù)存儲方面相當(dāng)于其他高級語言中的記錄,但它有著面向?qū)ο蟮膬?yōu)勢。11.
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)體變量名列表的各個變量用“,”隔開。例如:
structDATA{
inta[2]; //成員為一個數(shù)組
intc;
}data_a,data_b;12.
當(dāng)然,我們也可以先定義結(jié)構(gòu)體再定義結(jié)構(gòu)體變量
struct結(jié)構(gòu)體名{ 成員表 成員函數(shù)};結(jié)構(gòu)體名結(jié)構(gòu)體變量表;//同樣可以同時定義多個結(jié)構(gòu)體變量例如:
structDATA{
inta[2];
intc;
};
DATAdata_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)存。13.
2.成員調(diào)用結(jié)構(gòu)體變量與各個成員之間引用的一般形式為:結(jié)構(gòu)體變量名.成員名對于上面定義的結(jié)構(gòu)體變量,我們可以這樣操作:
cin>>data_a.a[0]>>data_a.a[1];//一般情況下不能寫cin>>data_a;
inta=data_a.a[0]+data_a.a[1];//就像用整形變量一樣用a[0]、a[1]
data_b=data_a; //結(jié)構(gòu)體之間的相互賦值是合法的
data_a.c=0; //就如同給整形變量賦值實際上結(jié)構(gòu)體成員的操作與該成員類型所具有的操作是一致的。
14.
成員運算符“.”在存取成員數(shù)值時使用,其優(yōu)先級最高,并具有左結(jié)合性。在處理包含結(jié)構(gòu)體的結(jié)構(gòu)體時,可記作:strua.strub.membb這說名結(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ù)。15.
7.2.2結(jié)構(gòu)體操作實例現(xiàn)在,我們先定義一個簡單的結(jié)構(gòu)體,這個結(jié)構(gòu)體將用來記錄一個學(xué)生的大致情況,所以它的成員應(yīng)該有學(xué)號、姓名、性別、年齡、成績、家庭住址等。
#include<iostream>
usingnamespacestd;
structstudent{
intnum; //學(xué)號
charname[21]; //姓名
charsex; //性別
intage; //年齡
floatscore; //成績
charaddress[51]; //家庭住址
};//此處不可忽略分號
structstudenta,b;
intmain()
{
cin>>a.num>>>>a.sex>>a.age>>a.score>>a.address;
cin>>b.num>>>>b.sex>>b.age>>b.score>>b.addres
溫馨提示
- 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)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 2026年中能建華東電力裝備有限公司招聘備考題庫有答案詳解
- 2026年內(nèi)蒙古霍煤鴻駿鋁電有限責(zé)任公司電力分公司招聘備考題庫完整答案詳解
- 2026年北京大學(xué)楊競課題組招聘技術(shù)人員備考題庫完整答案詳解
- 2026年成都市龍泉驛區(qū)東山國際小學(xué)招聘備考題庫及一套答案詳解
- 2026年勞務(wù)派遣人員招聘(派遣至浙江大學(xué)能源工程學(xué)院張小斌教授課題組)備考題庫帶答案詳解
- 2026年南海區(qū)桂城桂江小學(xué)教師招聘備考題庫附答案詳解
- 2026年廣安市武勝縣公證處招聘非在編公證員助理的備考題庫及一套參考答案詳解
- 2026年吉安市人才資源開發(fā)服務(wù)有限公司招聘備考題庫有答案詳解
- 2026年山東眾匯商業(yè)運營有限公司蓼河古街曲阜宴項目(孔府宴秀)招聘備考題庫及一套完整答案詳解
- 2026年東方市中醫(yī)院招聘備考題庫及完整答案詳解一套
- 4M變化點管理記錄表
- Tickets-please《請買票》 賞析完整
- 《馬克的怪病》課件
- 部編版八年級道德與法治上冊《樹立維護(hù)國家利益意識捍衛(wèi)國家利益》教案及教學(xué)反思
- 基于單片機(jī)的智能家居控制系統(tǒng)設(shè)計
- 鍋爐大件吊裝方案
- 湖北2023年湖北銀行武漢洪山區(qū)支行行長招聘上岸提分題庫3套【500題帶答案含詳解】
- 基本醫(yī)療保險跨省異地就醫(yī)備案個人承諾書
- GB/T 19228.3-2012不銹鋼卡壓式管件組件第3部分:O形橡膠密封圈
- GA/T 970-2011危險化學(xué)品泄漏事故處置行動要則
- 公文格式(全區(qū))課件
評論
0/150
提交評論