第七章 C++輸入輸出流_第1頁
第七章 C++輸入輸出流_第2頁
第七章 C++輸入輸出流_第3頁
第七章 C++輸入輸出流_第4頁
第七章 C++輸入輸出流_第5頁
已閱讀5頁,還剩77頁未讀, 繼續(xù)免費閱讀

下載本文檔

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

文檔簡介

第七章輸入輸出流7.1輸入輸出基本概念7.2標(biāo)準(zhǔn)輸出流7.3標(biāo)準(zhǔn)輸入流7.4對數(shù)據(jù)文件的操作與文件流*7.5字符串流7.1輸入輸出基本概念7.1.1輸入輸出的邏輯形式7.1.2輸入輸出的分類7.1.3輸入輸出的類庫結(jié)構(gòu)7.1.1輸入輸出的邏輯形式例如:當(dāng)鍵入字符時,就可認為字符從鍵盤流入程序的數(shù)據(jù)結(jié)構(gòu)中;當(dāng)寫入磁盤文件時,也可認為程序流到磁盤上。把接收存放輸出數(shù)據(jù)的地方叫做目標(biāo),把輸入數(shù)據(jù)來自的地方叫做源,C++將數(shù)據(jù)從源到目的端的傳送形象地看做一個“流”。設(shè)備內(nèi)部程序數(shù)據(jù)輸入流輸出流數(shù)據(jù)設(shè)備設(shè)備包括:(1)磁盤文件(2)設(shè)備文件(如鍵盤、顯示器、打印機等)在輸出輸出過程中會經(jīng)過內(nèi)存緩沖區(qū)設(shè)備內(nèi)部程序數(shù)據(jù)輸入流輸出流數(shù)據(jù)設(shè)備內(nèi)存緩沖區(qū)內(nèi)存緩沖區(qū)引入緩沖的目的是解決CPU的運行速度和外設(shè)操作速度不匹配的矛盾。如輸出時先寫入緩沖區(qū),再成批輸出。成批寫出數(shù)據(jù)比一個一個寫出數(shù)據(jù)節(jié)約時間。一般地,緩沖區(qū)在內(nèi)存中。7.1.2輸入輸出的分類(1)標(biāo)準(zhǔn)的輸入輸出從鍵盤輸入數(shù)據(jù),輸出到顯示器屏幕。簡稱標(biāo)準(zhǔn)I/O。(2)文件的輸入輸出以外存磁盤文件為對象進行輸入和輸出,即從磁盤文件輸入數(shù)據(jù),數(shù)據(jù)輸出到磁盤文件。簡稱文件I/O。(3)字符串輸入輸出對內(nèi)存中指定的空間進行輸入和輸出。通常指定一個字符數(shù)組作為存儲空間(實際上可以利用該空間存儲任何信息)。這種輸入和輸出稱為字符串輸入輸出,簡稱串I/O。7.1.3輸入輸出的類庫結(jié)構(gòu)C++把與輸入和輸出有關(guān)的操作定義為一個類體系,放在一個系統(tǒng)庫里(稱為流庫),供用戶調(diào)用。流庫中的類稱為流類(streamclass)。用流類定義的對象稱為流對象。流類具有兩個平行的基類即streambuf類和ios類,所有其它的流類都是從它們直接或間接地派生出來的。7.1.3輸入輸出的類庫結(jié)構(gòu)C++流庫主要由兩個流類層次組成:以streambuf類為父類的類層次主要用于管理流的緩沖區(qū)。以ios類為父類的類層次實現(xiàn)了各種格式化的輸入/輸出控制方法。1:標(biāo)準(zhǔn)I/O的流類的體系2:文件I/O的流類的體系標(biāo)準(zhǔn)I/O的流類的體系通用輸出流基類通用輸入輸出流基類cin為istream類的對象cout、cerr、clog為ostream類的對象iosistreamiostreamostreamstreambuf一個指針成員指向該類對象通用輸入流基類抽象緩沖區(qū)基類流基類需要包含頭文件:iostream通用輸入輸出流基類文件I/O的流類的體系iosistreamiostreamostreamstreambufifstreamofstreamfstreamfilebuf完成從文件提取數(shù)據(jù)完成向文件插入數(shù)據(jù)完成提取插入操作完成文件緩沖區(qū)管理一個指針成員指向該類對象通用輸出流基類通用輸入流基類抽象緩沖區(qū)基類流基類需要包含頭文件:fstream7.2標(biāo)準(zhǔn)輸出流標(biāo)準(zhǔn)輸出流是流向標(biāo)準(zhǔn)輸出設(shè)備(顯示器)的數(shù)據(jù)。流庫中已經(jīng)預(yù)先定義了cout、cerr和clog三個標(biāo)準(zhǔn)輸出流對象。通過包含頭文件“iostream”就可以使用這三個對象。7.2.1cout,cerr和clog流1.cout流對象2.cerr流對象3.clog流對象1cout流對象作用:可以將不同類型的數(shù)據(jù)輸出到屏幕上,如:cout<<‘A’<<12.2<<15;cout對象為什么可以這樣使用?因為在ostream中用運算符重載實現(xiàn)了多種數(shù)據(jù)類型的標(biāo)準(zhǔn)輸入輸出。而cout是ostream的對象。C++對基本的數(shù)據(jù)類型,均定義了重載運算符<<classostream:virtualpublicios{public:……ostream&operator<<(char*);//字符串輸出重載函數(shù)……ostream&operator<<(char&);//字符輸出重載函數(shù)……ostream&operator<<(int&);//

整數(shù)輸出重載函數(shù)……ostream&operator<<(double&);//實型數(shù)據(jù)輸出重載函數(shù)……};//此處代碼僅僅是示意,實際的ostream是類模板,代碼比較復(fù)雜2.cerr流對象cerr流對象是標(biāo)準(zhǔn)出錯流。它不經(jīng)過緩沖區(qū)直接向顯示器輸出出錯信息。3.clog流對象

clog流對象也是標(biāo)準(zhǔn)出錯流,clog是帶緩沖版本的標(biāo)準(zhǔn)出錯流。例7.1編寫程序,從鍵盤輸入a,b,c的值求解一元二次方程。如果a=0或判別式的值<0,輸出出錯信息。關(guān)于這三者的區(qū)別其實相當(dāng)復(fù)雜,書上介紹的三者的區(qū)別并不完全正確,有興趣的同學(xué)可以參考網(wǎng)上的分析文章:“cout/cerr/clog之異同極其重定向”“clog,cout,cerr輸出機制”。輸入方程的系數(shù)a,b,ca=0TF報告輸入系數(shù)a的值等于0,出錯!b2-4ac<0TF報告判別式的值小于0,出錯!分別計算一元二次方程的兩個根X1和X2。NS流程圖#include<iostream>usingnamespacestd;intmain(){floata,b,c,disc;cout<<"請輸入a,b,c:";cin>>a>>b>>c;if(a==0)cerr<<"a等于0,錯誤!"<<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ù)時,如不指定格式,則采用系統(tǒng)給定的默認格式。通過控制符或流的成員函數(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請按任意鍵繼續(xù)...2.用流對象的成員函數(shù)控制輸出格式用于控制輸出格式的常用成員函數(shù)見表7.4流成員函數(shù)setf和控制符setiosflags括號中參數(shù)是格式標(biāo)志,在類ios中定義它是枚舉值。所以在引用這些格式標(biāo)志時要以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ù)又以默認的十進制基數(shù)顯示。注意:用控制符setw()或者成員函數(shù)width()設(shè)置輸出數(shù)據(jù)的寬度僅僅對其后的第一個數(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ù)字,可以用八進制、十進制或十六進制表示整數(shù),用該數(shù)字對256取模,輸出對應(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這個標(biāo)準(zhǔn)輸入流對象。通過包含頭文件“iostream”就可以使用這個對象。7.3.1cin流對象7.3.2輸入字符的流成員函數(shù)7.3.1cin流對象cin是istream類的對象。istream重載了基本的數(shù)據(jù)類型的流提取運算符>>,所以可以用cin>>x;這樣的語句輸入數(shù)據(jù)至變量x中。cin是緩沖流,當(dāng)輸入一行結(jié)束按回車(Enter)時,操作系統(tǒng)將輸入內(nèi)容放入輸入緩沖區(qū),然后cin從輸入緩沖區(qū)提取數(shù)據(jù)。輸入數(shù)據(jù)時,在缺省的情況下,數(shù)據(jù)之間的分隔符為:<Space>鍵(空格鍵)、<Tab>鍵(制表鍵)或<Enter>鍵(回車鍵),這三個鍵通稱為空白字符。如:charc1,c2,c3;cin>>c1>>c2>>c3;程序運行時,可輸入:a<Space>b<Tab>c<Enter>

也可輸入:a<Tab>b<Tab>c<Enter>

或輸入:a<Enter>b<Enter>c<Enter>在上述情況下,三個變量c1、c2和c3獲得值均為‘a(chǎn)’、‘b’和‘c’。應(yīng)注意,最后輸入的總是回車鍵。當(dāng)遇到無效字符(文件結(jié)束符或者與變量數(shù)據(jù)類型不一致),cin流的所有操作都被終止,cin的值變?yōu)閒alse??梢愿鶕?jù)cin的值判斷流對象是否處于正常狀態(tài)。例7.5測試cin的值,判斷流對象的狀態(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ù)的功能是從輸入流中提取一個字符作為函數(shù)值返回。如在流中遇到文件結(jié)束符時(在鍵盤中輸入ctrl+z),返回-1。例7.6用get函數(shù)讀入字符。intmain(){charc;cout<<"enterasentence:"<<endl;

while((c=cin.get())!=EOF)cout.put(c);return0;}2.帶一個參數(shù)的get函數(shù)格式:cin.get(字符變量)功能:從輸入流中提取一個字符賦予字符變量。如遇到文件結(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.帶三個參數(shù)的get函數(shù)格式:cin.get(字符指針,n,終止字符)作用:輸入字符串函數(shù)從鍵盤緩沖區(qū)提取n-1個字符,順序放入字符指針?biāo)傅淖址麛?shù)組。如果在提取過程中遇到終止字符,則終止提取。終止字符默認為’\n’在提取的最后一個字符位置后會添加字符串結(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ù)和只帶一個參數(shù)的函數(shù),都是以文件結(jié)束符作為終止提取的控制符(輸入ctrl+z)。如果提取一個字符結(jié)束會把指針移到下一個字符。

