C程序設(shè)計(jì)語(yǔ)言揣錦華第9章流類庫(kù)與輸入輸出.ppt
《C程序設(shè)計(jì)語(yǔ)言揣錦華第9章流類庫(kù)與輸入輸出.ppt》由會(huì)員分享,可在線閱讀,更多相關(guān)《C程序設(shè)計(jì)語(yǔ)言揣錦華第9章流類庫(kù)與輸入輸出.ppt(62頁(yè)珍藏版)》請(qǐng)?jiān)谘b配圖網(wǎng)上搜索。
第9章流類庫(kù)與輸入 輸出 9 1輸入 輸出標(biāo)準(zhǔn)流類9 2文件流類9 3串流類9 4控制符 9 1輸入 輸出標(biāo)準(zhǔn)流類 9 1 1輸入 輸出流的概念就像C語(yǔ)言一樣 C 語(yǔ)言中也沒(méi)有輸入 輸出語(yǔ)句 C 的I O是以字節(jié)流的形式實(shí)現(xiàn)的 每一個(gè)C 編譯系統(tǒng)都帶有一個(gè)面向?qū)ο蟮妮斎?輸出軟件包 這就是I O流類庫(kù) 其中 流是I O流類的中心概念 到目前為止 我們一直在使用它 所謂流 是指數(shù)據(jù)從一個(gè)對(duì)象流向另一個(gè)對(duì)象 在C 程序中 數(shù)據(jù)可以從鍵盤流入到程序中 也可以從程序中流向屏幕或磁盤文件 把數(shù)據(jù)的流動(dòng)抽象為 流 流在使用前要被建立 使用后要被刪除 還要使用一些特定的操作從流中獲取數(shù)據(jù)或向流中添加數(shù)據(jù) 從流中獲取數(shù)據(jù)的操作稱為提取操作 向流中添加數(shù)據(jù)的操作稱為插入操作 流實(shí)際上就是一個(gè)字節(jié)序列 在輸入操作中 字節(jié)從輸入設(shè)備 如鍵盤 磁盤 網(wǎng)絡(luò)連接等 流向內(nèi)存 在輸出操作中 字節(jié)從內(nèi)存流向輸出設(shè)備 如顯示器 打印機(jī) 磁盤 網(wǎng)絡(luò)連接等 如圖9 1所示 在C 語(yǔ)言中 針對(duì)流的特點(diǎn) 提供了如圖9 2所示的層次結(jié)構(gòu)來(lái)描述流的行為 并給出了I O流類庫(kù)的操作 圖9 2輸入 輸出流類層次圖 表9 1I O流類列表 9 1 2輸入 輸出標(biāo)準(zhǔn)流類1 標(biāo)準(zhǔn)流的設(shè)備名由表9 1可見(jiàn) I O流的標(biāo)準(zhǔn)頭文件是iostream h 其中 ostream類通過(guò)其派生類ostream withassign支持以下預(yù)先定義的流對(duì)象 cout 標(biāo)準(zhǔn)輸出 默認(rèn)設(shè)備為屏幕 cerr 標(biāo)準(zhǔn)錯(cuò)誤輸出 沒(méi)有緩沖 發(fā)送給它的內(nèi)容立即被輸出 默認(rèn)設(shè)備為屏幕 clog 標(biāo)準(zhǔn)錯(cuò)誤輸出 有緩沖 當(dāng)緩沖區(qū)滿時(shí)被輸出 默認(rèn)設(shè)備為打印機(jī) 而istream類通過(guò)其派生類istream withassign支持預(yù)先定義的對(duì)象 cin 標(biāo)準(zhǔn)輸入 默認(rèn)設(shè)備為鍵盤 2 原理cout是ostream類的全局對(duì)象 它在頭文件iostream h中的定義如下 ostreamcout stdout 這里 stdout作為該對(duì)象構(gòu)造時(shí)的參數(shù)對(duì)應(yīng)每種基本數(shù)據(jù)類型 ostream類都存在友元 它們都在iostream h中聲明 例如 ostream 如語(yǔ)句 cout int 9 2文件流類 fstream ifstream和ofstream是文件流類 在頭文件fstream h中定義 其中 fstream是ofstream和ifstream多重繼承的子類 文件流類不是標(biāo)準(zhǔn)設(shè)備 沒(méi)有cout那樣預(yù)先定義的全局對(duì)象 文件流類支持對(duì)磁盤文件的操作 要定義一個(gè)文件流類對(duì)象 須指定文件名和打開方式 類ofstream用于執(zhí)行文件輸出 該類有以下幾個(gè)構(gòu)造函數(shù) ofstream ofstream filedescfd ofstream ofstream filedescfd char pch intnLength ofstream ofstream constchar szName intnMode ios out intnProt filebuf openprot 類ifstream用于執(zhí)行文件輸入 該類有以下幾個(gè)構(gòu)造函數(shù) ifstream ifstream filedescfd ifstream ifstream filedescfd char pch intnLength ifstream ifstream constchar szName intnMode ios in intnProt filebuf openprot 其中最常用的都是最后一個(gè)構(gòu)造函數(shù) 該函數(shù)有三個(gè)參數(shù) 第一個(gè)參數(shù)是指向要打開的文件名的字符串 后兩個(gè)參數(shù)指定文件的打開模式 文件打開模式的具體標(biāo)志見(jiàn)表9 2 可以用按位OR 運(yùn)算符組合這些標(biāo)志 它們作為枚舉器定義在ios類中 表9 2文件打開模式 打開一個(gè)輸出文件 用于在文件尾添加數(shù)據(jù)打開一個(gè)現(xiàn)存文件 用于輸入或輸出 并查找到結(jié)尾打開一個(gè)輸入文件 對(duì)于一個(gè)ofstream文件 使用ios in作為一個(gè)openmode 可避免刪除一個(gè)現(xiàn)存文件中現(xiàn)有的內(nèi)容打開一個(gè)文件 用于輸出 對(duì)于所有ofstream對(duì)象 此模式是隱含指定的如果一個(gè)文件存在 則打開它 否則該操作失敗 如果一個(gè)文件不存在 則作為新文件打開它 如果文件已存在 則該操作失敗打開一個(gè)文件 如果它已經(jīng)存在 則刪除其中原有的內(nèi)容 如果指定了ios out 但沒(méi)有指定ios ate ios app和ios in 則隱含為此模式以二進(jìn)制模式打開一個(gè)文件 默認(rèn)是文本模式 Nprot是文件保護(hù)方式 它的標(biāo)志如表9 3 表9 3文件保護(hù)方式 例9 1 向文件myfile中寫入一些信息 includevoidmain ofstreamfc c temp myfile fc Constructsanofstreamobject n Allofstreamconstructorsconstructafilebufobject n 注意 這里的文件名要說(shuō)明其路徑 要使用雙斜杠 因?yàn)镃 編譯器理解單斜杠為字符轉(zhuǎn)換符 在文件打開時(shí) 匹配了構(gòu)造函數(shù)ofstream ofstream char 只需要一個(gè)文件名 其它為默認(rèn) 打開方式默認(rèn)為ios out ios trunc 即該文件用于接受程序的輸出 如果該文件已存在 則其內(nèi)容必須先清除 否則就新建 如果要檢查文件是否打開 則須判斷成員函數(shù)fail includevoidfunc ofstreamfc myfile if fc fail fail 1 cerr erroropeningfile n return fc 若要打開一個(gè)輸入文件 則有 ifstreamfc myfile ios nocreate 當(dāng)然 也可以通過(guò)檢查fc fail 來(lái)確定文件打開是否出錯(cuò) 如果要打開一個(gè)同時(shí)用于輸入和輸出的文件 則有 fstreamfc myfile ios in ios out 9 3串流類 strstream istrstream和ostrstream是串流類 在頭文件strstrea h中定義 其中 strstream是istrstream和ostrstream多重繼承的子類 同樣 串流類也不是標(biāo)準(zhǔn)設(shè)備 它沒(méi)有cout那樣預(yù)先定義的全局對(duì)象 串流類允許將fstream類定義的文件操作應(yīng)用于存儲(chǔ)區(qū)中的字符串 即將字符串看作為設(shè)備 要定義一個(gè)串流類對(duì)象 須提供字符數(shù)組和數(shù)組大小 類ostrstream用于執(zhí)行串流輸出 該類有以下幾個(gè)構(gòu)造函數(shù) ostrstream ostrstream char pch intnLength intnMode ios out 其中比較常用的是第二個(gè)構(gòu)造函數(shù) 它有三個(gè)參數(shù) 第一個(gè)參數(shù)指出字符數(shù)組 第二個(gè)參數(shù)說(shuō)明數(shù)組的大小 第三個(gè)參數(shù)指出打開方式 類istrstream用于執(zhí)行串流輸入 該類有以下幾個(gè)構(gòu)造函數(shù) istrstream char pch istrstream char pch intnLength 這兩個(gè)構(gòu)造函數(shù)都比較常用 Char pch參數(shù)指出了字符數(shù)組 intnLength參數(shù)說(shuō)明數(shù)組的大小 當(dāng)nLength為0時(shí) 表示把istrstream類對(duì)象連接到由pch指向的以空字符結(jié)束的字符串 例如 下面的程序代碼定義一個(gè)串流類對(duì)象 并對(duì)其進(jìn)行輸入操作 charstr 50 Howareyou n chara istrstreamss str ss a cout a endl 輸出結(jié)果為H 例9 2 使用串流輸入對(duì)字符串中的數(shù)據(jù)進(jìn)行解讀 include includechar ioString char voidmain char str 100123 456 char Buf0 ioString str cout Buf0 endl char ioString char pString istrstreaminS pString 0 以ios in方式intiNumber floatfNumber inS iNumber fNumber 從串流中讀入一個(gè)整數(shù)和浮點(diǎn)數(shù)char Buf1 newchar 28 ostrstreamoutS Buf1 28 outS iNumber iNumber fNumber fNumber endl returnBuf1 程序運(yùn)行結(jié)果為iNumber 100 fNumber 123 456分析 在函數(shù)ioString 中 以pString為輸入設(shè)備 先定義一個(gè)輸入串流對(duì)象inS 從中輸入一個(gè)整數(shù)和一個(gè)浮點(diǎn)數(shù) 再開辟一個(gè)字符串空間作為輸出設(shè)備 定義一個(gè)輸出串流對(duì)象outS 將從輸入設(shè)備輸入的兩個(gè)變量的值輸出 9 4控制符 9 4 1使用流對(duì)象的成員函數(shù) 例9 3 使用width成員函數(shù)控制輸出寬度 includevoidmain doublevalues 1 44 36 47 625 7 4096 24 for inti 0 i 4 i cout width 10 cout values i n 程序運(yùn)行結(jié)果為1 4436 47625 74096 24 此例子在一列中以至少10個(gè)字符寬按右對(duì)齊方式輸出數(shù)據(jù) 從程序的輸出結(jié)果可以看到 在少于10個(gè)字符寬的數(shù)值前加入了引導(dǎo)空格 空格是默認(rèn)的填充符 當(dāng)輸出的數(shù)據(jù)不能充滿指定的寬度時(shí) 系統(tǒng)會(huì)自動(dòng)以空格填充 另外 還可以使用fill成員函數(shù)為已經(jīng)指定寬度的域設(shè)置填充字符的值 為了用星號(hào)填充數(shù)值列 我們可以將例9 3中的for循環(huán)修改如下 for inti 0 i 4 i cout width 10 cout fill cout values i endl 其輸出結(jié)果為 1 44 36 47 625 7 4096 24 9 4 2使用控制符C 的輸入 輸出流類庫(kù)提供了一些控制符 可以直接嵌入到輸入 輸出語(yǔ)句中來(lái)實(shí)現(xiàn)對(duì)I O格式的控制 它的優(yōu)點(diǎn)是程序可以直接將控制符插入流中 而不必單獨(dú)調(diào)用 表9 4中列出了常用的I O流類庫(kù)控制符 表9 4常用的I O流類庫(kù)控制符 例9 4 使用setw控制符指定寬度 include includevoidmain doublevalues 1 44 36 47 625 7 4096 24 char names Rose John Alice Mary for inti 0 i 4 i cout setw 6 names i setw 10 values i endl width成員函數(shù)在頭文件iostream h中說(shuō)明 如果帶參量使用setw n 或任何其它控制符 還必須包括頭文件iomanip h 在輸出中 字符串輸出在寬度為6的域中 整數(shù)輸出在寬度為10的域中 程序運(yùn)行結(jié)果為Rose1 44John36 47Alice625 7Mary4096 24 setw和width都不截?cái)鄶?shù)值 如果一個(gè)數(shù)值需要比set n 確定的字符數(shù)更多的字符 則該值將使用它所需要的所有字符 當(dāng)然 還要遵守該流的精度設(shè)置 setw和width僅影響緊隨其后的域 即使用setw和width設(shè)置的間隔方式并不保留其效力 在一個(gè)域輸出完后 域?qū)挾然謴?fù)成它的默認(rèn)值 必要的寬度 但其它流格式選項(xiàng)保持有效直到發(fā)生改變 例如 下面的程序代碼 cout setiosflags ios right 設(shè)置為默認(rèn)的右對(duì)齊方式 setw 5 1 setw 5 2 setw 5 3 endl cout setiosflags ios left 設(shè)置成左對(duì)齊方式 setw 5 1 setw 5 2 setw 5 3 endl cout resetiosflags ios left 關(guān)閉左對(duì)齊標(biāo)志 這段程序代碼中 是通過(guò)使用帶參數(shù)的setiosflags控制符來(lái)設(shè)置左 右對(duì)齊 參數(shù)是ios left和ios right枚舉器 該枚舉器定義在ios類中 因此 引用時(shí)必須包括ios 前綴 這里需要用resctiosflags操縱符關(guān)閉左 右對(duì)齊標(biāo)志 setiosflags不同于width和setw 它的影響是持久的 直到用resetiosflags重新恢復(fù)默認(rèn)值時(shí)為止 這段程序代碼的輸出結(jié)果為123123常用控制符和流格式控制成員函數(shù)如表9 5所示 表9 5常用控制符和流成員函數(shù) 9 5輸入 輸出成員函數(shù) 9 5 1使用成員函數(shù)輸入1 getline 函數(shù)在程序使用cin輸入時(shí) cin用空白符和行結(jié)束符將各個(gè)值分開 有時(shí)候輸入可能需要讀取一整行文本并且分開不同的域 為此 我們可以使用getline成員函數(shù) 其函數(shù)原型如下 istream 其中 第一個(gè)參數(shù)是字符數(shù)組 用于放置讀取的文本 第二個(gè)參數(shù)是本次讀取的最大字符個(gè)數(shù) 第三個(gè)參數(shù)是分隔字符 作為讀取一行結(jié)束的標(biāo)志 getline成員函數(shù)的功能是允許從輸入流中讀取多個(gè)字符 包括空白字符和行結(jié)束符 并且允許指定輸入終止字符 默認(rèn)值是換行字符 在讀取完成后 從讀取的內(nèi)容中刪除該終止字符 例9 5 為輸入流指定一個(gè)終止字符 本程序連續(xù)讀入一串字符 直到遇到字符t時(shí)停止 字符個(gè)數(shù)最多不超過(guò)99個(gè) 程序中的t是大小寫敏感的 includevoidmain charline 100 cout Typealineterminatedby t endl cin getline line 100 t cout line endl 2 get 函數(shù)在輸入時(shí) 有些時(shí)候需要執(zhí)行每次只輸入單個(gè)字符的操作 我們可以使用get 成員函數(shù)來(lái)完成 get 函數(shù)的格式如下 charistream get 例9 6 循環(huán)讀入字符 直到鍵入一個(gè)y字符 或遇到文件尾 includevoidmain charletter while cin eof letter cin get if letter y cout y bemet break cout letter get 函數(shù)還有一種形式可以輸入一系列字符 直到輸入流中出現(xiàn)結(jié)束符或所讀字符個(gè)數(shù)已達(dá)到要求讀的字符個(gè)數(shù) 這時(shí) get 函數(shù)的函數(shù)原型如下 istream 例如 下面程序輸入一系列字符 將前24個(gè)字符輸出 includevoidmain charline 25 cout cin get line 25 cout line 9 5 2使用成員函數(shù)輸出 例9 7 使用put 成員函數(shù) 在屏幕上顯示字母表中的字母 includevoidmain charletter for letter A letter Z letter cout put letter 程序運(yùn)行結(jié)果為ABCDEFGHIJKMNOPQRSTUVWXYZ也可以像下面那樣在一條語(yǔ)句中連續(xù)調(diào)用put 函數(shù) cout put A put n 該語(yǔ)句在輸出字符A后輸出一個(gè)新?lián)Q行符 還可以用ASCII碼值表達(dá)式調(diào)用put 函數(shù) cout put 65 該語(yǔ)句也輸出字符A 9 6用戶自定義類型的輸入 輸出 例9 8 用戶自定義的插入運(yùn)算符和提取運(yùn)算符 includeclassPhoneNumber private charnationCode 4 charareaCode 4 charphoneCode 8 public friendostream istream voidmain PhoneNumberphone cout phone cout Thephonenumberenteredwas n phone endl 程序運(yùn)行結(jié)果為輸入 086 029 1234567Thephonenumberenteredwas 086 029 1234567該程序?yàn)樘幚碛脩糇远x的電話號(hào)碼類PhoneNumber的數(shù)據(jù)重載了這兩個(gè)運(yùn)算符 另外 該程序假定電話號(hào)碼的輸入是正確的 提取運(yùn)算符的參數(shù)是對(duì)istream對(duì)象的引用和對(duì)自定義類型對(duì)象的引用 返回對(duì)istream對(duì)象的引用 在該程序中 重載的提取運(yùn)算符用于把形如 086 029 5261111的電話號(hào)碼輸入到PhoneNumber類型的對(duì)象中 運(yùn)算符函數(shù)分別將電話號(hào)碼的三個(gè)部分分別讀到被引用的PhoneNumber對(duì)象的成員nationCode areaCode和phoneCode中 在運(yùn)算符函數(shù)中 被引用對(duì)象是num 在main函數(shù)中 被引用對(duì)象是phone 調(diào)用成員函數(shù)ignore 去掉了括號(hào)和破折號(hào) 運(yùn)算符函數(shù)返回istream 插入運(yùn)算符的兩個(gè)參數(shù)是對(duì)ostream對(duì)象的引用和對(duì)自定義類型 本例中為PhoneNumber 的對(duì)象的引用 返回對(duì)ostream對(duì)象的引用 在該程序中 重載的插入運(yùn)算符按輸入格式顯示類PhoneNumber的對(duì)象 該運(yùn)算符函數(shù)將電話號(hào)碼各部分顯示為字符串 因?yàn)樗鼈兪且宰址袷酱鎯?chǔ)的 類istream中的成員函數(shù)getline在結(jié)束輸入后存儲(chǔ)一個(gè)空字符 重載的運(yùn)算符函數(shù)在類PhoneNumber中被聲明為友元函數(shù) 為了能夠訪問(wèn)類中非公有成員 重載的輸入和輸出運(yùn)算符必須被聲明為類的友元 C 允許為用戶自定義類型增加新的輸入 輸出能力 而無(wú)需修改類ostream或istream中的聲明和私有數(shù)據(jù)成員 這大大提高了C 的可擴(kuò)展性- 1.請(qǐng)仔細(xì)閱讀文檔,確保文檔完整性,對(duì)于不預(yù)覽、不比對(duì)內(nèi)容而直接下載帶來(lái)的問(wèn)題本站不予受理。
- 2.下載的文檔,不會(huì)出現(xiàn)我們的網(wǎng)址水印。
- 3、該文檔所得收入(下載+內(nèi)容+預(yù)覽)歸上傳者、原創(chuàng)作者;如果您是本文檔原作者,請(qǐng)點(diǎn)此認(rèn)領(lǐng)!既往收益都?xì)w您。
下載文檔到電腦,查找使用更方便
14.9 積分
下載 |
- 配套講稿:
如PPT文件的首頁(yè)顯示word圖標(biāo),表示該P(yáng)PT已包含配套word講稿。雙擊word圖標(biāo)可打開word文檔。
- 特殊限制:
部分文檔作品中含有的國(guó)旗、國(guó)徽等圖片,僅作為作品整體效果示例展示,禁止商用。設(shè)計(jì)者僅對(duì)作品中獨(dú)創(chuàng)性部分享有著作權(quán)。
- 關(guān) 鍵 詞:
- 程序設(shè)計(jì)語(yǔ)言 揣錦華第 章流類庫(kù) 輸入輸出
鏈接地址:http://www.3dchina-expo.com/p-10962850.html