
c++語言程序設(shè)計第11講
26頁第十一章 流類庫與輸入/輸出 清華大學(xué) 鄭 莉 C+語言程序設(shè)計 1 C+語言程序設(shè)計清華大學(xué) 鄭莉 本章主要內(nèi)容 lI/O流的概念 l輸出流 l輸入流 l輸入/輸出流 2 C+語言程序設(shè)計清華大學(xué) 鄭莉 I/O流的概念 l當(dāng)程序與外界環(huán)境進(jìn)行信息交換時,存在著兩個 對象,一個是程序中的對象,另一個是文件對象 l流是一種抽象,它負(fù)責(zé)在數(shù)據(jù)的生產(chǎn)者和數(shù)據(jù)的 消費(fèi)者之間建立聯(lián)系,并管理數(shù)據(jù)的流動 l程序建立一個流對象,并指定這個流對象與某個 文件對象建立連接,程序操作流對象,流對象通過 文件系統(tǒng)對所連接的文件對象產(chǎn)生作用 l讀操作在流數(shù)據(jù)抽象中被稱為(從流中)提取, 寫操作被稱為(向流中)插入 3 C+語言程序設(shè)計清華大學(xué) 鄭莉 輸出流 l最重要的三個輸出流是 ostream ofstream ostringstream 4 C+語言程序設(shè)計清華大學(xué) 鄭莉 輸出流對象 l預(yù)先定義的輸出流對象: cout 標(biāo)準(zhǔn)輸出 cerr 標(biāo)準(zhǔn)錯誤輸出,沒有緩 沖,發(fā)送給它的內(nèi)容立即被輸出 clog 類似于cerr,但是有緩 沖,緩沖區(qū)滿時被輸出 輸出流 5 C+語言程序設(shè)計清華大學(xué) 鄭莉 輸出流對象 lofstream類支持磁盤文件輸出 l如果在構(gòu)造函數(shù)中指定一個文件名,當(dāng)構(gòu)造這個文件 時該文件是自動打開的 ofstream myFile(filename,iosmode); l可以在調(diào)用默認(rèn)構(gòu)造函數(shù)之后使用open成員函數(shù)打開 文件 ofstream myFile; /聲明一個靜態(tài)輸出 文件流對象 myFile.open(filename,iosmode); /打開文件,使流對象與文件建立聯(lián)系 ofstream* pmyFile = new ofstream; /建立一個動態(tài)的輸出文件流對象 pmyFile-open(filename,iosmode); /打開文件,使流對象與文件建立聯(lián)系 輸出流 6 C+語言程序設(shè)計清華大學(xué) 鄭莉 插入運(yùn)算符() l插入()運(yùn)算符是所有標(biāo)準(zhǔn)C+數(shù)據(jù) 類型預(yù)先設(shè)計的。
l用于傳送字節(jié)到一個輸出流對象 輸出流 7 C+語言程序設(shè)計清華大學(xué) 鄭莉 控制輸出格式 l控制輸出寬度 為了調(diào)整輸出,可以通過在流中放入 setw操縱符或調(diào)用width成員函數(shù)為每個項指定 輸出寬度 l例11-1 使用width控制輸出寬度 #include using namesoace std; int main() double values = 1.23,35.36,653.7,4358.24; for(int i=0;i4;i+) cout.width(10); cout valuesi n; 輸出流 輸出結(jié)果: 1.23 35.36 653.7 4358.24 8 C+語言程序設(shè)計清華大學(xué) 鄭莉 例:使用*填充 #include using namespace std; int main() double values=1.23,35.36,653.7,4358.24; for(int i=0; i4; i+) cout.width(10); cout.fill(*); coutvaluesin; 輸出流 輸出結(jié)果: *1.23 *35.36 *653.7 *4358.24 9 C+語言程序設(shè)計清華大學(xué) 鄭莉 例11-2使用setw指定寬度 #include #include using namespace std; int main() double values=1.23,35.36,653.7,4358.24; char *names=Zoot,Jimmy,Al,Stan; for(int i=0;i4;i+) coutsetw(6)namesi setw(10)valuesi endl; 輸出流 輸出結(jié)果: Zoot 1.23 Jimmy 35.36 Al 653.7 Stan 4358.24 10 C+語言程序設(shè)計清華大學(xué) 鄭莉 例11-3設(shè)置對齊方式 #include #include using namespace std; int main() double values=1.23,35.36,653.7,4358.24; char *names=Zoot,Jimmy,Al,Stan; for(int i=0;i4;i+) coutsetiosflags(ios:left) setw(6)namesi resetiosflags(ios:left) setw(10)valuesi endl; 輸出流 輸出結(jié)果: Zoot 1.23 Jimmy 35.36 Al 653.7 Stan 4358.24 11 C+語言程序設(shè)計清華大學(xué) 鄭莉 例11-4控制輸出精度 #include #include using namespace std; int main() double values=1.23,35.36,653.7,4358.24; char *names=Zoot,Jimmy,Al,Stan; coutsetiosflags(ios:scientific); for(int i=0;i4;i+) coutsetiosflags(ios:left) setw(6)namesi resetiosflags(ios:left) setw(10)setprecision(1) valuesiendl; 輸出流 輸出結(jié)果: Zoot 1 Jimmy 4e+001 Al 7e+002 Stan 4e+003 12 C+語言程序設(shè)計清華大學(xué) 鄭莉 進(jìn)制 dec、oct和hex操縱符設(shè)置輸入和輸出 的默認(rèn)進(jìn)制。
輸出流 13 C+語言程序設(shè)計清華大學(xué) 鄭莉 輸出文件流成員函數(shù) l輸出流成員函數(shù)有三種類型: 與操縱符等價的成員函數(shù) 執(zhí)行非格式化寫操作的成員 函數(shù) 其它修改流狀態(tài)且不同于操 縱符或插入運(yùn)算符的成員函數(shù) 輸出流 14 C+語言程序設(shè)計清華大學(xué) 鄭莉 輸出文件流成員函數(shù) lopen函數(shù) 把流與一個特定的磁盤文件關(guān)聯(lián)起來 需要指定打開模式 lput函數(shù) 把一個字符寫到輸出流中 lwrite函數(shù) 把內(nèi)存中的一塊內(nèi)容寫到一個輸出文 件流中 lseekp和tellp函數(shù) 操作文件流的內(nèi)部指針 lclose函數(shù) 關(guān)閉與一個輸出文件流關(guān)聯(lián)的磁盤文 件 l錯誤處理函數(shù) 在寫到一個流時進(jìn)行錯誤處理 輸出流 15 C+語言程序設(shè)計清華大學(xué) 鄭莉 例11-5向文件輸出 #include using namespace std; struct Date int mo,da,yr; ; int main() Date dt = 6,10,92; ofstream tfile(date.dat,ios:binary); tfile.write(char *) tfile.close(); 輸出流 16 C+語言程序設(shè)計清華大學(xué) 鄭莉 二進(jìn)制輸出文件 l以通常方式構(gòu)造一個流,然后使用 setmode成員函數(shù),在文件打開后改變 模式。
l使用ofstream構(gòu)造函數(shù)中的模式參量 指定二進(jìn)制輸出模式 l使用二進(jìn)制操作符代替setmode成員函 數(shù):ofs ) l提取運(yùn)算符()對于所有標(biāo)準(zhǔn)C+數(shù) 據(jù)類型都是預(yù)先設(shè)計好的 l是從一個輸入流對象獲取字節(jié)最容易 的方法 lios類中的很多操縱符都可以應(yīng)用于輸 入流但是只有少數(shù)幾個對輸入流對象 具有實際影響,其中最重要的是進(jìn)制操 縱符dec、oct和hex 輸入流 20 C+語言程序設(shè)計清華大學(xué) 鄭莉 輸入流成員函數(shù) lopen函數(shù)把該流與一個特定磁盤文件相關(guān)聯(lián) lget函數(shù)的功能與提取運(yùn)算符()很相像,主要的不 同點(diǎn)是get函數(shù)在讀入數(shù)據(jù)時包括空白字符第6章介 紹過) lgetline的功能是從輸入流中讀取多個字符,并且允許 指定輸入終止字符,讀取完成后,從讀取的內(nèi)容中刪除 終止字符第6章介紹過) lread成員函數(shù)從一個文件讀字節(jié)到一個指定的內(nèi)存區(qū) 域,由長度參數(shù)確定要讀的字節(jié)數(shù) 如果給出長度參數(shù),當(dāng)遇到文件結(jié)束或者在文本模式文 件中遇到文件結(jié)束標(biāo)記字符時結(jié)束讀取 輸入流 21 C+語言程序設(shè)計清華大學(xué) 鄭莉 輸入流成員函數(shù) lseekg函數(shù)用來設(shè)置輸入文件流中讀 取數(shù)據(jù)位置的指針。
ltellg函數(shù)返回當(dāng)前文件讀指針的位置 lclose函數(shù)關(guān)閉與一個輸入文件流關(guān)聯(lián) 的磁盤文件 輸入流 22 C+語言程序設(shè)計清華大學(xué) 鄭莉 例11-9 設(shè)置位置指針 #include #include using namespace std; int main() char ch; ifstream tfile(payroll,ios:binary|ios:nocreate); if(tfile) tfile.seekg(8); while(tfile.good() tfile.get(ch); if (!ch) break; coutch; else coutERROR: Cannot open file payroll.endl; tfile.close(); 輸入流 23 C+語言程序設(shè)計清華大學(xué) 鄭莉 例11-8 從文件讀二進(jìn)制記錄 #include #include #include using namespace std; int main() struct double salary; char name23; employee; ifstream is(payroll,ios:binary|ios:nocreate); if (is) is.read(char *) coutemployee.name employee.salaryendl; else coutERROR: Cannot open file payroll.endl; is.close(); 輸入流 24 C+語言程序設(shè)計清華大學(xué) 鄭莉 例11-10 讀文件并顯示其中空格的位置 #include #include using namespace std; int main() char ch; ifstream tfile(payroll,ios:binary|ios:nocreate); if(tfile) while(tfile.good() streampos here = tfile.tellg(); tfile.get(ch); if(ch= ) coutnPosition here is a space; else coutERROR: Cannot open file payroll.endl; tfile.close(); 輸入流 25 C+語言程序設(shè)計清華大學(xué) 鄭莉 小結(jié)與復(fù)習(xí)建議 l主要內(nèi)容 I/O流的概念、輸出流、輸入 流、輸入/輸出流。
l達(dá)到的目標(biāo) 理解I/O流的概念,學(xué)會使用 I/O流類庫實現(xiàn)文件輸入/輸出及格式 控制 l實驗任務(wù) 實驗十一 26 。



![[精編]吳教人[]13號](/Images/s.gif)