cin.get()中帶三個參數(shù)的函數(shù),以字符個數(shù)或者“終止提取字符”為終止提取的控制符。如遇到終止提取字符而終止提取的,則提取字符結(jié)束后指針會指向“終止提取字符”。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ù)功能與帶三個參數(shù)的get函數(shù)類似:相同點:它們都不忽略提取過程中遇到的空白字符,當(dāng)遇到終止字符時或者達到字符個數(shù)上限時就停止提取。終止字符的默認值是’\n’;區(qū)別:1:停止提取時,cin.getline會把指針移到終止字符后相鄰的字節(jié),而帶三個參數(shù)的cin.get函數(shù)不會。2:當(dāng)在遇到終止字符前已經(jīng)達到字符個數(shù)時,cin.getline會把cin的狀態(tài)置為錯誤,而cin.get不會。cin的狀態(tài)可以用cin.good()得到,1表示正常,0表示錯誤。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:請按任意鍵繼續(xù)...輸入情況二:123456/789輸出結(jié)果:cinstate:1ch:123456a:7請按任意鍵繼續(xù)...cin>>與cin.getline的區(qū)別

cin>>和cin.getline都具有從鍵盤緩沖區(qū)按指針?biāo)柑崛∽址墓δ?。它們有以下區(qū)別:(1)cin>>忽略起始的空白字符;而cin.getline不忽略起始的空白字符。(2)cin>>當(dāng)提取到非空白字符后,遇到空白字符時就終止提取,指針就停留在空白字符處;而cin.getline是提取到規(guī)定的終止字符或規(guī)定的字符個數(shù)后終止提取,指針停留在提取的最后一個字符后面相鄰的字節(jié)。(3)通過對>>的重載,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ù)值為真,否則顯假。從鍵盤用ctrl+z輸入文件結(jié)束符。例7.8從鍵盤輸入字符串,以文件結(jié)束符作為結(jié)束標(biāo)志,逐個輸出非空格字符。#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文件和二進制文件ASCII文件ASCII文件就是文本文件,每個字節(jié)表示一個字符,將內(nèi)存中的數(shù)據(jù)按照字符的ascii碼形式存放到磁盤中(以可閱讀的形式將信息保存)。二進制文件二進制文件是把內(nèi)存中的數(shù)據(jù)、指令按其在內(nèi)存的格式存放在磁盤上。異同點:字符信息在內(nèi)存也是以ASCII碼形式存放,所以字符在ASCII碼文件和在二進制文件中形式是一樣的。對于數(shù)值數(shù)據(jù),兩者是不一樣的。數(shù)值的兩種文件保存方法舉例例如,一個十進制長整數(shù)100000,在內(nèi)存中以四個字節(jié)存儲;保存成二進制文件:把這4個字節(jié)內(nèi)容原樣寫到文件中。保存成ASCII文件:保存字符1和5個字符0的ascii碼到文件中7.4.2ASCII文件操作

