文件和結(jié)構(gòu)體(C++版)_第1頁(yè)
文件和結(jié)構(gòu)體(C++版)_第2頁(yè)
文件和結(jié)構(gòu)體(C++版)_第3頁(yè)
文件和結(jié)構(gòu)體(C++版)_第4頁(yè)
文件和結(jié)構(gòu)體(C++版)_第5頁(yè)
已閱讀5頁(yè),還剩14頁(yè)未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

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

文檔簡(jiǎn)介

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

第一節(jié)文件操作

C++語(yǔ)言提供了一批用于文件操作的標(biāo)準(zhǔn)函數(shù),本節(jié)不是介紹文件打開(kāi)函數(shù)fopen,而是介紹另一個(gè)函數(shù)freopen,它們都包含于標(biāo)準(zhǔn)庫(kù)cstdio中,文件操作基本步驟如下:

(1)打開(kāi)文件,將文件指針指向文件,決定打開(kāi)文件類型;

(2)對(duì)文件進(jìn)行讀、寫(xiě)操作;

(3)在使用完文件后,關(guān)閉文件。一、重定向版【命令格式】FILE*freopen(constchar*filename,constchar*mode,FILE*stream);【參數(shù)說(shuō)明】

filename:

要打開(kāi)的文件名

mode:文件打開(kāi)的模式,和fopen中的模式(r/w)相同

stream:

文件指針,通常使用標(biāo)準(zhǔn)流文件(stdin/stdout/stderr)

其中stdin是標(biāo)準(zhǔn)輸入流,默認(rèn)為鍵盤(pán);stdout是標(biāo)準(zhǔn)輸出流,默認(rèn)為屏幕;stderr是標(biāo)準(zhǔn)錯(cuò)誤流,一般把屏幕設(shè)為默認(rèn)。通過(guò)調(diào)用freopen,就可以修改標(biāo)準(zhǔn)流文件的默認(rèn)值,實(shí)現(xiàn)重定向。

【使用方法】

因?yàn)槲募羔樖褂玫氖菢?biāo)準(zhǔn)流文件,因此我們可以不定義文件指針。接下來(lái)我們使用freopen()函數(shù)以只讀方式r(read)打開(kāi)輸入文件slyar.in。格式:freopen("slyar.in","r",stdin);

然后使用freopen()函數(shù)以寫(xiě)入方式w(write)打開(kāi)輸出文件slyar.out。

格式:freopen("slyar.out","w",stdout);

接下來(lái)的事情就是使用freopen()函數(shù)的優(yōu)點(diǎn)了,我們不再需要修改scanf,printf,cin和cout。而是維持代碼的原樣就可以了。因?yàn)閒reopen()函數(shù)重定向了標(biāo)準(zhǔn)流,使其指向前面指定的文件,省時(shí)省力。最后只要使用fclose關(guān)閉輸入文件和輸出文件即可。

格式:fclose(stdin);fclose(stdout);

若要恢復(fù)句柄,可以重新打開(kāi)標(biāo)準(zhǔn)控制臺(tái)設(shè)備文件,只是這個(gè)設(shè)備文件的名字是與操作系統(tǒng)相關(guān)的。

格式:freopen("CON","r",stdin);代碼模版:#include<cstdio>//使用freopen語(yǔ)句,須調(diào)用cstdio庫(kù)intmain(){freopen("slyar.in","r",stdin);freopen("slyar.out","w",stdout);

/*中間按原樣寫(xiě)代碼,什么都不用修改*/

fclose(stdin);fclose(stdout);return0;}例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說(shuō)明:while(fin>>temp)和(scanf("%d",&temp)==1)主要是用于判斷數(shù)據(jù)是否已經(jīng)讀完,以便及時(shí)終止循環(huán)。還可以用成員函數(shù)eof來(lái)判斷是否達(dá)到數(shù)據(jù)流的末尾。對(duì)scanf、printf和cin、cout語(yǔ)句都適用。二、fopen版

重定向用起來(lái)很方便,但并不是所有算法競(jìng)賽都允許讀寫(xiě)文件。甚至有的競(jìng)賽允許訪問(wèn)文件,但不允許使用freopen這樣的重定向方式讀寫(xiě)文件,可以使用fopen版,對(duì)scanf和printf語(yǔ)句適用。程序如下:#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;}

先聲明變量fin和fout(暫且不用管FILE*為何物),把scanf改成fscanf,第一個(gè)參數(shù)為fin;把printf改成fprintf,第一個(gè)參數(shù)為fout,最后執(zhí)行fclose,關(guān)閉兩個(gè)文件。重定向和fopen兩種方法各有優(yōu)劣。重定向的方法寫(xiě)起來(lái)簡(jiǎn)單、自然,但是不能同時(shí)讀寫(xiě)文件和標(biāo)準(zhǔn)輸入輸出;fopen的寫(xiě)法稍顯繁瑣,但是靈活性比較大(例如可以反復(fù)打開(kāi)并讀寫(xiě)文件)。順便說(shuō)一句,如果把fopen版的程序改成讀寫(xiě)標(biāo)準(zhǔn)輸入輸出,只需賦值fin=stdin;fout=stdout;即可,不要調(diào)用fopen和fclose。程序如下:#include<cstdio>usingnamespacestd;intmain(){FILE*fin,*fout;fin=stdin;fout=stdout;/*本處語(yǔ)句同上*/fprintf(fout,"%d\n",sum);return0;}三、文件輸入輸出流

