




版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報或認(rèn)領(lǐng)
文檔簡介
會計學(xué)1C文件和結(jié)構(gòu)體實用第一節(jié)文件操作C++語言提供了一批用于文件操作的標(biāo)準(zhǔn)函數(shù),本節(jié)不是介紹文件打開函數(shù)fopen,而是介紹另一個函數(shù)freopen,它們都包含于標(biāo)準(zhǔn)庫cstdio中,文件操作基本步驟如下: (1)打開文件,將文件指針指向文件,決定打開文件類型; (2)對文件進(jìn)行讀、寫操作; (3)在使用完文件后,關(guān)閉文件。第1頁/共18頁一、重定向版【命令格式】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)重定向。第2頁/共18頁
【使用方法】因為文件指針使用的是標(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);第3頁/共18頁代碼模版:#include<cstdio>//使用freopen語句,須調(diào)用cstdio庫intmain(){freopen("slyar.in","r",stdin);freopen("slyar.out","w",stdout);
/*中間按原樣寫代碼,什么都不用修改*/
fclose(stdin);fclose(stdout);return0;}第4頁/共18頁例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語句都適用。第5頁/共18頁二、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;}第6頁/共18頁
先聲明變量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;}第7頁/共18頁三、文件輸入輸出流
在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ò)展名");第8頁/共18頁程序如下:#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)輸入輸出,比賽測試時讀寫文件(請讀者自行實驗)。第9頁/共18頁第二節(jié)結(jié)構(gòu)體在實際問題中,一組數(shù)據(jù)往往具有不同的數(shù)據(jù)類型。例如,人口大普查時,我們需要記錄每一位公民的姓名,年齡,性別,住址,身份證號碼。這些信息分別要用整型,字符型,字符串型來記錄。為了解決問題,C++語言給出了另一種構(gòu)造數(shù)據(jù)類型——“結(jié)構(gòu)體”,它在數(shù)據(jù)存儲方面相當(dāng)于其他高級語言中的記錄,但它有著面向?qū)ο蟮膬?yōu)勢。第10頁/共18頁
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;第11頁/共18頁
當(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)存。第12頁/共18頁
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)體成員的操作與該成員類型所具有的操作是一致的。
第13頁/共18頁
成員運算符“.”在存取成員數(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ù)。第14頁/共18頁
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.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;
}
第15頁/共18頁
這里再舉出一個的例子,希望競賽學(xué)子能夠舉一反三,從中受益。
#include<iostream>
usingnamespacestd;
structDATA{
inta[2];//成員為一個數(shù)組
intc; //用來計算總和
int
溫馨提示
- 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)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 集體勞動合同范本2025年度(文化產(chǎn)業(yè)員工)
- 農(nóng)村公路養(yǎng)護(hù)管理合同(含交通安全設(shè)施維護(hù))
- 婦產(chǎn)科醫(yī)師培訓(xùn)計劃及內(nèi)容
- Unit 4 Drawing in the park Period 3 詞匯與語法過關(guān) 同步練習(xí)(含答案含聽力原文無音頻)
- 家長會學(xué)生主持發(fā)言稿
- 上海市業(yè)主總包分包合同
- 2024年公司勞動合同
- 2025年江西貨運從業(yè)資格證考試模擬考試題庫答案大全
- IT支持與服務(wù)記錄表格
- 《語文古典詩詞鑒賞與創(chuàng)作指導(dǎo)》
- 2024屆廣東省廣州市高三一??荚囉⒄Z試題講評課件
- 數(shù)字電子技術(shù)(廣東工業(yè)大學(xué))知到智慧樹章節(jié)測試課后答案2024年秋廣東工業(yè)大學(xué)
- 安徽省淮北一中2025屆高三沖刺模擬數(shù)學(xué)試卷含解析
- 2024年四川省綿陽市中考語文試卷(附真題答案)
- 2022年CSCO軟組織肉瘤診療指南
- 心電圖危急值的識別和處理知到智慧樹章節(jié)測試課后答案2024年秋浙江大學(xué)
- 低代碼應(yīng)用開發(fā) 課件全套 李春平 第1-9章 低代碼應(yīng)用開發(fā) - 低代碼開發(fā)應(yīng)用實例
- 2024年開學(xué)第一課:人工智能與未來教育
- 蟾蜍毒抗病毒活性位點
- 拇外翻課件完整版本
- 2025年四川省新高考八省適應(yīng)性聯(lián)考模擬演練二歷史試卷(含答案)
評論
0/150
提交評論