——寫文件以輸出方式打開文件用流插入符寫文件關(guān)閉文件一個例子: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;}以上程序會在程序當(dāng)前路徑上創(chuàng)建文件data.txt,然后在文件中寫上如下數(shù)據(jù):10099.01helloworld!//文件輸出流對象ofstream在//文件fstream中聲明7.4.2ASCII文件操作

——寫文件練習(xí):定義三個變量:英語成績,數(shù)學(xué)成績,語文成績,由用戶輸入此三個數(shù)字,然后將這三個成績保存到文件data.txt中以空格隔開。#include<fstream>//聲明流對象ofsteam的頭文件#include<iostream>//聲明流對象cout和cin的頭文件usingnamespacestd;intmain(){

ofstreamoutfile(“data.txt”,ios::out);//定義并打開一個輸出文件流對象floatscoreEng,scoreMath,scoreChn;cout<<"請輸入英語成績"<<endl;cin>>scoreEng;cout<<"請輸入數(shù)學(xué)成績"<<endl;cin>>scoreMath;cout<<"請輸入語文成績"<<endl;cin>>scoreChn;outfile<<scoreEng<<''<<scoreMath<<''<<scoreChn<<endl; outfile.close();return0;}7.4.2ASCII文件操作

——寫文件注意:用ios::out方式打開一個輸出文件,若沒有該文件,則會先創(chuàng)建一個新的文件。若已有此名字的文件,則會首先清除原有內(nèi)容。舉例:想將文件data.txt中的內(nèi)容清空。#include<fstream>//聲明流對象ofsteam的頭文件usingnamespacestd;intmain(){