在C++中,文件輸入流(ifstream)和文件輸出流(ofstream)的類,它們的默認(rèn)輸入輸出設(shè)備都是磁盤(pán)文件。C++可以在創(chuàng)建對(duì)象時(shí),設(shè)定輸入或輸出到哪個(gè)文件。由于這些類的定義是在fstream中進(jìn)行的,因此,在使用這此類進(jìn)行輸入輸出操作時(shí),必須要在程序的首部利用#include指令包進(jìn)fstream頭文件。例如:若想用fin作為輸入對(duì)象,fout作為輸出對(duì)象,則可以使用如下定義:ifstreamfin("輸入文件名.擴(kuò)展名");ofstreamfout("輸出文件名.擴(kuò)展名");程序如下:#include<fstream>//使用文件輸入輸出流,對(duì)cin、cout語(yǔ)句適用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,是否要逐個(gè)把程序中的所有fin和fout替換為cin和cout?不用這么麻煩,只需要把fin和fout的聲明語(yǔ)句去掉,并加上這樣兩行即可:#definefincin#definefoutcout用條件編譯,還可以讓程序在本機(jī)上讀寫(xiě)標(biāo)準(zhǔn)輸入輸出,比賽測(cè)試時(shí)讀寫(xiě)文件(請(qǐng)讀者自行實(shí)驗(yàn))。第二節(jié)結(jié)構(gòu)體在實(shí)際問(wèn)題中,一組數(shù)據(jù)往往具有不同的數(shù)據(jù)類型。例如,人口大普查時(shí),我們需要記錄每一位公民的姓名,年齡,性別,住址,身份證號(hào)碼。這些信息分別要用整型,字符型,字符串型來(lái)記錄。為了解決問(wèn)題,C++語(yǔ)言給出了另一種構(gòu)造數(shù)據(jù)類型——“結(jié)構(gòu)體”,它在數(shù)據(jù)存儲(chǔ)方面相當(dāng)于其他高級(jí)語(yǔ)言中的記錄,但它有著面向?qū)ο蟮膬?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ù),也可以沒(méi)有

}結(jié)構(gòu)體變量表; //可以同時(shí)定義多個(gè)結(jié)構(gòu)體變量

結(jié)構(gòu)體變量名列表的各個(gè)變量用“,”隔開(kāi)。例如:

structDATA{

inta[2]; //成員為一個(gè)數(shù)組

intc;

}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)體變量例如:

structDATA{

inta[2];

intc;

};

DATAdata_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)體變量與各個(gè)成員之間引用的一般形式為:結(jié)構(gòu)體變量名.成員名對(duì)于上面定義的結(jié)構(gòu)體變量,我們可以這樣操作:

cin>>data_a.a[0]>>data_a.a[1];//一般情況下不能寫(xiě)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; //就如同給整形變量賦值實(shí)際上結(jié)構(gòu)體成員的操作與該成員類型所具有的操作是一致的。

成員運(yùn)算符“.”在存取成員數(shù)值時(shí)使用,其優(yōu)先級(jí)最高,并具有左結(jié)合性。在處理包含結(jié)構(gòu)體的結(jié)構(gòu)體時(shí),可記作:strua.strub.membb這說(shuō)名結(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)體將用來(lái)記錄一個(gè)學(xué)生的大致情況,所以它的成員應(yīng)該有學(xué)號(hào)、姓名、性別、年齡、成績(jī)、家庭住址等。

#include<iostream>

usingnamespacestd;

structstudent{

intnum; //學(xué)號(hào)

charname[21]; //姓名

charsex; //性別

intage; //年齡

floatscore; //成績(jī)

charaddress[51]; //家庭住址

};//此處不可忽略分號(hào)

structstudenta,b;

intmain()

{

cin>>a.num>>>>a.sex>>a.age>>a.score>>a.address;

cin>>b.num>>>>b.sex>>b.age>>b.score>>b.address;

cout<<a.num<<''<<<<''<<a.sex<<''<<a.age<<''<<a.score<<''<<a.address<<endl;

cout<<b.num<<''<<<<''<<b.sex<<''<<b.age<<''<<b.score<<''<<b.address<<endl;

return0;

}

這里再舉出一個(gè)的例子,希望競(jìng)賽學(xué)子能夠舉一反三,從中受益。

#include<iostream>

usingnamespacestd;

structDATA{

inta[2];//成員為一個(gè)數(shù)組

intc; //用來(lái)計(jì)算總和

intmax()//定義成員函數(shù)

{

returna[0]>a[1]?a[0]:a[1];

溫馨提示

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