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