ofstreamoutfile("data.txt",ios::out);//定義并打開一個輸出文件流對象 outfile.close();return0;}設(shè)想一下這樣一種情景:程序在某一文件中寫入了一些數(shù)據(jù)。程序關(guān)閉后,這時候操作者發(fā)覺少錄入了一些數(shù)據(jù),需要往文件中再繼續(xù)寫入一些數(shù)據(jù)。這時候不能用ios::

out方式打開文件寫文件。需要用追加寫的方式。7.4.2ASCII文件操作

——追加寫文件以追加輸出的方式打開文件用流插入符寫文件關(guān)閉文件一個例子:假設(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;}以上程序會在文件data.txt末尾添加數(shù)據(jù),程序運行后文件中的內(nèi)容如下:10099.01helloworld!200100.01helloworld!//文件輸出流對象ofstream在//文件fstream中聲明用ios::app方式打開一個輸出文件,會將文件指針設(shè)置到文件末尾,寫文件的時候從文件末尾開始添加數(shù)據(jù)。若文件不存在,則會先創(chuàng)建一個新的文件。7.4.2ASCII文件操作

——讀文件以輸入方式打開文件用流提取符讀文件關(guān)閉文件一個例子:假設(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;}以上會輸出:10099.01helloworld!//文件輸出流對象ifstream在//文件fstream中聲明7.4.2ASCII文件操作

