版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
第13章輸入與輸出流提綱輸出流和輸入流的常用成員函數(shù)流操縱符流的錯(cuò)誤狀態(tài)文件和流文件操作打開文件讀/寫文件 關(guān)閉文件字符串流13.1C++的輸入和輸出(I/O)輸入和輸出,要看以什么為對(duì)象——
以標(biāo)準(zhǔn)I/O設(shè)備為對(duì)象從鍵盤、鼠標(biāo)得到的數(shù)據(jù)是進(jìn)入內(nèi)存的,該數(shù)據(jù)是輸入數(shù)據(jù)。將數(shù)據(jù)從內(nèi)存送到顯示器、打印機(jī)等,該數(shù)據(jù)是輸出數(shù)據(jù)。以外存磁盤文件為對(duì)象內(nèi)存中的數(shù)據(jù)存儲(chǔ)到磁盤文件中,叫輸出文件;從磁盤文件中的數(shù)據(jù)裝載入內(nèi)存中,叫輸入文件。以內(nèi)存中指定的空間作為對(duì)象常指定一個(gè)字符數(shù)組作為存儲(chǔ)空間,這種I/O稱為字符串的輸入輸出。C++采取不同的方法實(shí)現(xiàn)以上三種I/O。標(biāo)準(zhǔn)I/O文件I/O串I/O數(shù)據(jù)之間的傳輸過程稱作流(stream)——輸入流——表示數(shù)據(jù)從某個(gè)載體或設(shè)備傳送到內(nèi)存輸出流——表示數(shù)據(jù)從內(nèi)存?zhèn)魉偷侥硞€(gè)載體或設(shè)備C++的輸入輸出流內(nèi)存鍵盤文件光筆....輸入流顯示器文件打印機(jī)...輸出流在進(jìn)行I/O操作時(shí)——首先進(jìn)行“打開”操作,使流和文件發(fā)生聯(lián)系建立聯(lián)系后的文件才允許數(shù)據(jù)流入或流出I/O結(jié)束后,使用“關(guān)閉”操作使文件與流斷開聯(lián)系。C++將I/O流定義為類——流類。屬于流類的對(duì)象是流對(duì)象系統(tǒng)已經(jīng)以運(yùn)算符或函數(shù)的形式做好了對(duì)標(biāo)準(zhǔn)外設(shè)(鍵盤、顯示器、打印機(jī)、文件)的接口,使用時(shí)只需按照要求的格式調(diào)用即可。如:cin——標(biāo)準(zhǔn)輸入流對(duì)象。
cout——標(biāo)準(zhǔn)輸出流對(duì)象。C++的輸入輸出流C++的各種I/O流類庫(kù)C++為實(shí)現(xiàn)數(shù)據(jù)的I/O定義了一個(gè)龐大的類庫(kù)。它包括的類主要有——C++I/O類庫(kù)中的其他類輸入和輸出流對(duì)象預(yù)先定義的輸出和輸入流對(duì)象:cout標(biāo)準(zhǔn)輸出cerr標(biāo)準(zhǔn)錯(cuò)誤輸出,沒有緩沖,發(fā)送給它的內(nèi)容立即被輸出。clog類似于cerr,但是有緩沖,緩沖區(qū)滿時(shí)被輸出。cin標(biāo)準(zhǔn)輸入13.2標(biāo)準(zhǔn)輸出流
標(biāo)準(zhǔn)輸出流——流向標(biāo)準(zhǔn)輸出設(shè)備(顯示器)的數(shù)據(jù)cout流對(duì)象——在控制臺(tái)(顯示器)輸出用流插入運(yùn)算符“<<”向cout輸出數(shù)據(jù).如:
cout<<“a=”<<a<<endl;
cout<<數(shù)據(jù)1<<數(shù)據(jù)2<<數(shù)據(jù)3;cerr流對(duì)象——在控制臺(tái)(顯示器)輸出錯(cuò)誤信息用流插入運(yùn)算符“<<”向cerr輸出數(shù)據(jù).如:
cerr<<“除數(shù)為0,出錯(cuò)!”<<endl;
cerr的用法與cout類似.cout流對(duì)象與cerr流對(duì)象的不同之處cout的輸出默認(rèn)是顯示器,但可以被重定向?yàn)檩敵龅酱疟P文件cerr只能定向輸出到顯示器
例13.1解一元二次方程ax2+bx+c=0
的解voidmain(){floata,b,c,disc;
cout<<“輸入a,b,c:”;cin>>a>>b>>c;if(a==0)cerr<<“a=0,不是二次方程,出錯(cuò)!”<<endl;else{disc=b*b-4*a*c;if(disc<0)cerr<<“二次方程無實(shí)根?!?lt;<endl;else{cout<<“x1=”<<(-b+sqrt(disc))/(2*a)<<endl;
cout<<“x2=”<<(-b-sqrt(disc))/(2*a)<<endl;}}}標(biāo)準(zhǔn)輸出流標(biāo)準(zhǔn)輸出流——流向標(biāo)準(zhǔn)輸出設(shè)備(顯示器)的數(shù)據(jù)clog流對(duì)象——在控制臺(tái)(顯示器)輸出錯(cuò)誤信息.用流插入運(yùn)算符“<<”向clog輸出數(shù)據(jù).如:clog<<“除數(shù)為0,出錯(cuò)!”<<endl;clog的用法與cerr類似.clog流對(duì)象與cerr流對(duì)象的不同之處cerr是不經(jīng)過緩沖區(qū),直接向顯示器輸出有關(guān)信息。clog的輸出先存儲(chǔ)在緩沖區(qū),遇到緩沖區(qū)滿或遇到endl時(shí)才向顯示器輸出。用流對(duì)象的成員控制格式輸出說明:cout.width(n)
與格式控制符setw(n)相似cout.fill(c)
與格式控制符setfill(c)相似cout.setf(ios::dec);cout.unsetf(ios::hex);//書例13-3#include<iostream>usingnamespacestd;intmain(){inta=21;cout.setf(ios::showbase);cout<<"dec:"<<a<<endl;cout.unsetf(ios::dec);cout.setf(ios::hex);cout<<"hex:"<<a<<endl;cout.unsetf(ios::hex);cout.setf(ios::oct);cout<<"oct:"<<a<<endl;char*pt="China";cout.width(10);cout<<pt<<endl;cout.width(10);cout.fill('*');
cout<<pt<<endl;doublepi=22.0/7.0;cout.setf(ios::scientific);cout<<"pi=";cout.width(14);cout<<pi<<endl;cout.unsetf(ios::scientific);cout.setf(ios::fixed);cout.width(12);cout.setf(ios::showpos);
cout.setf(ios::internal);cout.precision(6);cout<<pi<<endl;return0;}13.3標(biāo)準(zhǔn)輸入流標(biāo)準(zhǔn)輸入流——從標(biāo)準(zhǔn)輸入設(shè)備(鍵盤)流向程序的數(shù)據(jù).
cin流對(duì)象
int
a,b;
cin>>a>>b;//從鍵盤輸入2個(gè)整數(shù)當(dāng)輸入時(shí)遇到無效的字符或遇到文件結(jié)束符ctrl+z
時(shí)
cin處于出錯(cuò)狀態(tài),無法正常提取數(shù)據(jù)(cin=false).if(!cin)
cout<<“輸入出錯(cuò)”;21abc↙#include<iostream>usingnamespacestd;intmain(){floatgrade;cout<<"entergrade:";
while(cin>>grade)//能從cin流讀取數(shù)據(jù){if(grade>=85)cout<<grade<<"GOOD!"<<endl;if(grade<60)cout<<grade<<"fail!"<<endl;cout<<"entergrade:";}cout<<"Theend."<<endl;return0;}函數(shù)功能read無格式輸入指定字節(jié)數(shù)get從流中提取字符,包括空格getline從流中提取一行字符ignore提取并丟棄流中指定字符peek返回流中下一個(gè)字符,但不從流中刪除gcount統(tǒng)計(jì)最后輸入的字符個(gè)數(shù)eatwhite忽略前導(dǎo)空格seekg移動(dòng)輸入流指針tellg返回輸入流中指定位置的指針值istream類的公有成員函數(shù)
輸出流和輸入流的常用成員函數(shù)intget();istream&get(char&rch);istream&get(char*pch,intnCount,chardelim='\n');istream&read(char*pch,intnCount);讀取一個(gè)字符,不跳過空白字符讀取一行字符,不提取‘\n’函數(shù)功能read無格式輸入指定字節(jié)數(shù)get從流中提取字符,包括空格getline從流中提取一行字符ignore提取并丟棄流中指定字符peek返回流中下一個(gè)字符,但不從流中刪除gcount統(tǒng)計(jì)最后輸入的字符個(gè)數(shù)eatwhite忽略前導(dǎo)空格seekg移動(dòng)輸入流指針tellg返回輸入流中指定位置的指針值istream&ignore(intnCount=1,intdelim=EOF);istream類的公有成員函數(shù)
intgcount()const;輸出流和輸入流的常用成員函數(shù)函數(shù)功能putostream&put(charch);無格式,插入一個(gè)字節(jié)writeostream&write(constchar*pch,intnCount);從無格式,插入一字節(jié)序列flush刷新輸出流seekp移動(dòng)輸出流指針tellp返回輸出流中指定位置的指針值ostream類的公有成員函數(shù)
用于字符輸入的流成員函數(shù)不帶參數(shù)的get函數(shù)
cin.get()
功能——從輸入流提取1個(gè)字符;函數(shù)返回值就是該字符.若遇到文件結(jié)束符,則返回值為EOF,即-1.如:charch;while((ch=cin.get())!=EOF)
cout.put(ch);
鍵盤輸入:
顯示:
鍵盤輸入:IstudyC++.
(程序結(jié)束)IstudyC++.↙Ctrl+ZEOF——EndOfFile字符輸出的流成員函數(shù),功能——在顯示器上顯示一個(gè)字符用于字符輸入的流成員函數(shù)2.帶1個(gè)參數(shù)的get函數(shù)
cin.get(ch)
功能——從輸入流提取1個(gè)字符放入ch;
函數(shù)返回值就是非0值若遇到文件結(jié)束符,則返回值為0如:charch;while(cin.get(ch)!=0)
cout.put(ch);
鍵盤輸入:
顯示:
鍵盤輸入:IstudyC++.
(程序結(jié)束)IstudyC++.↙Ctrl+Z用于字符輸入的流成員函數(shù)3.帶3個(gè)參數(shù)的get函數(shù)
cin.get(字符數(shù)組,字符個(gè)數(shù)n,終止字符)或
cin.get(字符指針,字符個(gè)數(shù)n,終止字符)功能——從輸入流提取n-1個(gè)字符放入數(shù)組;
函數(shù)返回值就是非0值若遇到文件結(jié)束符,則返回值為0如charstr[20];
cin.get(str,10,’\n’);
cout<<str;
鍵盤輸入:
顯示:
IstudyCIstudyC++.↙cin.get()與cin.getline()的比較
cin.get(字符數(shù)組,字符個(gè)數(shù)n,終止字符)cin.getline(字符指針,字符個(gè)數(shù)n,終止字符)相同之處:從輸入流提取n-1個(gè)字符放入數(shù)組,函數(shù)返回值是非0值.若遇到文件結(jié)束符,則返回值為0.不同之處:當(dāng)讀到終止字符時(shí),cin.getline()——將指針移到終止字符之后。cin.get()——將指針移到終止字符處。則下次繼續(xù)讀取時(shí)的位置就不同。(代碼測(cè)試一下)voidmain(){charc1,c2,c3;charstr1[80],str2[100];cout<<"輸入三個(gè)字符:";c1=cin.get();
cin.get(c2);
cin.get(c3);
cin.get();cout<<"輸入第一行字符串:";
cin.get(str1,80);
cin.get();cout<<"輸入第二行字符串:";
cin.getline(str2,80);cout.put(c1).put(c2).
put(c3).put('\n');cout.write(str1,3);cout.write(str2,strlen(str2));cout.put('\n');}輸入形式如下:WEAbcdefAbcdefg輸出結(jié)果?除了以上介紹的用于讀取數(shù)據(jù)的成員函數(shù)外,istream類還有其他在輸入數(shù)據(jù)時(shí)用得著的一些成員函數(shù)。常用的有以下幾種:1.eof函數(shù)eof是endoffile的縮寫,表示“文件結(jié)束”。從輸入流讀取數(shù)據(jù),如果到達(dá)文件末尾(遇文件結(jié)束符),eof函數(shù)值為非零值(表示真),否則為0(假)。13.3.3istream類的其他成員函數(shù)例13.8逐個(gè)讀入一行字符,將其中的非空格字符輸出。#include<iostream>usingnamespacestd;intmain(){charc;while(!cin.eof())//eof()為假表示未遇到文件結(jié)束符if((c=cin.get())!=‘‘)//檢查讀入的字符是否為空格字符
cout.put(c);return0;}2.peek函數(shù)peek是“觀察”的意思,peek函數(shù)的作用是觀測(cè)下一個(gè)字符。其調(diào)用形式為c=cin.peek();函數(shù)的返回值是指針指向的當(dāng)前字符,但它只是觀測(cè),指針仍停留在當(dāng)前位置,并不后移。如果要訪問的字符是文件結(jié)束符,則函數(shù)值是EOF(-1)。3.putback函數(shù)其調(diào)用形式為cin.putback(ch);其作用是將前面用get或getline函數(shù)從輸入流中讀取的字符ch返回到輸入流,插入到當(dāng)前指針位置,以供后面讀取。例13.9peek函數(shù)和putback函數(shù)的用法。#include<iostream>usingnamespacestd;intmain(){charc[20];intch;cout<<″pleaseenterasentence:″<<endl;cin.getline(c,15,′/′);cout<<″Thefirstpartis:″<<c<<endl;ch=cin.peek();//觀看當(dāng)前字符
cout<<″Thenextcharacter(ASCIIcode)is:″<<ch<<endl;cin.putback(c[0]);//將′I′插入到指針?biāo)柑?/p>
cin.getline(c,15,′/′);cout<<″Thesecondpartis:″<<c<<endl;return0;}圖13.44.ignore函數(shù)其調(diào)用形式為cin,ignore(n,終止字符)函數(shù)作用是跳過輸入流中n個(gè)字符,或在遇到指定的終止字符時(shí)提前結(jié)束(此時(shí)跳過包括終止字符在內(nèi)的若干字符)。如ignore(5,′A′)//跳過輸入流中5個(gè)字符,遇′A′后就不再跳了也可以不帶參數(shù)或只帶一個(gè)參數(shù)。如ignore(n默認(rèn)值為1,終止字符默認(rèn)為EOF)相當(dāng)于ignore(1,EOF)例13.10用ignore函數(shù)跳過輸入流中的字符。先看不用ignore函數(shù)的情況:#include<iostream>usingnamespacestd;intmain(){charch[20];cin.get(ch,10,’/’);cout<<″Thefirstpartis:″<<ch<<endl;cin.get(ch,10,’/’);cout<<″Thesecondpartis:″<<ch<<endl;return0;}如果輸入下面的情況,運(yùn)行結(jié)果如何:(1)1234567890/(2)123456/如果希望第二個(gè)cin.get函數(shù)能讀取″IstudyC++.″,就應(yīng)該設(shè)法跳過輸入流中第一個(gè)′/′,可以用ignore函數(shù)來實(shí)現(xiàn)此目的,將程序改為#include<iostream>usingnamespacestd;intmain(){charch[20];cin.get(ch,20,’/’);cout<<“Thefirstpartis:”<<ch<<endl;cin.ignore();//跳過輸入流中一個(gè)字符
cin.get(ch,20,’/’);cout<<“Thesecondpartis:”<<ch<<endl;return0;}以上介紹的各個(gè)成員函數(shù),不僅可以用cin流對(duì)象來調(diào)用,而且也可以用istream類的其他流對(duì)象調(diào)用。標(biāo)識(shí)常量值意義ios::goodbit0x00狀態(tài)正常ios::eofbit0x01文件結(jié)束符,當(dāng)文件結(jié)尾時(shí)設(shè)置該標(biāo)志ios::failbit0x02I/O操作失敗,數(shù)據(jù)未丟失,可以恢復(fù)ios::badbit0x04非法操作,數(shù)據(jù)丟失,不可恢復(fù)0000000000000000000000000000000100000000000000100000000000000100流錯(cuò)誤狀態(tài)所有流都把流的狀態(tài)存儲(chǔ)在狀態(tài)字中不同標(biāo)志位中存儲(chǔ)不同的錯(cuò)誤狀態(tài)位包含在類ios的enum成員中
ios處理流錯(cuò)誤狀態(tài)的公有成員函數(shù)
函數(shù)功能inteof()const;返回eofbit狀態(tài)值。文件結(jié)束符時(shí)返回1,否則返回0intfail()const;返回failbit狀態(tài)值intgood()const;eofbit、failbit和badbit都沒有被設(shè)置,則返回1intbad()const;badbit被設(shè)置,則返回1(當(dāng)發(fā)生嚴(yán)重錯(cuò)誤:如數(shù)據(jù)丟失)intrdstate()const;返回狀態(tài)字voidclear(intnState=0);恢復(fù)或設(shè)置狀態(tài)字例如:clear(ios::failbit)流錯(cuò)誤狀態(tài)#include<iostream>usingnamespacestd;
intintegerValue;//displayresultsofcinfunctionscout<<"Beforeabadinputoperation:"<<"\ncin.rdstate():"<<cin.rdstate()<<"\ncin.eof():"<<cin.eof()<<"\ncin.fail():"<<cin.fail()<<"\ncin.bad():"<<cin.bad()<<"\ncin.good():"<<cin.good()<<"\n\nExpectsaninteger,butenteracharacter:";cin>>integerValue;//entercharactervaluecout<<endl;//displayresultsofcinfunctionsafterbadinputcout<<"Afterabadinputoperation:"<<"\ncin.rdstate():"<<cin.rdstate()<<"\ncin.eof():"<<cin.eof()<<"\ncin.fail():"<<cin.fail()<<"\ncin.bad():"<<cin.bad()<<"\ncin.good():"<<cin.good()<<endl<<endl;
cin.clear();//clearstream//displayresultsofcinfunctionsafterclearingcincout<<"Aftercin.clear()"<<"\ncin.fail():"<<cin.fail()<<"\ncin.good():"<<cin.good()<<endl;return0;提綱文件和流文件操作打開文件讀/寫文件 關(guān)閉文件
13.4文件操作與文件流文件
存儲(chǔ)在某種設(shè)備(磁帶、光盤、軟盤或硬盤)上數(shù)據(jù)的集合;對(duì)用戶來說,文件分成兩大類:
程序文件數(shù)據(jù)文件從文件中數(shù)據(jù)的組織形式來分:ASCII文件(文本文件)二進(jìn)制文件本節(jié)特別介紹:磁盤文件文本文件和二進(jìn)制文件文本文件(ASCII文件):文件中的內(nèi)容都是字符,以ASCII碼形式存在文件內(nèi).如:12345在文本文件中是以‘1’,’2’,’3’,’4’,’5’共5個(gè)字符形式存儲(chǔ)的二進(jìn)制文件:文件中的內(nèi)容是以數(shù)據(jù)的二進(jìn)制形式存儲(chǔ)的.如:12345在二進(jìn)制文件中按1個(gè)整數(shù)類型以二進(jìn)制形式存儲(chǔ),占4個(gè)字節(jié)空間文件處理模板在流類體系中,包含文件流類體系iosistreamiostreamostreamstreambufifstreamofstreamfstreamfilebuf完成從文件提取數(shù)據(jù)完成向文件插入數(shù)據(jù)完成提取插入操作完成文件緩沖區(qū)管理文件流用標(biāo)準(zhǔn)流進(jìn)行I/O時(shí),系統(tǒng)自動(dòng)地完成數(shù)據(jù)類型的轉(zhuǎn)換。對(duì)于輸入流,要將輸入的字符序列形式的數(shù)據(jù)變換成計(jì)算機(jī)內(nèi)部形式的數(shù)據(jù)(二進(jìn)制或ASCII)后,再賦給變量,變換后的格式由變量的類型確定。對(duì)于輸出流,將要輸出的數(shù)據(jù)變換成字符串形式后,送到輸出流(文件)中。內(nèi)存變量(程序)鍵盤輸入文件屏幕輸出文件cin>>xcout<<xinfile>>xoutfile<<x程序?qū)ξ谋疚募牟僮髋c對(duì)鍵盤、顯示器的操作比較:在涉及文本文件的操作時(shí),將輸入文件看成鍵盤,將輸出文件看成顯示器,格式不變。只需在程序中增加打開與關(guān)閉文件的語句。012345n-1------------------------內(nèi)存------------------------ifstreamfinfstreamfinoutofstreamfout讀文件寫文件讀/寫文件10.5.1文件和流文件和流012345n-1文件字節(jié)序號(hào)文件結(jié)束符文件長(zhǎng)度=n文件和流012345……ifstreamfin讀文件24378inta,b;fin>>a>>b;10.5.3文本文件a0X00f3b0X004e文件和流012345……24378a0X00f3b0X004eintc;c=a+b;fout<<"c=
"<<c<<endl;ofstreamfoutinta,b;fin>>a>>b;寫文件c0X0141c=321\n文件和流文件操作文件操作的基本步驟:定義一個(gè)文件流對(duì)象打開文件讀/寫文件 關(guān)閉文件
使用文件流類,必須包含頭文件#include<fstream>文件操作
-定義一個(gè)文件流對(duì)象
如:
//用于與一個(gè)輸入文件建立聯(lián)系
ifstreaminfile;//用于與一個(gè)輸出文件建立聯(lián)系
ofstreamoutfile;
//用于與一個(gè)輸入輸出文件建立聯(lián)fstreamiofile;文件操作-打開文件與外部文件關(guān)聯(lián);指定文件的打開方式;有兩種方式打開文件方法1:
調(diào)用流類帶參數(shù)的構(gòu)造函數(shù)建立流對(duì)象時(shí)連接外部文件
流類對(duì)象名(文件名,方式);文件操作-打開文件
ifstream、ofstream或fstream第二個(gè)參數(shù)表示文件的打開方式標(biāo)識(shí)常量意義ios::in讀方式打開文件ios::out寫方式打開文件ios::ate打開文件時(shí),指針指向文件尾ios::app追加方式ios::trunc刪除文件現(xiàn)有內(nèi)容ios::binary二進(jìn)制方式打開,默認(rèn)為文本方式ios::in|ios::out以輸入和輸出方式打開文件,文件可讀寫ios::out|ios::binary或者ios::in|ios::binary以二進(jìn)制方式打開一個(gè)輸出(或者輸入)文件10.5.2打開和關(guān)閉文件文件操作-打開文件例如:
ifstreaminfile("datafile.dat",ios::in); ofstreamoutfile("d:\\newfile.dat",ios::out); fstreamrwfile("myfile.dat",ios::in|ios::out);ofstreamofile("a:\\binary",ios::binary|ios::app);用“|”(或運(yùn)算符)連接兩個(gè)表示打開方式的標(biāo)識(shí)常量10.5.2打開和關(guān)閉文件打開一個(gè)二進(jìn)制文件進(jìn)行追加操作文件操作-打開文件
文件操作-打開文件方法2
先建立流對(duì)象,后調(diào)用fstream::open()函數(shù)連接外部文件流類對(duì)象名;
對(duì)象名.open(文件名,方式);打開文件成員函數(shù)格式:voidfstream::open(constchar*,int,int=filebuf::openprot);voidifstream::open(constchar*,int=ios::in,int=filebuf::openprot);voidofstream::open(constchar*,int=ios::out,int=filebuf::openprot);打開的文件名文件的打開方式文件打開時(shí)的保護(hù)方式,如:獨(dú)占打開無缺省值參數(shù)ios::…意義文件操作-打開文件打開一個(gè)已有文件datafile.dat,準(zhǔn)備讀:
ifstream
infile; //建立輸入文件流對(duì)象
infile.open(“datafile.dat”,ios::in);//連接文件,指定打開方式打開(創(chuàng)建)一個(gè)文件newfile.dat,準(zhǔn)備寫:
ofstream
outfile; //建立輸出文件流對(duì)象
outfile.open("d:\\newfile.dat",ios::out);//連接文件,指定打開方式與cin和cout的用法相同如:infile>>x;outfile<<y;對(duì)文件進(jìn)行讀寫操作在對(duì)文件進(jìn)行讀寫時(shí),我們將文件看成字符流,文件流……讀寫位置指針隨著文件的讀寫,指針移動(dòng)。
關(guān)閉文件操作包括把緩沖區(qū)數(shù)據(jù)完整地寫入文件,添加文件結(jié)束標(biāo)志,切斷流對(duì)象和外部文件的連接當(dāng)一個(gè)流對(duì)象的生存期結(jié)束,系統(tǒng)也會(huì)自動(dòng)關(guān)閉文件;若流對(duì)象的生存期沒有結(jié)束,用close()關(guān)閉文件后,該流對(duì)象可以重用.文件操作-關(guān)閉文件文件操作-關(guān)閉文件voidifstream::close();voidofstream::close();voidfstream::close();如:infile.close();//切斷與輸入文件myfile1.txt的聯(lián)系
outfile.close();//切斷與輸出文件myfile2.txt的聯(lián)系
iofile.close();//切斷與輸入輸出文件myfile3.txt
的聯(lián)系文件讀寫完畢,必須關(guān)閉。關(guān)閉文件成員函數(shù)格式:eg:
ofstreamofile;
//創(chuàng)建輸出文件流
ofile.open(“myfile1”
,ios::out
);
//ofile流與文件“myfile1”相關(guān)聯(lián)
……
//訪問文件“myfile1”ofile.close();//關(guān)閉文件“myfile1”ofile.open(“myfile2”,ios::out); //重用對(duì)象ofile等價(jià)于使用構(gòu)造函數(shù):ofstreamofile(“myfile1”
,ios::out
);10.5.2打開和關(guān)閉文件文件操作-關(guān)閉文件close()函數(shù)關(guān)閉文件但流對(duì)象仍然存在打開與關(guān)閉錯(cuò)誤if(!outfile)//之前outfile.open(“myfile2.dat”)
{cerr<<”error:unabletoopenfile2!”;}檢測(cè)文件是否成功打開,可在條件表達(dá)式中使用取反操作符(?。y(cè)試流狀態(tài)
(一般是讀文件的時(shí)候用)為了測(cè)試成功關(guān)閉文件,可以調(diào)用fail()函數(shù),如myfile2.close();if(myfile2.fail())cerr<<”Errortoclosemyfile2!;”將文件類對(duì)象看成鍵盤和顯示器即可。ifstreaminfile;//定義輸入文件類對(duì)象infile.open(“myfile1.txt”);//利用函數(shù)打開某一文件floatx,y;infile>>x>>y;myfile1.txt34內(nèi)存infilexy34用infile代替myfile1.txt進(jìn)行操作。如何從文件中讀出數(shù)據(jù)?ofstreamoutfile;//定義輸出文件類對(duì)象outfile.open(“myfile2.txt”);//利用函數(shù)打開某一文件
floatx=3,y=4;outfile<<x<<‘\t’<<y<<endl;myfile2.txt內(nèi)存outfilexy34用outfile代替myfile2.txt進(jìn)行操作。34如何把數(shù)據(jù)寫到文件?ifstreaminfile;ofstreamoutfile;infile.open(“myfile1.txt”);outfile.open(“myfile2.txt”);floatx,y;infile>>x>>y;outfile<<x<<‘\t’<<y<<endl;infile.close();outfile.close();myfile1.txt34內(nèi)存infilexy34myfile2.txtoutfile34infile.close();outfile.close();用完文件后,使用成員函數(shù)關(guān)閉文件文件讀寫-文本文件(順序文件)文本文件文件的每個(gè)字節(jié)都是用ASCII代碼存放數(shù)據(jù),即每個(gè)字節(jié)存放一個(gè)字符,這種文件又稱字符文件文件的默認(rèn)打開方式為文本文件文本文件是順序存取文件文本文件本身沒有記錄邏輯結(jié)構(gòu),通常一個(gè)邏輯記錄用換行符分隔;數(shù)據(jù)項(xiàng)之間可以用空白符、換行符、制表符等分隔。#include<fstream>#include<iostream>usingnamespacestd;voidmain(){inta[10];ofstreamoutfile(“f1.dat”);//定義文件流對(duì)象,打開文件″f1.dat″
if(!outfile)
//若打開失敗,返回0值
{cerr<<″openerror!″<<endl;exit(1);}cout<<″e(cuò)nter10integernumbers:″<<endl;for(inti=0;i<10;i++){cin>>a[i];
outfile<<a[i]<<″″;//向文件″f1.dat″輸出數(shù)據(jù)
}
outfile.close();
//關(guān)閉文件″f1.dat″}例13.11有一個(gè)整型數(shù)組,含10個(gè)元素,從鍵盤輸入10個(gè)整數(shù)給數(shù)組,將此數(shù)組送到磁盤文件地f1.dat中存放。文件處理流程定義并打開文件對(duì)象打開文件出錯(cuò)處理對(duì)文件進(jìn)行R/W操作關(guān)閉文件對(duì)象#include<fstream>#include<iomanip>usingnamespacestd;voidmain(){ofstreamost;ost.open("C:\\my2.txt");ost<<"1234567890"<<endl;inta=123;ost<<a<<endl;ost<<setw(10)<<a<<endl;ost<<setiosflags(ios::left)<<setfill('#')<<setw(10)<<a<<endl;ost<<setiosflags(ios::right)<<setprecision(5)<<setw(10)<<12.34567890<<endl;ost.close();}例:使用格式控制建立的文本文件以指定格式插入數(shù)據(jù)默認(rèn)方式打開文本文件#include<iostream>#include<fstream>usingnamespacestd;voidmain(){ofstreamout("test.txt");if(!out){cout<<"cannotopenfile.";return;}out<<10<<""<<123.45<<"";out<<"\nThisisashorttextfile.";out.close();}例:將數(shù)據(jù)寫入到文件對(duì)數(shù)值常量做轉(zhuǎn)換#include<iostream>#include<fstream>usingnamespacestd;voidmain(){charch;inti;floatf;charstr1[10],str2[10];ifstreamin("test.txt");if(!in){cout<<"cannotopenfile.";return;}
in>>i>>f>>ch>>str1>>str2;cout<<i<<“”<<f<<“”<<ch<<'\n';cout<<str1<<str2<<endl;in.close();}ifstreamininti
floatf
charchcharstr1[]charstr2[]10.5.3文本文件例從文件讀出數(shù)據(jù)#include<iostream>#include<fstream>usingnamespacestd;
voidmain(){charch;inti;floatf;charstr1[10],str2[10];ifstreamin("test.txt");if(!in){cout<<"cannotopenfile.";return;}in>>i>>f>>ch>>str1>>str2;
cout<<i<<“”<<f<<“”<<ch<<'\n';cout<<str1<<str2<<endl;in.close();}10.5.3文本文件例:從文件讀出數(shù)據(jù)inti10floatf 123.45charchTcharstr1[]hischarstr2[]isostreamcout#include<fstream>usingnamespacestd;voidmain(){charstr[]="\tNewstring";ofstreamf2("test.txt",ios::app); //追加方式
if(!f2){cout<<"cannotopentestnewforouput.";return;}f2<<str; //插入字符串
f2.close();}例在文件
testnew的末尾添加字符串插入串#include<iostream>#include<fstream>usingnamespacestd;voidmain(){charch;ifstreamf1("test.txt");if(!f1){cout<<"cannotopen'test'forinput.";return;}ofstreamf2("testnew.txt");if(!f2){cout<<"cannotopentestnewforouput.";return;}
while(f1&&f1.get(ch))f2.put(ch);f1.close();f2.close();cout<<"Itisover!\n";}ifstreamf1ofstreamf2ch10.5.3文本文件例:復(fù)制數(shù)據(jù)到文件
將文件test的內(nèi)容復(fù)制到testnew中例
將數(shù)值1~100及其平方根寫入文件sqrttable.txt
#include<iostream>#include<fstream>#include<cmath>usingnamespacestd;voidmain(){doublex;ofstreamout;//定義一個(gè)輸出流對(duì)象
out.open("sqrttable.txt");//打開文本文件sqrttable.txtfor(x=1;x<=100;x++)
out<<x<<'\t'<<sqrt(x)<<endl;//將結(jié)果寫入文件
out.close();//關(guān)閉文件}例
編寫一個(gè)程序,用于顯示一個(gè)文本文件#include<iostream>#include<fstream>usingnamespacestd;voidmain(){ charfilename[40],line[80]; ifstreaminfile;
cout<<"Pleaseinputafilename:"; cin>>filename;//A
infile.open(filename);//B如果打開不成功,
infile為0if(!infile)
{ cout<<"Cannotopenfile:"<<filename<<endl; exit(1);}while(infile.getline(line,80))//讀入一行
cout<<line<<endl;infile.close();//顯示一行
}改寫為:infile.unsetf(ios::skipws);//設(shè)置不跳過空白字符while(infile>>ch)//讀入一個(gè)字符
cout<<ch;//顯示一個(gè)字符例
從一個(gè)文本文件source.txt中讀入若干整數(shù),用選擇法將這些數(shù)據(jù)排成升序,將排序后的結(jié)果寫入另一個(gè)文件文本文件target.txt中事前準(zhǔn)備數(shù)據(jù)文件:source.txt
#include<iostream>#include<fstream>usingnamespacestd;voidsort(int*a,intn)//一般的選擇法排序函數(shù){ inti,j,p,t; for(i=0;i<n-1;i++) { p=i; for(j=i+1;j<n;j++) if(a[j]<a[p]) p=j; if(p!=i) {t=a[i];a[i]=a[p];a[p]=t;} }}voidmain(){ inta[100],i,n; fstreamin,out;
in.open("c:\\source.txt",ios::in); if(!in) { cout<<"Cannotopensource.txt!"<<endl; exit(1);} out.open("c:\\target.txt",ios::out); if(!out) { cout<<"Cannotopentarget.txt!"<<endl; exit(2);} i=0; while(in>>a[i])i++;//循環(huán)結(jié)束后,i是整數(shù)的個(gè)數(shù)
sort(a,i); n=i; for(i=0;i<n;i++) out<<a[i]<<endl; in.close(); out.close();}
文件讀寫
---二進(jìn)制文件(隨機(jī)存取文件)
二進(jìn)制文件以基本類型數(shù)據(jù)在內(nèi)存的二進(jìn)制表示形式存放數(shù)據(jù),不對(duì)寫入或讀出的數(shù)據(jù)做格式轉(zhuǎn)換;打開二進(jìn)制文件用ios::binary方式;二進(jìn)制文件的讀寫方式由程序控制;二進(jìn)制文件是隨機(jī)存取文件。13.4.5對(duì)二進(jìn)制文件的操作若在文件的打開方式中沒有特別說明,打開的文件均為ASCII碼文件,若要打開二進(jìn)制文件,則要特別說明并用特定的讀寫函數(shù)。fstreaminfile,outfile;infile.open(“inf1.dat”,ios::in|ios::binary);outfile.open(“outf1.dat”,ios::out|ios::binary);文件名輸入方式打開二進(jìn)制文件文件名輸出方式打開二進(jìn)制文件1.文件的讀寫操作(成塊讀寫)成員函數(shù):istream&istream::read(char*,int);istream&istream::read(unsignedchar*,int);istream&istream::read(signedchar*,int);ostream&ostream::write(constchar*,int);ostream&ostream::write(constunsignedchar*,int);ostream&ostream::write(constsignedchar*,int);前三個(gè)為讀取操作:將第二個(gè)參數(shù)指定的字節(jié)數(shù)讀入到以第一個(gè)參數(shù)為起始地址的內(nèi)存中。后三個(gè)為寫操作:從第一個(gè)參數(shù)為起始地址的內(nèi)存開始,將連續(xù)的第二個(gè)參數(shù)指定字節(jié)數(shù)的內(nèi)容寫到文件中。012345n-1文件指針10.5.1文件和流ios::begios::curios::end二進(jìn)制文件的順序讀寫流的狀態(tài)表示:流的內(nèi)容、長(zhǎng)度和操作位置
ostream
類中兩個(gè)操作字節(jié)數(shù)據(jù)的成員函數(shù)ofstreamoutf("test.dat",ios::out|ios::binary);inta[10]={1,2,3,4,5};for(inti=0;i<10;i++)outf.write((char*)(&a[i]),sizeof(int));outf.close();二進(jìn)制文件的順序讀寫outf.write((reinterpret_cast<char*>(a),10*sizeof(int));
istream
類中操作字節(jié)數(shù)據(jù)的成員函數(shù)
get(char&c);c=get();
getline(char*buffer,intsize,char=‘\n’);10.5.4二進(jìn)制文件istream&istream::read(char*buf,intn);從流中提取n個(gè)字節(jié)數(shù)據(jù),更新對(duì)象buf
ifstreaminf("test.dat",ios::in|ios::binary);intbuffer[10];for(intj=0;j<10;j++)inf.read((char*)&buffer[j],sizeof(int));inf.read(reinterpret_cast<char*>(buffer),10*sizeof(int));注意類型轉(zhuǎn)換二進(jìn)制文件的順序讀寫例13.14將一批數(shù)據(jù)以二進(jìn)制形式存放在磁盤文件中。#include<fstream>#include<iostream>usingnamespacestd;structstudent{charname[20];intnum;intage;charsex;};voidmain(){studentstud[3]={“Li”,1001,18,‘f’,“Fun”,1002,19,‘m’,“Wang”,1004,17,‘f’};
ofstreamoutfile(“stud.dat”,ios::out|ios::binary);if(!outfile){cerr<<″openerror!″<<endl;abort();//退出程序
}for(inti=0;i<3;i++)outfile.write((char*)&stud[i],sizeof(stud[i]));outfile.close();}可以一次輸出整個(gè)數(shù)組到磁盤文件:outfile.write((char*)&stud[0],sizeof(stud));用此方法一次可以輸出一批數(shù)據(jù),效率較高。在輸出的數(shù)據(jù)之間不必加入空格,在一次輸出之后也不必加回車換行符。在以后從該文件讀入數(shù)據(jù)時(shí)不是靠空格作為數(shù)據(jù)的間隔,而是用字節(jié)數(shù)來控制。例13.14將一批數(shù)據(jù)以二進(jìn)制形式存放在磁盤文件中例13.15將剛才以二進(jìn)制形式存放在磁盤文件中的數(shù)據(jù)讀入內(nèi)存并在顯示器上顯示。#include<fstream>#include<iostream>usingnamespacestd;structstudent{stringname;intnum;intage;charsex;};voidmain(){studentstud[3];inti;
ifstreaminfile(“stud.dat”,ios::in|ios::binary);if(!infile){cerr<<“openerror!”<<endl;abort();}
for(i=0;i<3;i++)
infile.read((char*)&stud[i],sizeof(stud[i]));
infile.close();for(i=0;i<3;i++){cout<<“NO.”<<i+1<<endl;cout<<“name:”<<stud[i].name<<endl;cout<<“num:”<<stud[i].num<<endl;cout<<“age:”<<stud[i].age<<endl;cout<<“sex:”<<stud[i].sex<<endl<<endl;}}問題:能否一次讀入文件中的全部數(shù)據(jù),如
infile.read((char*)&stud[0],sizeof(stud));
運(yùn)行時(shí)顯示器上顯示NO.1name:Linum:1001age:18sex:fNO.2name:Funnum:1001age:19sex:mNO.3name:Wangnum:1004age:17sex:f可以!infile.eof()
當(dāng)?shù)竭_(dá)文件結(jié)束位置時(shí),該函數(shù)返回一個(gè)非零值;否則返回零。fstreaminfile;infile.open(“data1.dat”,ios::in|ios::binary);if(!infile){cerr<<“OpenError!\n”;exit(1);}charstr[300];while(!infile.eof())infile.read(str,300);判斷打開是否出錯(cuò)判斷是否讀到文件尾判斷二進(jìn)制文件是否讀到文件尾?例讀入文本文件data.txt中的數(shù)據(jù),寫入二進(jìn)制文件data.bin中。voidmain(){ inta[100],n=0; ifstreaminfile("data.txt",ios::in); if(!infile) { cout<<"Cannotopeninputfile:data.txt"<<endl; exit(1); } while(!infile.eof())//eof()函數(shù)的功能?
infile>>a[n++];//讀入到數(shù)組中
infile.close(); ofstreamoutfile("data.bin",ios::out|ios::binary); if(!outfile) { cout<<"Cannotopenoutputfile:data.dat"<<endl; exit(2); } outfile.write((char*)&n,sizeof(int));//寫出元素個(gè)數(shù)
outfile.write((char*)a,n*sizeof(int));//寫出整個(gè)數(shù)組
outfile.close();}voidmain(){charfilename1[256],filename2[256];charbuff[4096];//設(shè)置輸入緩沖區(qū)cout<<”輸入源文件名:”;cin>>filename1;cout<<”輸入目的文件名:”;cin>>filename2;fstreaminfile,outfile;infile.open(filename1,ios::in|ios::binary);outfile.open(filename2,ios::out|ios::binary);intn;while(!infile.eof()){ //文件不結(jié)束,繼續(xù)循環(huán)
infile.read(buff,4096); //一次讀4096個(gè)字節(jié)
n=infile.gcount(); //取實(shí)際讀的字節(jié)數(shù)
outfile.write(buff,n); //按實(shí)際讀的字節(jié)數(shù)寫入文件
}infile.close();outfile.close();}
實(shí)現(xiàn)兩個(gè)二進(jìn)制文件拷貝的程序......文件內(nèi)容讀寫位置指針讀寫數(shù)據(jù)后自動(dòng)移動(dòng)讀寫位置指針istream類和ostream類提供成員函數(shù),控制讀寫位置指針的移動(dòng),實(shí)現(xiàn)文件的隨機(jī)讀寫。文件剛打開時(shí):二進(jìn)制文件的隨機(jī)讀寫012345n-1文件指針10.5.1文件和流ios::beg文件結(jié)束ios::curios::end二進(jìn)制文件的隨機(jī)讀寫流的狀態(tài)表示:流的內(nèi)容、長(zhǎng)度和操作位置二進(jìn)制文件的隨機(jī)讀寫隨機(jī)訪問流012345n-1ios::begios::curios::endios::seek_dir值:cur
相對(duì)于當(dāng)前讀指針?biāo)付ǖ漠?dāng)前位置beg
相對(duì)于流的開始位置end
相對(duì)于流的結(jié)尾處enumios::seek_dir{beg=0;cur=1,end=2};
istream&istream::seekg
(longpos);
讀指針從流的起始位置向后移動(dòng)由pos指定字節(jié)
istream&istream::seekg
(longoff,ios::seek_dir);
讀指針從流的seek_dir位置移動(dòng)
off指定字節(jié)istream類操作流讀指針的成員函數(shù)10.5.4二進(jìn)制文件long&istream::
tellg();
返回讀指針當(dāng)前所指位置值二進(jìn)制文件的隨機(jī)讀寫例如:
istreaminput; ……input.seekg(-10,ios::cur);
//讀指針以當(dāng)前位置為基準(zhǔn),向前移動(dòng)10個(gè)字節(jié)begendcurcur10.5.4二進(jìn)制文件istream類操作流讀指針的成員函數(shù)二進(jìn)制文件的隨機(jī)讀寫例如:
istreaminput; ……begendcurinput.seekg(10,ios::beg);//讀指針從流的開始位置,向后移動(dòng)10個(gè)字節(jié)函數(shù) seekg(n);等價(jià)seekg(n,ios::beg);cur10.5.4二進(jìn)制文件istream類操作流讀指針的成員函數(shù)二進(jìn)制文件的隨機(jī)讀寫例如:
istreaminput; ……begendcurcurinput.seekg(-10,ios::end);//讀指針從流的結(jié)尾,向前移動(dòng)10個(gè)字節(jié)istream類操作流讀指針的成員函數(shù)二進(jìn)制文件的隨機(jī)讀寫Eg:
istreaminput; longpos=input.tellg(); //獲取當(dāng)前位置指針
input>>number; //讀入一個(gè)整數(shù),指針后移4字節(jié)
……input.seekg(pos); //指針返回原來位置
input>>number; //重讀該整數(shù)begendcur…i-1ii+1…200311istream類操作流讀指針的成員函數(shù)二進(jìn)制文件的隨機(jī)讀寫
ostream&ostream::seekp(longpos)
溫馨提示
- 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ì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 2025年度新能源汽車生產(chǎn)合作協(xié)議范本正規(guī)范本
- 綠色循環(huán)農(nóng)業(yè)新模式策略及實(shí)施路徑
- 2024年監(jiān)理服務(wù)居間代理協(xié)議格式版B版
- 2021-2026年中國(guó)民用機(jī)場(chǎng)行業(yè)發(fā)展監(jiān)測(cè)及投資戰(zhàn)略規(guī)劃研究報(bào)告
- 2024年甲乙雙方關(guān)于二手房買賣的貸款擔(dān)保合同3篇
- 2024消防工程合同-消防水池及消防泵房改造3篇
- 二零二五年倉(cāng)儲(chǔ)租賃合同(含倉(cāng)儲(chǔ)技術(shù)支持)3篇
- 二零二五年度企業(yè)形象設(shè)計(jì)與品牌管理合作合同3篇
- 二零二五年度VOCs減排設(shè)備運(yùn)維與技術(shù)服務(wù)合同3篇
- 二零二五年度保險(xiǎn)代理居間保險(xiǎn)代理人激勵(lì)機(jī)制合同2篇
- 審計(jì)常用法規(guī)培訓(xùn)課件
- 健康指南知己知彼了解你的身體質(zhì)量指數(shù)BMI
- 主題二:擁軍優(yōu)屬心連心 課件 2023-2024學(xué)年廣州版初中勞動(dòng)技術(shù)九年級(jí)下冊(cè)
- 海洋技術(shù)與海洋裝備發(fā)展
- 智慧火電廠整體解決方案
- 電廠鍋爐爐膛煙道內(nèi)部作業(yè)三措兩案
- 收費(fèi)站(所)事故隱患排查清單
- 駕駛證學(xué)法減分(學(xué)法免分)題庫(kù)及答案(200題完整版)
- 高績(jī)效教練的讀書心得分享
- 軟管出廠檢測(cè)報(bào)告
- 公司業(yè)務(wù)流程與工作流程介紹
評(píng)論
0/150
提交評(píng)論