版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
第七章輸入輸出流7.1輸入輸出基本概念7.2標(biāo)準(zhǔn)輸出流7.3標(biāo)準(zhǔn)輸入流7.4對(duì)數(shù)據(jù)文件的操作與文件流*7.5字符串流7.1輸入輸出基本概念7.1.1輸入輸出的邏輯形式7.1.2輸入輸出的分類7.1.3輸入輸出的類庫結(jié)構(gòu)7.1.1輸入輸出的邏輯形式例如:當(dāng)鍵入字符時(shí),就可認(rèn)為字符從鍵盤流入程序的數(shù)據(jù)結(jié)構(gòu)中;當(dāng)寫入磁盤文件時(shí),也可認(rèn)為程序流到磁盤上。把接收存放輸出數(shù)據(jù)的地方叫做目標(biāo),把輸入數(shù)據(jù)來自的地方叫做源,C++將數(shù)據(jù)從源到目的端的傳送形象地看做一個(gè)“流”。設(shè)備內(nèi)部程序數(shù)據(jù)輸入流輸出流數(shù)據(jù)設(shè)備設(shè)備包括:(1)磁盤文件(2)設(shè)備文件(如鍵盤、顯示器、打印機(jī)等)在輸出輸出過程中會(huì)經(jīng)過內(nèi)存緩沖區(qū)設(shè)備內(nèi)部程序數(shù)據(jù)輸入流輸出流數(shù)據(jù)設(shè)備內(nèi)存緩沖區(qū)內(nèi)存緩沖區(qū)引入緩沖的目的是解決CPU的運(yùn)行速度和外設(shè)操作速度不匹配的矛盾。如輸出時(shí)先寫入緩沖區(qū),再成批輸出。成批寫出數(shù)據(jù)比一個(gè)一個(gè)寫出數(shù)據(jù)節(jié)約時(shí)間。一般地,緩沖區(qū)在內(nèi)存中。7.1.2輸入輸出的分類(1)標(biāo)準(zhǔn)的輸入輸出從鍵盤輸入數(shù)據(jù),輸出到顯示器屏幕。簡(jiǎn)稱標(biāo)準(zhǔn)I/O。(2)文件的輸入輸出以外存磁盤文件為對(duì)象進(jìn)行輸入和輸出,即從磁盤文件輸入數(shù)據(jù),數(shù)據(jù)輸出到磁盤文件。簡(jiǎn)稱文件I/O。(3)字符串輸入輸出對(duì)內(nèi)存中指定的空間進(jìn)行輸入和輸出。通常指定一個(gè)字符數(shù)組作為存儲(chǔ)空間(實(shí)際上可以利用該空間存儲(chǔ)任何信息)。這種輸入和輸出稱為字符串輸入輸出,簡(jiǎn)稱串I/O。7.1.3輸入輸出的類庫結(jié)構(gòu)C++把與輸入和輸出有關(guān)的操作定義為一個(gè)類體系,放在一個(gè)系統(tǒng)庫里(稱為流庫),供用戶調(diào)用。流庫中的類稱為流類(streamclass)。用流類定義的對(duì)象稱為流對(duì)象。流類具有兩個(gè)平行的基類即streambuf類和ios類,所有其它的流類都是從它們直接或間接地派生出來的。7.1.3輸入輸出的類庫結(jié)構(gòu)C++流庫主要由兩個(gè)流類層次組成:以streambuf類為父類的類層次主要用于管理流的緩沖區(qū)。以ios類為父類的類層次實(shí)現(xiàn)了各種格式化的輸入/輸出控制方法。1:標(biāo)準(zhǔn)I/O的流類的體系2:文件I/O的流類的體系標(biāo)準(zhǔn)I/O的流類的體系通用輸出流基類通用輸入輸出流基類cin為istream類的對(duì)象cout、cerr、clog為ostream類的對(duì)象iosistreamiostreamostreamstreambuf一個(gè)指針成員指向該類對(duì)象通用輸入流基類抽象緩沖區(qū)基類流基類需要包含頭文件:iostream通用輸入輸出流基類文件I/O的流類的體系iosistreamiostreamostreamstreambufifstreamofstreamfstreamfilebuf完成從文件提取數(shù)據(jù)完成向文件插入數(shù)據(jù)完成提取插入操作完成文件緩沖區(qū)管理一個(gè)指針成員指向該類對(duì)象通用輸出流基類通用輸入流基類抽象緩沖區(qū)基類流基類需要包含頭文件:fstream7.2標(biāo)準(zhǔn)輸出流標(biāo)準(zhǔn)輸出流是流向標(biāo)準(zhǔn)輸出設(shè)備(顯示器)的數(shù)據(jù)。流庫中已經(jīng)預(yù)先定義了cout、cerr和clog三個(gè)標(biāo)準(zhǔn)輸出流對(duì)象。通過包含頭文件“iostream”就可以使用這三個(gè)對(duì)象。7.2.1cout,cerr和clog流1.cout流對(duì)象2.cerr流對(duì)象3.clog流對(duì)象1cout流對(duì)象作用:可以將不同類型的數(shù)據(jù)輸出到屏幕上,如:cout<<‘A’<<12.2<<15;cout對(duì)象為什么可以這樣使用?因?yàn)樵趏stream中用運(yùn)算符重載實(shí)現(xiàn)了多種數(shù)據(jù)類型的標(biāo)準(zhǔn)輸入輸出。而cout是ostream的對(duì)象。C++對(duì)基本的數(shù)據(jù)類型,均定義了重載運(yùn)算符<<classostream:virtualpublicios{public:……ostream&operator<<(char*);//字符串輸出重載函數(shù)……ostream&operator<<(char&);//字符輸出重載函數(shù)……ostream&operator<<(int&);//
整數(shù)輸出重載函數(shù)……ostream&operator<<(double&);//實(shí)型數(shù)據(jù)輸出重載函數(shù)……};//此處代碼僅僅是示意,實(shí)際的ostream是類模板,代碼比較復(fù)雜2.cerr流對(duì)象cerr流對(duì)象是標(biāo)準(zhǔn)出錯(cuò)流。它不經(jīng)過緩沖區(qū)直接向顯示器輸出出錯(cuò)信息。3.clog流對(duì)象
clog流對(duì)象也是標(biāo)準(zhǔn)出錯(cuò)流,clog是帶緩沖版本的標(biāo)準(zhǔn)出錯(cuò)流。例7.1編寫程序,從鍵盤輸入a,b,c的值求解一元二次方程。如果a=0或判別式的值<0,輸出出錯(cuò)信息。關(guān)于這三者的區(qū)別其實(shí)相當(dāng)復(fù)雜,書上介紹的三者的區(qū)別并不完全正確,有興趣的同學(xué)可以參考網(wǎng)上的分析文章:“cout/cerr/clog之異同極其重定向”“clog,cout,cerr輸出機(jī)制”。輸入方程的系數(shù)a,b,ca=0TF報(bào)告輸入系數(shù)a的值等于0,出錯(cuò)!b2-4ac<0TF報(bào)告判別式的值小于0,出錯(cuò)!分別計(jì)算一元二次方程的兩個(gè)根X1和X2。NS流程圖#include<iostream>usingnamespacestd;intmain(){floata,b,c,disc;cout<<"請(qǐng)輸入a,b,c:";cin>>a>>b>>c;if(a==0)cerr<<"a等于0,錯(cuò)誤!"<<endl;elseif((disc=b*b-4*a*c)<0)
cerr<<"判別式b*b-4*a*c<0<<endl;else{
cout<<"x1="<<(-b+sqrt(disc))/(2*a)<<endl;
cout<<"x2="<<(-b-sqrt(disc))/(2*a)<<endl;}return0;}7.2.2格式輸出在輸出數(shù)據(jù)時(shí),如不指定格式,則采用系統(tǒng)給定的默認(rèn)格式。通過控制符或流的成員函數(shù)設(shè)置可以輸出格式。1.用控制符設(shè)置輸出格式表7.3列出了輸出格式的控制符。這些控制符大部分在頭文件iomanip中聲明,另一部分控制符的聲明包含在頭文件iostream中??刂品呛瘮?shù)。所以也可以稱為格式控制函數(shù)。例7.2用控制符控制輸出格式。resetiosflags()#include<iostream>#include<iomanip>usingnamespacestd;intmain(){inta;cout<<"inputa:";cin>>a;cout<<"dec:"<<dec<<a<<endl;cout<<"hex:"<<hex<<a<<endl;cout<<"oct:"<<setbase(8)<<a<<endl;char*pt="China";cout<<setw(10)<<pt<<endl;cout<<setfill('*')<<setw(10)<<pt<<endl;doublepi=22.0/7.0;cout<<setiosflags(ios::scientific)<<setprecision(8);cout<<"pi="<<pi<<endl;cout<<"pi="<<setprecision(4)<<pi<<endl;cout<<resetiosflags(ios::scientific);cout<<"pi="<<setiosflags(ios::fixed)<<pi<<endl;return0;}inputa:34dec:34hex:22oct:42China*****Chinapi=3.14285714e+000pi=3.1429e+000pi=3.1429請(qǐng)按任意鍵繼續(xù)...2.用流對(duì)象的成員函數(shù)控制輸出格式用于控制輸出格式的常用成員函數(shù)見表7.4流成員函數(shù)setf和控制符setiosflags括號(hào)中參數(shù)是格式標(biāo)志,在類ios中定義它是枚舉值。所以在引用這些格式標(biāo)志時(shí)要以ios::開始,格式標(biāo)志列于表7.5。例7.3用流控制成員函數(shù)輸出數(shù)據(jù)。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('*');注意:用成員函數(shù)setf()設(shè)置整數(shù)的基數(shù),必須用函數(shù)unsetf()終止后才能重新設(shè)置其他整數(shù)基數(shù)格式,否則下次設(shè)置setf()后,輸出流數(shù)據(jù)又以默認(rèn)的十進(jìn)制基數(shù)顯示。注意:用控制符setw()或者成員函數(shù)width()設(shè)置輸出數(shù)據(jù)的寬度僅僅對(duì)其后的第一個(gè)數(shù)據(jù)有效。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;}7.2.3用流成員函數(shù)put輸出字符格式:cout.put(字符/數(shù)字)[.put(…)……]如是字符,直接輸出該字符;如是數(shù)字,可以用八進(jìn)制、十進(jìn)制或十六進(jìn)制表示整數(shù),用該數(shù)字對(duì)256取模,輸出對(duì)應(yīng)的ASCII碼字符。如:cout.put('f').put(65).put(321);輸出:fAA例7.4按相反的順序輸出“BASIC”。#include<iostream>usingnamespacestd;intmain(){
char*a="BASIC";for(inti=4;i>=0;i--)cout.put(*(a+i));cout.put('\n');return0;}輸出:CISAB7.3標(biāo)準(zhǔn)輸入流標(biāo)準(zhǔn)輸入流是從標(biāo)準(zhǔn)輸入設(shè)備(鍵盤)流向內(nèi)存的數(shù)據(jù)。即從鍵盤讀取的數(shù)據(jù)。流庫中已經(jīng)預(yù)先定義了cin這個(gè)標(biāo)準(zhǔn)輸入流對(duì)象。通過包含頭文件“iostream”就可以使用這個(gè)對(duì)象。7.3.1cin流對(duì)象7.3.2輸入字符的流成員函數(shù)7.3.1cin流對(duì)象cin是istream類的對(duì)象。istream重載了基本的數(shù)據(jù)類型的流提取運(yùn)算符>>,所以可以用cin>>x;這樣的語句輸入數(shù)據(jù)至變量x中。cin是緩沖流,當(dāng)輸入一行結(jié)束按回車(Enter)時(shí),操作系統(tǒng)將輸入內(nèi)容放入輸入緩沖區(qū),然后cin從輸入緩沖區(qū)提取數(shù)據(jù)。輸入數(shù)據(jù)時(shí),在缺省的情況下,數(shù)據(jù)之間的分隔符為:<Space>鍵(空格鍵)、<Tab>鍵(制表鍵)或<Enter>鍵(回車鍵),這三個(gè)鍵通稱為空白字符。如:charc1,c2,c3;cin>>c1>>c2>>c3;程序運(yùn)行時(shí),可輸入:a<Space>b<Tab>c<Enter>
也可輸入:a<Tab>b<Tab>c<Enter>
或輸入:a<Enter>b<Enter>c<Enter>在上述情況下,三個(gè)變量c1、c2和c3獲得值均為‘a(chǎn)’、‘b’和‘c’。應(yīng)注意,最后輸入的總是回車鍵。當(dāng)遇到無效字符(文件結(jié)束符或者與變量數(shù)據(jù)類型不一致),cin流的所有操作都被終止,cin的值變?yōu)閒alse??梢愿鶕?jù)cin的值判斷流對(duì)象是否處于正常狀態(tài)。例7.5測(cè)試cin的值,判斷流對(duì)象的狀態(tài)。intmain(){floatgrade;cout<<"entergrade:";
while(cin>>grade){if(grade>=85)cout<<grade<<"GOOD!"<<endl;if(grade<60)cout<<grade<<"fail!"<<endl;cout<<"entergrade:";}cout<<"Theend."<<endl;return0;}#include<iostream>usingnamespacestd;intmain(){floatgrade;while(1){cout<<"entergrade:";cin>>grade;if(cin.good()==false)break;if(grade>=85)cout<<grade<<"GOOD!"<<endl;if(grade<60)cout<<grade<<"fail!"<<endl;}cout<<"Theend."<<endl;return0;}7.3.2輸入字符的流成員函數(shù)1.不帶參數(shù)的get函數(shù)格式:cin.get()函數(shù)的類型是字符,函數(shù)的功能是從輸入流中提取一個(gè)字符作為函數(shù)值返回。如在流中遇到文件結(jié)束符時(shí)(在鍵盤中輸入ctrl+z),返回-1。例7.6用get函數(shù)讀入字符。intmain(){charc;cout<<"enterasentence:"<<endl;
while((c=cin.get())!=EOF)cout.put(c);return0;}2.帶一個(gè)參數(shù)的get函數(shù)格式:cin.get(字符變量)功能:從輸入流中提取一個(gè)字符賦予字符變量。如遇到文件結(jié)束符就返回0。例7.6.2把例7.6改寫如下:intmain(){charc;cout<<"enterasentence:"<<endl;
while(cin.get(c)){cout.put(c);}cout<<"end"<<endl;return0;}^Z表示ctrl+Z3.帶三個(gè)參數(shù)的get函數(shù)格式:cin.get(字符指針,n,終止字符)作用:輸入字符串函數(shù)從鍵盤緩沖區(qū)提取n-1個(gè)字符,順序放入字符指針?biāo)傅淖址麛?shù)組。如果在提取過程中遇到終止字符,則終止提取。終止字符默認(rèn)為’\n’在提取的最后一個(gè)字符位置后會(huì)添加字符串結(jié)束標(biāo)志’\0’。例7.6.3intmain(){charch[20];cout<<"enterasentence:"<<endl;cin.get(ch,10,‘\n’);//與cin.get(ch,10)相同cout<<ch<<endl;return0;}
cin.get()中不帶參數(shù)和只帶一個(gè)參數(shù)的函數(shù),都是以文件結(jié)束符作為終止提取的控制符(輸入ctrl+z)。如果提取一個(gè)字符結(jié)束會(huì)把指針移到下一個(gè)字符。
cin.get()中帶三個(gè)參數(shù)的函數(shù),以字符個(gè)數(shù)或者“終止提取字符”為終止提取的控制符。如遇到終止提取字符而終止提取的,則提取字符結(jié)束后指針會(huì)指向“終止提取字符”。cin.get()函數(shù)族不忽略提取的空白字符。#include<iostream>usingnamespacestd;intmain(){charch[20];chara;
cin.get(ch,10,'/');cin.get(a);cout<<ch<<endl;cout<<a;return0;}輸入情況一:1234567890輸出結(jié)果:1234567890輸入情況二:123456/789輸出結(jié)果:123456/4.用成員函數(shù)getline讀入一行字符格式:cin.getline(字符指針,n,終止字符)函數(shù)功能與帶三個(gè)參數(shù)的get函數(shù)類似:相同點(diǎn):它們都不忽略提取過程中遇到的空白字符,當(dāng)遇到終止字符時(shí)或者達(dá)到字符個(gè)數(shù)上限時(shí)就停止提取。終止字符的默認(rèn)值是’\n’;區(qū)別:1:停止提取時(shí),cin.getline會(huì)把指針移到終止字符后相鄰的字節(jié),而帶三個(gè)參數(shù)的cin.get函數(shù)不會(huì)。2:當(dāng)在遇到終止字符前已經(jīng)達(dá)到字符個(gè)數(shù)時(shí),cin.getline會(huì)把cin的狀態(tài)置為錯(cuò)誤,而cin.get不會(huì)。cin的狀態(tài)可以用cin.good()得到,1表示正常,0表示錯(cuò)誤。intmain(intargc,char*argv[]){ charch[20]; charc1;cout<<"輸入一句話:"<<endl;cin>>ch;cout<<"第一次cin提取的字符串是:"<<ch<<endl;c1=cin.get();cout<<"第二次cin.get()提取的字符串是:"<<c1<<endl;cin.get(c1);cout<<"第三次cin.get(c1)提取的字符串是:"<<c1<<endl;cin.get(ch,20,'/');cout<<"第四次cin.get(ch,20,'/')提取的字符串是:"<<ch<<endl;cin.getline(ch,20,'/');cout<<"第五次cin.getline(ch,20,'/')提取的字符串是:"<<ch<<endl;cin.getline(ch,20,'/');cout<<"第六次cin.getline(ch,20,'/')提取的字符串是:"<<ch<<endl;return0;}#include<iostream>usingnamespacestd;intmain(){charch[20];chara;cin.getline(ch,10,'/');cout<<"cinstate:"<<cin.good()<<endl;cin.get(a);cout<<"ch:"<<ch<<endl;cout<<"a:"<<a<<endl;return0;}輸入情況一:1234567890輸出結(jié)果:cinstate:0ch:123456789a:請(qǐng)按任意鍵繼續(xù)...輸入情況二:123456/789輸出結(jié)果:cinstate:1ch:123456a:7請(qǐng)按任意鍵繼續(xù)...cin>>與cin.getline的區(qū)別
cin>>和cin.getline都具有從鍵盤緩沖區(qū)按指針?biāo)柑崛∽址墓δ?。它們有以下區(qū)別:(1)cin>>忽略起始的空白字符;而cin.getline不忽略起始的空白字符。(2)cin>>當(dāng)提取到非空白字符后,遇到空白字符時(shí)就終止提取,指針就停留在空白字符處;而cin.getline是提取到規(guī)定的終止字符或規(guī)定的字符個(gè)數(shù)后終止提取,指針停留在提取的最后一個(gè)字符后面相鄰的字節(jié)。(3)通過對(duì)>>的重載,cin可以提取其他類型的數(shù)據(jù);而cin.getline只能輸入字符串。例7.7用成員函數(shù)getline讀入一行字符。#include<iostream>usingnamespacestd;voidmain(){charch[20];cout<<"輸入一句話:"<<endl;cin>>ch;cout<<"第一次cin提取的字符串是:"<<ch<<endl;cin.getline(ch,20,'/');cout<<"第二次cin.getline提取的字符串是:"<<ch<<endl;cin.getline(ch,20);cout<<"第三次cin.getline提取的字符串是:"<<ch<<endl;}#include<iostream>usingnamespacestd;voidmain(){charch[20];cout<<"輸入一句話:"<<endl;cin>>ch;cout<<"第一次cin提取的字符串是:"<<ch<<endl;cin.get(ch,20,'/');cout<<"第二次cin.get提取的字符串是:"<<ch<<endl;cin.getline(ch,20);cout<<"第三次cin.getline提取的字符串是:"<<ch<<endl;}7.3.3istream類其他函數(shù)
eof()函數(shù)當(dāng)輸入緩沖區(qū)的指針遇到文件結(jié)束符時(shí)函數(shù)值為真,否則顯假。從鍵盤用ctrl+z輸入文件結(jié)束符。例7.8從鍵盤輸入字符串,以文件結(jié)束符作為結(jié)束標(biāo)志,逐個(gè)輸出非空格字符。#include<iostream>usingnamespacestd;voidmain(){charc;while(!cin.eof())if((c=cin.get())!='')//cout.put(c);cout<<c;}當(dāng)(!cin.eof())(c=cin.get())!=''TF輸出C7.4文件操作和文件流7.4.1ASCII文件和二進(jìn)制文件ASCII文件ASCII文件就是文本文件,每個(gè)字節(jié)表示一個(gè)字符,將內(nèi)存中的數(shù)據(jù)按照字符的ascii碼形式存放到磁盤中(以可閱讀的形式將信息保存)。二進(jìn)制文件二進(jìn)制文件是把內(nèi)存中的數(shù)據(jù)、指令按其在內(nèi)存的格式存放在磁盤上。異同點(diǎn):字符信息在內(nèi)存也是以ASCII碼形式存放,所以字符在ASCII碼文件和在二進(jìn)制文件中形式是一樣的。對(duì)于數(shù)值數(shù)據(jù),兩者是不一樣的。數(shù)值的兩種文件保存方法舉例例如,一個(gè)十進(jìn)制長(zhǎng)整數(shù)100000,在內(nèi)存中以四個(gè)字節(jié)存儲(chǔ);保存成二進(jìn)制文件:把這4個(gè)字節(jié)內(nèi)容原樣寫到文件中。保存成ASCII文件:保存字符1和5個(gè)字符0的ascii碼到文件中7.4.2ASCII文件操作
——寫文件以輸出方式打開文件用流插入符寫文件關(guān)閉文件一個(gè)例子:ofstreamoutfile(“data.txt",ios::out);outfile<<100<<endl;outfile<<99.01<<endl;outfile<<"helloworld!"<<endl;outfile.close();#include<fstream>usingnamespacestd;intmain(){
ofstreamoutfile("data.txt",ios::out);outfile<<100<<endl;outfile<<99.01<<endl;outfile<<"helloworld!"<<endl;outfile.close();return0;}以上程序會(huì)在程序當(dāng)前路徑上創(chuàng)建文件data.txt,然后在文件中寫上如下數(shù)據(jù):10099.01helloworld!//文件輸出流對(duì)象ofstream在//文件fstream中聲明7.4.2ASCII文件操作
——寫文件練習(xí):定義三個(gè)變量:英語成績(jī),數(shù)學(xué)成績(jī),語文成績(jī),由用戶輸入此三個(gè)數(shù)字,然后將這三個(gè)成績(jī)保存到文件data.txt中以空格隔開。#include<fstream>//聲明流對(duì)象ofsteam的頭文件#include<iostream>//聲明流對(duì)象cout和cin的頭文件usingnamespacestd;intmain(){
ofstreamoutfile(“data.txt”,ios::out);//定義并打開一個(gè)輸出文件流對(duì)象floatscoreEng,scoreMath,scoreChn;cout<<"請(qǐng)輸入英語成績(jī)"<<endl;cin>>scoreEng;cout<<"請(qǐng)輸入數(shù)學(xué)成績(jī)"<<endl;cin>>scoreMath;cout<<"請(qǐng)輸入語文成績(jī)"<<endl;cin>>scoreChn;outfile<<scoreEng<<''<<scoreMath<<''<<scoreChn<<endl; outfile.close();return0;}7.4.2ASCII文件操作
——寫文件注意:用ios::out方式打開一個(gè)輸出文件,若沒有該文件,則會(huì)先創(chuàng)建一個(gè)新的文件。若已有此名字的文件,則會(huì)首先清除原有內(nèi)容。舉例:想將文件data.txt中的內(nèi)容清空。#include<fstream>//聲明流對(duì)象ofsteam的頭文件usingnamespacestd;intmain(){
ofstreamoutfile("data.txt",ios::out);//定義并打開一個(gè)輸出文件流對(duì)象 outfile.close();return0;}設(shè)想一下這樣一種情景:程序在某一文件中寫入了一些數(shù)據(jù)。程序關(guān)閉后,這時(shí)候操作者發(fā)覺少錄入了一些數(shù)據(jù),需要往文件中再繼續(xù)寫入一些數(shù)據(jù)。這時(shí)候不能用ios::
out方式打開文件寫文件。需要用追加寫的方式。7.4.2ASCII文件操作
——追加寫文件以追加輸出的方式打開文件用流插入符寫文件關(guān)閉文件一個(gè)例子:假設(shè)文本文件data.txt中的數(shù)據(jù)為:10099.01helloworld!ofstreamoutfile(“data.txt",ios::app);outfile<<200<<''<<100.01<<''<<"helloworld!"<<endl;outfile.close();#include<fstream>usingnamespacestd;intmain(){ofstreamoutfile("data.txt",ios::app);//追加輸出方式outfile<<200<<''<<100.01<<''
<<"helloworld!"<<endl;outfile.close();return0;}以上程序會(huì)在文件data.txt末尾添加數(shù)據(jù),程序運(yùn)行后文件中的內(nèi)容如下:10099.01helloworld!200100.01helloworld!//文件輸出流對(duì)象ofstream在//文件fstream中聲明用ios::app方式打開一個(gè)輸出文件,會(huì)將文件指針設(shè)置到文件末尾,寫文件的時(shí)候從文件末尾開始添加數(shù)據(jù)。若文件不存在,則會(huì)先創(chuàng)建一個(gè)新的文件。7.4.2ASCII文件操作
——讀文件以輸入方式打開文件用流提取符讀文件關(guān)閉文件一個(gè)例子:假設(shè)文本文件中的數(shù)據(jù)為10099.01helloworld!ifstreaminfile("data.txt",ios::in);intnum1;infile>>num1;doublenum2;infile>>num2;chartext[20];infile>>text;infile.close();#include<fstream>#include<iostream>usingnamespacestd;intmain(){
intnum1;doublenum2;chartext[20];
ifstreaminfile("data.txt",ios::in);infile>>num1;infile>>num2;infile>>text;infile.close();cout<<num1<<''<<num2<<''<<text<<endl;return0;}以上會(huì)輸出:10099.01helloworld!//文件輸出流對(duì)象ifstream在//文件fstream中聲明7.4.2ASCII文件操作
——讀文件練習(xí):假設(shè)文本文件“data.txt”中的內(nèi)容為:858095請(qǐng)定義三個(gè)變量:英語成績(jī),數(shù)學(xué)成績(jī),語文成績(jī),將文件中的數(shù)據(jù)依次讀到這三個(gè)變量中,顯示這三個(gè)成績(jī)的值。#include<fstream>
//聲明流對(duì)象ofsteam的頭文件#include<iostream>
//聲明流對(duì)象cout和cin的頭文件usingnamespacestd;intmain(){
floatscoreEng;
floatscoreMath;
floatscoreChn;
ifstreaminfile(“data.txt”,ios::in);//定義并打開一個(gè)輸出文件流對(duì)象
infile>>scoreEng;
infile>>scoreMath;
infile>>scoreChn;
infile.close();
cout<<scoreEng<<''<<scoreMath<<''<<scoreChn<<endl;
return0;}7.4.2ASCII文件操作
——其它一些細(xì)節(jié)1:文件打開的兩種方式方法一:定義文件流對(duì)象的同時(shí)指定參數(shù),如:
ifstreaminfile("data.txt",ios::in);方法二:調(diào)用文件流對(duì)象的成員函數(shù)open,如:ifstreaminfile;infile.open("data.txt",ios::in);2:可以調(diào)用文件流對(duì)象的put,get,getline成員函數(shù)進(jìn)行讀寫。如:chartext[51];ifstreaminfile("data.txt",ios::in);infile.getline(text,50);//將文件data.txt中的第一行讀到text數(shù)組中。3:文件流對(duì)象的流插入和流提取運(yùn)算符支持標(biāo)準(zhǔn)類型的數(shù)據(jù)。對(duì)于自定義的類類型數(shù)據(jù)的文件輸入輸出操作則需要自定義“運(yùn)算符重載”函數(shù)。該重載函數(shù)通常以外部函數(shù)實(shí)現(xiàn)。7.4.2ASCII文件操作
——其它一些細(xì)節(jié)4:檢測(cè)文件打開是否失敗的方法有一些情況會(huì)造成文件打開失敗,典型的兩種情況如下:情況一:輸出方式打開一個(gè)文件時(shí),若文件是只讀屬性的。判斷方法:若文件打開失敗,則文件流對(duì)象的類型轉(zhuǎn)換函數(shù)返回false,否則返回true。情況二:輸入方式打開一個(gè)文件時(shí),若文件不存在。#include<fstream>#include<iostream>usingnamespacestd;intmain(){
ofstreamoutfile("data.txt",ios::out);
if(!outfile){cerr<<"Fileopenerror"<<endl;return-1;}outfile<<"helloworld!"<<endl;outfile.close();return0;}系統(tǒng)會(huì)自動(dòng)轉(zhuǎn)為這種執(zhí)行方式:!(outfile.operatorbool())當(dāng)data.txt文件的屬性為只讀時(shí),文件打開失敗,程序會(huì)輸出:Fileopenerror7.4.2ASCII文件操作
——綜合舉例例子:成績(jī)的輸入與輸出。1:定義一個(gè)成績(jī)類,包括數(shù)據(jù)成員:學(xué)號(hào)(字符串),英語成績(jī),數(shù)學(xué)成績(jī),語文成績(jī);包括一個(gè)帶參數(shù)的構(gòu)造函數(shù)和成績(jī)顯示函數(shù)。2:定義兩個(gè)外部函數(shù),分別重載文件流插入和流提取運(yùn)算符。3:定義一個(gè)主函數(shù):其中先定義一個(gè)成績(jī)對(duì)象,將該對(duì)象的數(shù)據(jù)寫入文件中,再定義另外一個(gè)成績(jī)對(duì)象,將文件中的數(shù)據(jù)讀取到新定義的這個(gè)成績(jī)對(duì)象。顯示這兩個(gè)對(duì)象的信息。成績(jī)類命名為Score,類圖結(jié)構(gòu)如右邊所示。id:學(xué)號(hào)scoreChn:語文成績(jī)scoreEng:英語成績(jī)scoreMath:數(shù)學(xué)成績(jī)display:成績(jī)顯示成員函數(shù)Score:構(gòu)造函數(shù)#include<fstream>#include<iostream>usingnamespacestd;classScore{private:charid[20];floatscoreEng,scoreMath,scoreChn;public:Score(char*id,floateng=0,floatmath=0,floatchn=0):scoreEng(eng),scoreMath(math),scoreChn(chn){strcpy(this->id,id);}voiddisplay(){cout<<"學(xué)號(hào):"<<id<<endl<<"英語成績(jī):"<<scoreEng<<endl<<"數(shù)學(xué)成績(jī):"<<scoreMath<<endl<<"語文成績(jī):"<<scoreChn<<endl;}}
下一步要定義兩個(gè)外部運(yùn)算符重載函數(shù),需要訪問類的私有成員,怎么辦?將外部函數(shù)定義為類的友元。
friendofstream&operator<<(ofstream&outfile,Score&score);friendifstream&operator>>(ifstream&infile,Score&score);};ofstream&operator<<(ofstream&outfile,Score&score){outfile<<score.id<<''<<score.scoreEng<<''<<score.scoreMath<<''<<score.scoreChn;//在每個(gè)數(shù)據(jù)之后增加一個(gè)空格使得數(shù)據(jù)有分割returnoutfile;}ifstream&operator>>(ifstream&infile,Score&score){infile>>score.id>>score.scoreEng>>score.scoreMath>>score.scoreChn;returninfile;}1:為什么要返回流對(duì)象,可不可以不返回值?復(fù)習(xí)一下流運(yùn)算符重載時(shí)的一些問題:為了進(jìn)行連續(xù)流插入或者流提取操作,如outfile<<score1<<score2;2:為什么不能定義為類的成員函數(shù)。雙目運(yùn)算符在重載為類的成員函數(shù)后,在使用時(shí)左操作數(shù)必須為類對(duì)象。即需要這樣寫score1<<outfile。不符合習(xí)慣用法。3:參數(shù)為何使用引用類型?若定義為類類型,則會(huì)調(diào)用拷貝構(gòu)造函數(shù)生成新的對(duì)象,增加了程序的開銷。intmain(){Scorescore1(“0”,80,90,70),score2(“1”);//定義兩個(gè)成績(jī)對(duì)象
ofstreamoutfile(“data.txt”,ios::out);//定義一個(gè)文件輸出流對(duì)象if(!outfile)//若打開失敗則結(jié)束程序{cout<<"FileopenError"<<endl;return-1;}outfile<<score1;//成績(jī)對(duì)象1寫文件outfile.close();ifstreaminfile(“data.txt”,ios::in);//定義一個(gè)文件輸入流對(duì)象if(!infile)//若打開失敗則結(jié)束程序{cout<<"FileopenError"<<endl;return-1;}infile>>score2;//將數(shù)據(jù)讀到成績(jī)對(duì)象2中
infile.close();score1.display();score2.display();return0;}程序輸出結(jié)果:學(xué)號(hào):0英語成績(jī):80數(shù)學(xué)成績(jī):90語文成績(jī):70學(xué)號(hào):0英語成績(jī):80數(shù)學(xué)成績(jī):90語文成績(jī):707.4.3二進(jìn)制文件操作read成員函數(shù)和write成員函數(shù)的原型分別是:istream&read(char*bu,intlen);ostream&write(constchar*bu,intlen);字符指針bu指向內(nèi)存要讀或?qū)懙臄?shù)據(jù)起始位置。len是一次要讀寫的數(shù)據(jù)字節(jié)個(gè)數(shù)(數(shù)據(jù)長(zhǎng)度)。調(diào)用格式:輸入文件流對(duì)象.read(內(nèi)存首地址,字節(jié)數(shù));
輸出文件流對(duì)象.write(內(nèi)存首地址,字節(jié)數(shù));二進(jìn)制文件不用流插入運(yùn)算符和流提取運(yùn)算符讀寫文件,而用成員函數(shù)read和write讀寫文件。7.4.3二進(jìn)制文件操作
——寫文件以二進(jìn)制方式打開文件用成員函數(shù)write寫文件關(guān)閉文件一個(gè)例子:ofstreamoutfile(“data.bin”,ios::binary);intnum1=100;doublenum2=99.01;chartext[20]="helloworld!";outfile.write((char*)&num1,sizeof(int));outfile.write((char*)&num2,sizeof(double));outfile.write((char*)text,sizeof(text));outfile.close();#include<fstream>usingnamespacestd;intmain(){intnum1=100;doublenum2=99.01;chartext[20]="helloworld!";
ofstreamoutfile("data.bin",ios::binary);outfile.write((char*)&num1,sizeof(int));outfile.write((char*)&num2,sizeof(double));outfile.write((char*)text,sizeof(text));outfile.close();return0;}以上程序會(huì)在程序當(dāng)前路徑上創(chuàng)建文件data.bin,然后在文件中將num1,num2,text在內(nèi)存中的二進(jìn)制數(shù)據(jù)寫入文件。//文件輸出流對(duì)象ofstream在//文件fstream中聲明7.4.3二進(jìn)制文件操作
——寫文件練習(xí):定義三個(gè)變量:英語成績(jī),數(shù)學(xué)成績(jī),語文成績(jī),由用戶輸入此三個(gè)數(shù)字,然后將這三個(gè)成績(jī)保存到二進(jìn)制文件data.bin中。#include<fstream>//聲明流對(duì)象ofsteam的頭文件#include<iostream>//聲明流對(duì)象cout和cin的頭文件usingnamespacestd;intmain(){
ofstreamoutfile(“data.bin”,ios::binary);//定義并打開一個(gè)輸出文件流對(duì)象floatscoreEng,scoreMath,scoreChn;cout<<"請(qǐng)輸入英語成績(jī)"<<endl;cin>>scoreEng;cout<<"請(qǐng)輸入數(shù)學(xué)成績(jī)"<<endl;cin>>scoreMath;cout<<"請(qǐng)輸入語文成績(jī)"<<endl;cin>>scoreChn;outfile.write((char*)&scoreEng,sizeof(float));outfile.write((char*)&scoreMath,sizeof(float));outfile.write((char*)&scoreChn,sizeof(float));outfile.close();return0;}7.4.3二進(jìn)制文件操作
——寫文件注意:用ios::binary方式打開一個(gè)輸出文件,若沒有該文件,則會(huì)先創(chuàng)建一個(gè)新的文件。若已有此名字的文件,則會(huì)首先清除原有內(nèi)容。舉例:想將文件data.bin中的內(nèi)容清空。#include<fstream>//聲明流對(duì)象ofsteam的頭文件usingnamespacestd;intmain(){ofstreamoutfile("data.bin",ios::binary);//定義并打開一個(gè)輸出文件流對(duì)象outfile.close();return0;}設(shè)想一下這樣一種情景:程序在某一文件中寫入了一些數(shù)據(jù)。程序關(guān)閉后,這時(shí)候操作者發(fā)覺少錄入了一些數(shù)據(jù),需要往文件中再繼續(xù)寫入一些數(shù)據(jù)。這時(shí)候不能用ios::
binary方式打開文件寫文件。需要用追加二進(jìn)制寫的方式。7.4.3二進(jìn)制文件操作
——追加寫文件以追加輸出和二進(jìn)制方式打開文件用成員函數(shù)write寫文件關(guān)閉文件一個(gè)例子:ofstreamoutfile(“data.bin”,ios::binary|ios::app);intnum1=100;doublenum2=99.01;chartext[20]="helloworld!";outfile.write((char*)&num1,sizeof(int));outfile.write((char*)&num2,sizeof(double));outfile.write((char*)text,sizeof(text));outfile.close();#include<fstream>usingnamespacestd;intmain(){intnum1=100;doublenum2=99.01;chartext[20]="helloworld!";
ofstreamoutfile("data.bin",ios::app|ios::binary);outfile.write((char*)&num1,sizeof(int));outfile.write((char*)&num2,sizeof(double));outfile.write((char*)text,sizeof(text));outfile.close();return0;}//文件輸出流對(duì)象ofstream在//文件fstream中聲明以上程序會(huì)在文件data.bin末尾添加數(shù)據(jù)。原有的數(shù)據(jù)不會(huì)刪除。7.4.3二進(jìn)制文件操作
——讀文件以二進(jìn)制方式打開文件用成員函數(shù)read讀文件關(guān)閉文件一個(gè)例子:假設(shè)二進(jìn)制文件中的保存有一個(gè)整數(shù)100一個(gè)雙精度數(shù)99.01和一個(gè)20個(gè)元素的字符數(shù)組helloworld!ifstreaminfile("data.txt",ios::binary);intnum1;infile.read((char*)&num1,sizeof(int));doublenum2;infile.read((char*)&num2,sizeof(double));chartext[20];infile.read((char*)text,sizeof(text));infile.close();#include<fstream>#include<iostream>usingnamespacestd;intmain(){intnum1;doublenum2;chartext[20];ifstreaminfile("data.bin",ios::binary);infile.read((char*)&num1,sizeof(int));infile.read((char*)&num2,sizeof(double));infile.read((char*)text,sizeof(text));infile.close();cout<<num1<<''<<num2<<''<<text;return0;}以上會(huì)輸出:10099.01helloworld!7.4.3二進(jìn)制文件操作
——讀文件練習(xí):假設(shè)二進(jìn)制文件“data.bin”中的內(nèi)容為:三個(gè)單精度浮點(diǎn)數(shù)的二進(jìn)制形式,兩個(gè)數(shù)字之間以空格隔開,三個(gè)數(shù)分別為85,80,95請(qǐng)定義三個(gè)變量:英語成績(jī),數(shù)學(xué)成績(jī),語文成績(jī),將文件中的數(shù)據(jù)依次讀到這三個(gè)變量中,顯示這三個(gè)成績(jī)的值。#include<fstream>//聲明流對(duì)象ofsteam的頭文件#include<iostream>//聲明流對(duì)象cout和cin的頭文件usingnamespacestd;intmain(){floatscoreEng;floatscoreMath;floatscoreChn;ifstreaminfile("data.bin",ios::binary);//定義并打開一個(gè)輸出文件流對(duì)象infile.read((char*)&scoreEng,sizeof(float));infile.read((char*)&scoreMath,sizeof(float));infile.read((char*)&scoreChn,sizeof(float));infile.close();cout<<scoreEng<<''<<scoreMath<<''<<scoreChn<<endl;return0;}7.4.3二進(jìn)制文件操作
——其它一些細(xì)節(jié)1:文件打開的兩種方式方法一:定義文件流對(duì)象的同時(shí)指定參數(shù),如:
ifstreaminfile("data.bin",ios::binary);方法二:調(diào)用文件流對(duì)象的成員函數(shù)open,如:ifstreaminfile;infile.open("data.bin",ios::binary);2:檢測(cè)文件打開是否失敗的方法判斷方法:若文件打開失敗,則文件流對(duì)象的類型轉(zhuǎn)換函數(shù)返回false,否則返回true。1和2的規(guī)則同ASCII文件的操作規(guī)則3:以可讀可寫的方式打開需要用類fstream的對(duì)象進(jìn)行操作,打開方式要寫ios::binary|ios::in|ios::out。如:fstreamiofile("data.txt",ios::binary|ios::in|ios::out);7.4.4二進(jìn)制文件操作
——隨機(jī)訪問文件二進(jìn)制文件讀寫的時(shí)候用戶可以設(shè)置讀寫的位置,在指定位置執(zhí)行讀寫操作。什么是隨機(jī)訪問?二進(jìn)制文件的讀寫位置如何指定?g:get(輸入操作)p:put(輸出操作)以字節(jié)數(shù)計(jì)量位置,有以下成員函數(shù)提供位置設(shè)置與查詢功能7.4.4二進(jìn)制文件操作
——隨機(jī)訪問文件參照位置表示以什么作為移動(dòng)起點(diǎn)。
ios::beg以文件開始為起點(diǎn),這是默認(rèn)值。
ios::cur以指針當(dāng)前位置為起點(diǎn)。
ios::end
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(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ì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 2024年度公路貨運(yùn)代理合同貨物滅損及重金屬檢驗(yàn)規(guī)定3篇
- 2024年度長(zhǎng)江中下游農(nóng)業(yè)面源污染治理承包合同2篇
- 2024年度展覽場(chǎng)地租賃合同(含文創(chuàng)產(chǎn)品銷售合作)3篇
- 2024年度高效環(huán)保型煤炭采購(gòu)與服務(wù)合同書3篇
- 2024年新能源汽車充電站停車場(chǎng)租賃及充電服務(wù)合同3篇
- 2024年度擔(dān)保公司管理規(guī)章制度實(shí)施與修訂細(xì)則合同3篇
- 2024年度經(jīng)營(yíng)權(quán)承包詳細(xì)合同模板一
- 2024年度鋼制閘門綠色制造與環(huán)保認(rèn)證合同范本3篇
- 2024年度共有產(chǎn)權(quán)住房買賣合同3篇
- 2024年度醫(yī)療機(jī)構(gòu)病人隱私保護(hù)與保密責(zé)任合同3篇
- 2024版短視頻IP打造與授權(quán)運(yùn)營(yíng)合作協(xié)議3篇
- 小學(xué)生防詐騙安全教育內(nèi)容
- 2024-2025學(xué)年上學(xué)期深圳初中地理七年級(jí)期末模擬卷3
- 中國(guó)當(dāng)代文學(xué)專題-003-國(guó)開機(jī)考復(fù)習(xí)資料
- 2024年廣東公需科目答案
- 中國(guó)馬克思主義與當(dāng)代思考題(附答案)
- (新版)征信知識(shí)競(jìng)賽基礎(chǔ)題庫(500題)
- 國(guó)內(nèi)外有關(guān)生產(chǎn)流程優(yōu)化研究發(fā)展現(xiàn)狀
- 高標(biāo)準(zhǔn)基本農(nóng)田土地整治項(xiàng)目工程施工費(fèi)預(yù)算表
- 肺栓塞的護(hù)理PPT課件
- 高速公路施工安全布控圖
評(píng)論
0/150
提交評(píng)論