——讀文件練習(xí):假設(shè)文本文件“data.txt”中的內(nèi)容為:858095請定義三個變量:英語成績,數(shù)學(xué)成績,語文成績,將文件中的數(shù)據(jù)依次讀到這三個變量中,顯示這三個成績的值。#include<fstream>

//聲明流對象ofsteam的頭文件#include<iostream>

//聲明流對象cout和cin的頭文件usingnamespacestd;intmain(){

floatscoreEng;

floatscoreMath;

floatscoreChn;

ifstreaminfile(“data.txt”,ios::in);//定義并打開一個輸出文件流對象

infile>>scoreEng;

infile>>scoreMath;

infile>>scoreChn;

infile.close();

cout<<scoreEng<<''<<scoreMath<<''<<scoreChn<<endl;

return0;}7.4.2ASCII文件操作

——其它一些細節(jié)1:文件打開的兩種方式方法一:定義文件流對象的同時指定參數(shù),如:

ifstreaminfile("data.txt",ios::in);方法二:調(diào)用文件流對象的成員函數(shù)open,如:ifstreaminfile;infile.open("data.txt",ios::in);2:可以調(diào)用文件流對象的put,get,getline成員函數(shù)進行讀寫。如:chartext[51];ifstreaminfile("data.txt",ios::in);infile.getline(text,50);//將文件data.txt中的第一行讀到text數(shù)組中。3:文件流對象的流插入和流提取運算符支持標(biāo)準(zhǔn)類型的數(shù)據(jù)。對于自定義的類類型數(shù)據(jù)的文件輸入輸出操作則需要自定義“運算符重載”函數(shù)。該重載函數(shù)通常以外部函數(shù)實現(xiàn)。7.4.2ASCII文件操作

——其它一些細節(jié)4:檢測文件打開是否失敗的方法有一些情況會造成文件打開失敗,典型的兩種情況如下:情況一:輸出方式打開一個文件時,若文件是只讀屬性的。判斷方法:若文件打開失敗,則文件流對象的類型轉(zhuǎn)換函數(shù)返回false,否則返回true。情況二:輸入方式打開一個文件時,若文件不存在。#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)會自動轉(zhuǎn)為這種執(zhí)行方式:!(outfile.operatorbool())當(dāng)data.txt文件的屬性為只讀時,文件打開失敗,程序會輸出:Fileopenerror7.4.2ASCII文件操作

——綜合舉例例子:成績的輸入與輸出。1:定義一個成績類,包括數(shù)據(jù)成員:學(xué)號(字符串),英語成績,數(shù)學(xué)成績,語文成績;包括一個帶參數(shù)的構(gòu)造函數(shù)和成績顯示函數(shù)。2:定義兩個外部函數(shù),分別重載文件流插入和流提取運算符。3:定義一個主函數(shù):其中先定義一個成績對象,將該對象的數(shù)據(jù)寫入文件中,再定義另外一個成績對象,將文件中的數(shù)據(jù)讀取到新定義的這個成績對象。顯示這兩個對象的信息。成績類命名為Score,類圖結(jié)構(gòu)如右邊所示。id:學(xué)號scoreChn:語文成績scoreEng:英語成績scoreMath:數(shù)學(xué)成績display:成績顯示成員函數(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é)號:"<<id<<endl<<"英語成績:"<<scoreEng<<endl<<"數(shù)學(xué)成績:"<<scoreMath<<endl<<"語文成績:"<<scoreChn<<endl;}}

下一步要定義兩個外部運算符重載函數(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;//在每個數(shù)據(jù)之后增加一個空格使得數(shù)據(jù)有分割returnoutfile;}ifstream&operator>>(ifstream&infile,Score&score){infile>>score.id>>score.scoreEng>>score.scoreMath>>score.scoreChn;returninfile;}1:為什么要返回流對象,可不可以不返回值?復(fù)習(xí)一下流運算符重載時的一些問題:為了進行連續(xù)流插入或者流提取操作,如outfile<<score1<<score2;2:為什么不能定義為類的成員函數(shù)。雙目運算符在重載為類的成員函數(shù)后,在使用時左操作數(shù)必須為類對象。即需要這樣寫score1<<outfile。不符合習(xí)慣用法。3:參數(shù)為何使用引用類型?若定義為類類型,則會調(diào)用拷貝構(gòu)造函數(shù)生成新的對象,增加了程序的開銷。intmain(){Scorescore1(“0”,80,90,70),score2(“1”);//定義兩個成績對象

ofstreamoutfile(“data.txt”,ios::out);//定義一個文件輸出流對象if(!outfile)//若打開失敗則結(jié)束程序{cout<<"FileopenError"<<endl;return-1;}outfile<<score1;//成績對象1寫文件outfile.close();ifstreaminfile(“data.txt”,ios::in);//定義一個文件輸入流對象if(!infile)//若打開失敗則結(jié)束程序{cout<<"FileopenError"<<endl;return-1;}infile>>score2;//將數(shù)據(jù)讀到成績對象2中

infile.close();score1.display();score2.display();return0;}程序輸出結(jié)果:學(xué)號:0英語成績:80數(shù)學(xué)成績:90語文成績:70學(xué)號:0英語成績:80數(shù)學(xué)成績:90語文成績:707.4.3二進制文件操作read成員函數(shù)和write成員函數(shù)的原型分別是:istream&read(char*bu,intlen);ostream&write(constchar*bu,intlen);字符指針bu指向內(nèi)存要讀或?qū)懙臄?shù)據(jù)起始位置。len是一次要讀寫的數(shù)據(jù)字節(jié)個數(shù)(數(shù)據(jù)長度)。調(diào)用格式:輸入文件流對象.read(內(nèi)存首地址,字節(jié)數(shù));

輸出文件流對象.write(內(nèi)存首地址,字節(jié)數(shù));二進制文件不用流插入運算符和流提取運算符讀寫文件,而用成員函數(shù)read和write讀寫文件。7.4.3二進制文件操作

——寫文件以二進制方式打開文件用成員函數(shù)write寫文件關(guān)閉文件一個例子: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;}以上程序會在程序當(dāng)前路徑上創(chuàng)建文件data.bin,然后在文件中將num1,num2,text在內(nèi)存中的二進制數(shù)據(jù)寫入文件。//文件輸出流對象ofstream在//文件fstream中聲明7.4.3二進制文件操作

——寫文件練習(xí):定義三個變量:英語成績,數(shù)學(xué)成績,語文成績,由用戶輸入此三個數(shù)字,然后將這三個成績保存到二進制文件data.bin中。#include<fstream>//聲明流對象ofsteam的頭文件#include<iostream>//聲明流對象cout和cin的頭文件usingnamespacestd;intmain(){

ofstreamoutfile(“data.bin”,ios::binary);//定義并打開一個輸出文件流對象floatscoreEng,scoreMath,scoreChn;cout<<"請輸入英語成績"<<endl;cin>>scoreEng;cout<<"請輸入數(shù)學(xué)成績"<<endl;cin>>scoreMath;cout<<"請輸入語文成績"<<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二進制文件操作

——寫文件注意:用ios::binary方式打開一個輸出文件,若沒有該文件,則會先創(chuàng)建一個新的文件。若已有此名字的文件,則會首先清除原有內(nèi)容。舉例:想將文件data.bin中的內(nèi)容清空。#include<fstream>//聲明流對象ofsteam的頭文件usingnamespacestd;intmain(){ofstreamoutfile("data.bin",ios::binary);//定義并打開一個輸出文件流對象outfile.close();return0;}設(shè)想一下這樣一種情景:程序在某一文件中寫入了一些數(shù)據(jù)。程序關(guān)閉后,這時候操作者發(fā)覺少錄入了一些數(shù)據(jù),需要往文件中再繼續(xù)寫入一些數(shù)據(jù)。這時候不能用ios::

binary方式打開文件寫文件。需要用追加二進制寫的方式。7.4.3二進制文件操作

——追加寫文件以追加輸出和二進制方式打開文件用成員函數(shù)write寫文件關(guān)閉文件一個例子: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;}//文件輸出流對象ofstream在//文件fstream中聲明以上程序會在文件data.bin末尾添加數(shù)據(jù)。原有的數(shù)據(jù)不會刪除。7.4.3二進制文件操作

——讀文件以二進制方式打開文件用成員函數(shù)read讀文件關(guān)閉文件一個例子:假設(shè)二進制文件中的保存有一個整數(shù)100一個雙精度數(shù)99.01和一個20個元素的字符數(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;}以上會輸出:10099.01helloworld!7.4.3二進制文件操作

——讀文件練習(xí):假設(shè)二進制文件“data.bin”中的內(nèi)容為:三個單精度浮點數(shù)的二進制形式,兩個數(shù)字之間以空格隔開,三個數(shù)分別為85,80,95請定義三個變量:英語成績,數(shù)學(xué)成績,語文成績,將文件中的數(shù)據(jù)依次讀到這三個變量中,顯示這三個成績的值。#include<fstream>//聲明流對象ofsteam的頭文件#include<iostream>//聲明流對象cout和cin的頭文件usingnamespacestd;intmain(){floatscoreEng;floatscoreMath;floatscoreChn;ifstreaminfile("data.bin",ios::binary);//定義并打開一個輸出文件流對象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二進制文件操作

——其它一些細節(jié)1:文件打開的兩種方式方法一:定義文件流對象的同時指定參數(shù),如:

ifstreaminfile("data.bin",ios::binary);方法二:調(diào)用文件流對象的成員函數(shù)open,如:ifstreaminfile;infile.open("data.bin",ios::binary);2:檢測文件打開是否失敗的方法判斷方法:若文件打開失敗,則文件流對象的類型轉(zhuǎn)換函數(shù)返回false,否則返回true。1和2的規(guī)則同ASCII文件的操作規(guī)則3:以可讀可寫的方式打開需要用類fstream的對象進行操作,打開方式要寫ios::binary|ios::in|ios::out。如:fstreamiofile("data.txt",ios::binary|ios::in|ios::out);7.4.4二進制文件操作

——隨機訪問文件二進制文件讀寫的時候用戶可以設(shè)置讀寫的位置,在指定位置執(zhí)行讀寫操作。什么是隨機訪問?二進制文件的讀寫位置如何指定?g:get(輸入操作)p:put(輸出操作)以字節(jié)數(shù)計量位置,有以下成員函數(shù)提供位置設(shè)置與查詢功能7.4.4二進制文件操作

——隨機訪問文件參照位置表示以什么作為移動起點。

ios::beg以文件開始為起點,這是默認值。

ios::cur以指針當(dāng)前位置為起點。

ios::end

溫馨提示

  • 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)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論