




版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報或認(rèn)領(lǐng)
文檔簡介
第七章輸入輸出流
學(xué)習(xí)目標(biāo):1.理解并掌握輸入/輸出流類的基本概念,掌握標(biāo)準(zhǔn)流對象的基本概念和常見的標(biāo)準(zhǔn)流對象,掌握cin和cout重定向方法。2.掌握對輸入/輸出流進(jìn)行格式控制的常見方法,掌握常見的流操縱符和標(biāo)志字,能夠應(yīng)用相關(guān)的方法完成I/0格式控制。3.掌握cin和cout中常見成員函數(shù)的基本功能和使用方法。4.能夠綜合應(yīng)用相關(guān)函數(shù)解決應(yīng)用問題。建議學(xué)時:4學(xué)時。教師導(dǎo)讀:1.本章的核心概念是流類,學(xué)習(xí)重點(diǎn)是標(biāo)準(zhǔn)流對象cin和cout的應(yīng)用。2.在講解輸入/輸出流格式控制和常用函數(shù)時,可以設(shè)計更多的程序?qū)嵗绦驅(qū)嵗难菔竞椭v解更便于考生理解相關(guān)的知識點(diǎn)。3.本章的難點(diǎn)是如何綜合運(yùn)用cin和cout中提供的常見成員函數(shù)解決實(shí)際應(yīng)用中的問題。4.學(xué)習(xí)完本章后,應(yīng)要求考生完成實(shí)習(xí)題目8。本章在簡要介紹C++I/O流類基本概念的基礎(chǔ)上,以標(biāo)準(zhǔn)流對象cin和cout為背景,重點(diǎn)介紹I/O格式控制的常用方法,通過實(shí)例給出常見的流操縱符及使用方法、設(shè)置標(biāo)志字進(jìn)行格式控制的方式和調(diào)用成員函數(shù)的方法。結(jié)合程序?qū)嵗榻Bcin和cout中的常見成員函數(shù)的功能和使用方法。7.1流類簡介同c語言一樣,C++中也沒有輸入輸出語句,但在C++的標(biāo)準(zhǔn)庫中有一個面向?qū)ο蟮妮斎胼敵鲕浖碔/O流類庫,輸入和輸出均是通過流完成的。流是I/0流類的核心概念。C++的輸出操作是將一個對象轉(zhuǎn)換成一個字符序列,輸出到指定對象。輸入操作是從某個對象接收到一個字符序列,然后將其轉(zhuǎn)換為相應(yīng)對象所要求的格式。數(shù)據(jù)輸入和輸出的過程就是數(shù)據(jù)傳輸?shù)倪^程,數(shù)據(jù)像“水”一樣從一個地方流動到另一個地方,因此,在C++中將此過程稱為“流”。在現(xiàn)代操作統(tǒng)中,已經(jīng)將鍵盤、顯示器、打印機(jī)和通信端口等物理設(shè)備進(jìn)行了封裝,將它們作為擴(kuò)充文件進(jìn)行處理。因此,從C++程序員的角度來看,這些設(shè)備與磁盤文件是等同的,經(jīng)過這些設(shè)備的人機(jī)交互也是通過I0流類實(shí)現(xiàn)的。從更一般的意義上說,C++中凡是數(shù)據(jù)從一個地方傳輸?shù)搅硪粋€地方的操作都是流的操作.因此,一般意義下的讀操作在流數(shù)據(jù)抽象中被稱為(從流中)“提取”,寫操作被稱為(向流中)“插入”。在C++的標(biāo)準(zhǔn)類庫中,將與數(shù)據(jù)輸入/輸出相關(guān)的類統(tǒng)稱為“流類”。C++中常用的幾個流類及其關(guān)系如圖7-1所示。圖7-1中的箭頭代表派生關(guān)系。ios是抽象基類,提供輸入/輸出所需的公共操作,它派生出兩個類istream和ostream。為了避免多重繼承的二義性,從ios派生istream和ostream時,均使用了virtual關(guān)鍵字(虛繼承)。istream類提供了流的大部分輸入操作,對系統(tǒng)預(yù)定義的所有輸入流重載提取運(yùn)算符“>>”。ostream類對系統(tǒng)預(yù)定義的所有輸出流重載插入運(yùn)算符“<<”。由istream和ostream又共同派生了iostream類。表7-1列出了這些類的簡要說明和使用它們時所需包含的頭文件。類名說明包含文件抽象流基類ios流基類ios輸入流類istream通用輸入流基類和其他輸入流基類。cin是該類的對象istreamifstream文件輸入流類。用于從文件讀取數(shù)據(jù)fstream輸出流類ostream通用輸入流基類和其他輸出流基類。cout是該類的對象ostreamofstream文件輸出流類。用于向文件寫入數(shù)據(jù)fstream輸入輸出流類iostream通用輸入/輸出流基類和其他輸入/輸出流基類iostreamfstream文件輸入/輸出流類。既能從文件中讀取數(shù)據(jù),也能向文件中寫入數(shù)據(jù)fstream一般用戶只需使用類提供的公共接口即可完成流的提取和插入操作。C++的iostream類庫提供了數(shù)百種I/O功能,iostream類庫的接口部分包含在幾個頭文件中。常見的頭文件有以下3個。(1)iostream頭文件iostream包含操作所有輸入/輸出流所需的基本信息,因此大多數(shù)C++程序都應(yīng)包含這個頭文件。該文件含有4個標(biāo)準(zhǔn)流對象,提供了無格式化和格式化的I/O功能。(2)iomanip頭文件iomanip包含格式化I/O的帶參數(shù)流操縱符,可用于指定數(shù)據(jù)輸入輸出的格式。(3)fstream頭文件fstream包含處理文件的有關(guān)信息,提供建立文件、讀/寫文件的各種操作接口。7.2標(biāo)準(zhǔn)流對象流是一個抽象的概念,在進(jìn)行實(shí)際I/0操作時必須將流與一種具體的物理設(shè)備連接起來。標(biāo)準(zhǔn)流對象(也稱為標(biāo)準(zhǔn)流)是為用戶提供的常用外設(shè)與內(nèi)存之間通信的通道,對數(shù)據(jù)進(jìn)行解釋和傳輸,提供必要的數(shù)據(jù)緩沖等。標(biāo)準(zhǔn)流與標(biāo)準(zhǔn)外設(shè)之間的關(guān)系如圖7-2所示。C++在頭文件iostream中為用戶預(yù)定義了4個標(biāo)準(zhǔn)流對象,分別是cin(標(biāo)準(zhǔn)輸入流)、cout(標(biāo)準(zhǔn)輸出流)、cerr(非緩沖錯誤輸出流)和clog(緩沖錯誤輸出流)。cin與標(biāo)準(zhǔn)輸入設(shè)備(鍵盤)相關(guān)聯(lián),用于讀取數(shù)據(jù),可以被重定向?yàn)閺奈募凶x取數(shù)據(jù)。cout與標(biāo)準(zhǔn)輸出設(shè)備(顯示器)相關(guān)聯(lián),用于輸出數(shù)據(jù),可以被重定向?yàn)橄蛭募飳懭霐?shù)據(jù)。cerr與標(biāo)準(zhǔn)錯誤信息輸出設(shè)備(顯示器)相關(guān)聯(lián)(非緩沖),用干輸出出錯信息不能被重定向。clog與標(biāo)準(zhǔn)錯誤信息輸出設(shè)備相關(guān)聯(lián)(緩沖),用于輸出出錯信息,不能被重定向。在實(shí)際中,cin常用于從鍵盤輸入數(shù)據(jù),是流類istream的對象。cout常用于向屏幕輸出數(shù)據(jù),是流類ostream的對象。程序中可直接對上述4個預(yù)定義的標(biāo)準(zhǔn)流對象進(jìn)行操作,不必再像操作一般文件一樣要程序員先進(jìn)行“打開”操作,使用完成后也不需要由程序員進(jìn)行“關(guān)閉”操作(因?yàn)檫@些流類對象與文件之間的聯(lián)系是由系統(tǒng)預(yù)定義好的,可認(rèn)為系統(tǒng)已經(jīng)為每個程序都隱含進(jìn)行了對它們的打開與關(guān)閉操作)。cerr和clog的區(qū)別在于:cerr不使用緩沖區(qū),直接向顯示器輸出信息;而輸出到clog中的信息會先被存儲到緩沖區(qū)中,緩沖區(qū)滿或者刷新時才輸出到屏幕。cout可以使用重定向函數(shù)freopen進(jìn)行重定問,而cerr不能。所謂重定向,就是改變默認(rèn)的輸入來源,或改變默認(rèn)的輸出目的地。例如,cout默認(rèn)是輸出到屏幕上,但經(jīng)過重定向后可將原本輸出到屏幕上的數(shù)據(jù)變?yōu)檩敵龅轿募斜4妗V囟ㄏ蚝瘮?shù)freopen的原型如下:FILE*freopen(constchar*path,constchar*mode,FILE*stream);函數(shù)freopen()的功能是將stream按mode指定的模式重定向到路徑path指向的文件。如果重定向時發(fā)生錯誤,則關(guān)閉原來的stream,函數(shù)返回NULL。mode可以是“w”(寫)或“r”(讀)方式。[程序7-1]將標(biāo)準(zhǔn)輸出cout重定向到文件#include<iostream>usingnamespacestd;intmain(){intx,y;cin>>x>>y;freopen(“test.txt”,“w”,stdout);//將標(biāo)準(zhǔn)輸出重定向到文件test.txt,stdout代表標(biāo)準(zhǔn)輸出if(y==0) //除數(shù)為0則輸出錯誤信息cerr<<"error."<<endl;elsecout<<x<<"/"<<y<<"="<<x/y<<end;return0;}[程序說明]程序7-1中使用了重定向函數(shù)freopen(),其中第1個參數(shù)"test.txt"為文件名,第2個參數(shù)"w”代表重定向?yàn)椤皩憽狈绞剑?個參數(shù)stdout代表標(biāo)準(zhǔn)輸出。該語句的作用是將標(biāo)準(zhǔn)輸出重定向?yàn)槲募est.txt.重定向后所有對cout的輸出都不再出現(xiàn)在屏幕上,而是保存到test.txt文件中。test.txt文件會出現(xiàn)在本程序的可執(zhí)行文件所在的文件夾中。重定向僅對本程序有效,不會影響到其他程序。運(yùn)行程序7-1,輸入以下內(nèi)容:.103程序在屏幕上沒有顯示結(jié)果,但是打開文件test.txt可以看到文件中有以下內(nèi)容:10/3=3再次運(yùn)行程序7-1,然后輸入:100則在屏幕上輸出以下內(nèi)容:error.說明cout被重定向,但cerr沒有被重定向。cin也是可以被重定向的。編寫程序,將從鍵盤讀取10個整數(shù)更改為讀取文件中的前10個整數(shù)(假設(shè)文件中的整數(shù)超過10個),然后計算這些整數(shù)的平均值,見程序7-2。[程序7-2]標(biāo)準(zhǔn)輸入重定向?yàn)槲募?include<iostream>usingnamespacestd;intmain(){intx,count,sum=0;freopen("input.dat","r",stdin); //將標(biāo)準(zhǔn)輸入重定向到文件input.datfor(count=0;count<10;count++){cin>>x;sum+=x;}cout<<"前10個整數(shù)的平均值="<<1.0*sum/10<<endl;return0;}[程序說明]程序中語句“freopen("input.dat","r",stdin);”是將cin重定向到文件input.dat。這里第2個參數(shù)“r”代表重定向?yàn)椤白x”方式,第3個參數(shù)stdin代表標(biāo)準(zhǔn)輸入。假設(shè)文件input.dat中的內(nèi)容如下:581015202530405060708090100110120則運(yùn)行程序7-2的輸出結(jié)果如下:前10個整數(shù)的平均值=26.3運(yùn)行本程序,cin不再從鍵盤讀入數(shù)據(jù),而是直接從input.dat文件中讀入數(shù)據(jù)。在進(jìn)行流操作過程中,可能會因?yàn)榱髯x入完畢或設(shè)備出現(xiàn)問題而使流操作失敗。C++在ios類中定義了相關(guān)的錯誤狀態(tài)字來反映流的狀態(tài)。狀態(tài)字的每一位對應(yīng)流的一種錯誤狀態(tài),用一個對應(yīng)的標(biāo)識常量標(biāo)記。錯誤狀態(tài)字的含義見表7-2。表7-2ios中錯誤狀態(tài)字在ios類中還有幾個與流狀態(tài)相關(guān)的成員函數(shù),可在程序中直接使用。(1)返回流是否結(jié)束inteof()const;函數(shù)返回eofbit的值。當(dāng)文本文件結(jié)束時,在輸入流中會自動設(shè)置eofbit在應(yīng)用程序中可以用eof()函數(shù)測試是否到達(dá)文件尾,當(dāng)文件操作結(jié)束遇到文件尾時,函數(shù)返回1;否則返回0。在標(biāo)準(zhǔn)輸入流cin中,可以通過按下(Ctrl+Z)組合鍵表示輸入流的結(jié)束。(2)返回流是否處于正常狀態(tài)intfail()const;該函數(shù)返回failbit狀態(tài),以判斷流操作是否失敗。failbit表示發(fā)生流格式錯誤,但緩沖區(qū)中的字符沒有丟失。這種錯誤通常是可以修復(fù)的。(3)判斷流是否正常intgood()const,intoperatorvoid*();上述兩個函數(shù)的功能相似,如果eofbit、failbit和badbit全部都沒有被置位(即均為0),則返回1(true),否則返回0(false)。(4)返回流是否處于失敗狀態(tài)intbad()const;intoperatorvoid!();上述兩個函數(shù)的功能相似,只要eofbit、failbit和badbit中有一位被置位(即為1),則返回1(true),否則返回0(false)。(5)返回狀態(tài)字intrdstate()const;該函數(shù)返回流的當(dāng)前狀態(tài)。(6)恢復(fù)狀態(tài)字voidclear(intnStata=0);該函數(shù)恢復(fù)或設(shè)置狀態(tài)字。默認(rèn)值為0,即將流狀態(tài)恢復(fù)為正常。
標(biāo)識常量值含義goodbit0X00流狀態(tài)正常eofbit0X01文件結(jié)束符failbit0X02I/O操作失敗,數(shù)據(jù)未丟失,可以恢復(fù)badbit0X04非法操作,數(shù)據(jù)丟失,不可恢復(fù)修改程序7-2,從文件中讀入前10個整數(shù),若文件中的整數(shù)不足10個,則全部讀入,然后計算這些整數(shù)的平均值,見程序7-3.[程序7-3]標(biāo)準(zhǔn)輸入重定向?yàn)槲募⑴袛辔募顟B(tài)#include<iostream>usingnamespacestd;intmain(){intx,count,sum=0;freopen("input.dat","r",stdin); //將標(biāo)準(zhǔn)輸入重定向到文件input.datfor(count=0;count<10;count++) //從輸入流中讀入10個整數(shù)進(jìn)行處理{cin>>x;if(cin.eof())break; //若輸入流已經(jīng)結(jié)束則退出elsesum+=x;}cout<<"前"<<count<<"個整數(shù)的平均值="<<1.0*sum/count<<endl;return0;}[程序說明]與程序7-2相比較,最大的變化是在cin之后增加了一個判斷語句,即if(cin.eof())break;其中調(diào)用了cin的函數(shù)eof(),其含義是如果輸入流cin已經(jīng)結(jié)束則執(zhí)行break語句,使程序退出for循環(huán)。如果文件input.dat中的內(nèi)容不變:581015202530405060708090100110120則運(yùn)行程序7-3后的輸出結(jié)果如下:前10個整數(shù)的平均值=26.3如果文件input.dat中的數(shù)據(jù)個數(shù)變少了,例如:1020304050607080再次運(yùn)行程序7-3,當(dāng)程序讀入第8個數(shù)據(jù)80之后,流cin是正常的,cin.eof()的返回值為0,所以執(zhí)行語句“sum+=x;”,此時,變量sum中已經(jīng)保存了前8個數(shù)據(jù)的累加和。繼續(xù)執(zhí)行for循環(huán),此時變量count=8,for語句的條件“count<10”成立,進(jìn)入循環(huán)體,執(zhí)行語句“cin>>x;”,此時,文件中的數(shù)據(jù)已全部讀入完畢,再次讀入已經(jīng)沒有數(shù)據(jù)了,所以“cin.eof()”返回值為1,if語句的條件成立,執(zhí)行語句“break;”便程序退出循環(huán)。運(yùn)行程序7-3的輸出結(jié)果如下:前8個整數(shù)的平均值=45如果要從鍵盤上輸入一批數(shù)據(jù)并計算累加和,用組合鍵<Ctrl+Z〉結(jié)束輸入之后,屏幕給出提示信息,請用戶確認(rèn)是否真要退出。若確認(rèn)真要退出,則顯示累加和,結(jié)束程序:否則繼續(xù)讀入數(shù)據(jù),見程序7-4。[程序7-4]將從鍵盤輸入的數(shù)據(jù)進(jìn)行累加#include<iostream>usingnamespacestd;intmain(){ charch; intsum=0,count=0,x; cout<<"請輸入整數(shù)(按Ctrl+Z退出)"<<endl; do
{while(cin>>x) //使用組合鍵<Ctrl+Z>結(jié)束輸入
{sum+=x; //計算累加和
count++; } cout<<"確實(shí)要退出輸入請按Q"; cin.clear();//狀態(tài)字清0,恢復(fù)流狀態(tài)
cin>>ch; }while(toupper(ch)!='Q'); cout<<"sum="<<sum<<",count="<<count<<endl; return0;}[程序說明]程序中使用循環(huán)語句“while(cin>>x)”完成一批數(shù)據(jù)的功能,在數(shù)據(jù)輸入結(jié)束時,按下組合鍵(Ctrl+Z)結(jié)束流cin,退出while循環(huán)。然后要繼續(xù)請用戶確認(rèn)是否真要退出,此時,為了保證下次的確認(rèn)仍能起作用,必須使用clear()恢復(fù)cin的流狀態(tài)。7.3控制I/O格式不同的應(yīng)用會對數(shù)據(jù)的輸入/輸出格式提出不同的需求。例如,日常生活中涉及價格問題,一般都要求精確到分,即輸出浮點(diǎn)數(shù)要保留小數(shù)點(diǎn)后面兩位;在輸出科學(xué)計算的結(jié)果時經(jīng)常要求指數(shù)形式:在計算機(jī)專業(yè)中經(jīng)常要求按不同的進(jìn)制輸出一個整數(shù);在打印會計轉(zhuǎn)賬支票金額時為防止金額被篡改,經(jīng)常要求在金額前面打印特殊符號等。這些不同的格式要求均可在使用cout時進(jìn)行控制。C++進(jìn)行I/0格式控制的方式一般有使用流操縱符、設(shè)置標(biāo)志字和調(diào)用成員函數(shù)。一、流操縱符為方便使用,C++中對于所有的基本數(shù)據(jù)類型均設(shè)置了默認(rèn)的數(shù)據(jù)輸入輸出格式。常見數(shù)據(jù)類型的默認(rèn)I/O格式,見表7-3。表7-3C++中常見數(shù)據(jù)類型的默認(rèn)I/O格式I/O的數(shù)據(jù)類型默認(rèn)的輸入格式默認(rèn)的輸出格式short、int、long(signed、unsigned)與整型常數(shù)相同一般整數(shù)形式,負(fù)數(shù)前面有負(fù)號float、double、longdouble與浮點(diǎn)數(shù)相同浮點(diǎn)或指數(shù)格式,取決于哪個更短char(signed、unsigned)第一個非空白字符單個字符(無引號)char*(signcd.unsigned)從第一個空白字符(空格、\t、\n等)開始到下一個空白字符結(jié)束字符序列(無引號)void*無前綴的十六進(jìn)制數(shù)無前綴的十六進(jìn)制數(shù)Bool將true或1識別為true,將false或0識別為false1或0C++在iostream中提供了一些常用的無參數(shù)的流操縱符(也稱為格式控制符)。常用的無參流操縱符見表7-4。流操縱符可直接用在運(yùn)算符“>>”和“<<”之后,使用便捷。程序中要使用這些格式控制符時必須包含頭文件iostream。表7-4iostream中常用流操縱符注:“流操縱符”欄中的星號“*”不是操縱符的一部分,表示是默認(rèn)設(shè)置。流操縱符作用輸入/輸出endl輸出一個新行符,并清空流Oends輸出字符串結(jié)束,并清空流Oflush清空流緩沖區(qū)Odec*以十進(jìn)制形式輸入或輸出整數(shù)I/Ohex以十六進(jìn)制形式輸入或輸出整數(shù)I/Ooct以八進(jìn)制形式輸入或輸出整數(shù)I/Ows提取空白字符O在頭文件iomanip中還定義了一些用于格式控制的流操縱符,見表7-5。使用這些操縱符時必須包含頭文件iomanip。
表7-5常用的用于格式控制的流操縱符流操縱符作用fixed以普通小數(shù)形式輸出浮點(diǎn)數(shù)scientific以科學(xué)計數(shù)法形式輸出浮點(diǎn)數(shù)left左對齊,即在寬度不足時將填充字符添加到右邊right*右對齊,即在寬度不足時將填充字符添加到左邊setbase(intb)設(shè)置輸出整數(shù)時的進(jìn)制,b為8、10或16setw(intw)指定輸出寬度為w個字符,或輸入字符串時讀入w個字符。一次有效setfill(intc)在指定輸出寬度的情況下,輸出的寬度不足時用ASCII碼為c的字符填充(默認(rèn)情況是用空格填充)setprecision(intn)設(shè)置輸出浮點(diǎn)數(shù)的精度為n。在使用非fixed且非scientific方式輸出的情況下,n即為有效數(shù)字最多的位數(shù)。如果有效數(shù)字位數(shù)超過n,則小數(shù)部分四舍五入,或自動變?yōu)榭茖W(xué)計數(shù)法輸出并保留一共n位有效數(shù)字;在使用fixed方式和scientific方式輸出的情況下,n是小數(shù)點(diǎn)后面應(yīng)保留的位數(shù)setiosflags(fmtfalgsf)通用操縱符。將格式標(biāo)志f所對應(yīng)的格式標(biāo)志位置為1resetioflags(fmtfalsf)通用操縱符。將格式標(biāo)志f所對應(yīng)的格式標(biāo)志位置為0(清除)boolapha把true和false輸出為字符串noboolalpha*把true和false分別輸出為1和0showbase輸出表示數(shù)值進(jìn)制的前綴nosbowbase*不輸出表示數(shù)值進(jìn)制的前綴showpoint總是輸出小數(shù)點(diǎn)noshowpoint*只有當(dāng)小數(shù)部分存在時才顯示小數(shù)點(diǎn)showpos在非負(fù)數(shù)值中顯示+noshowpos*在非負(fù)數(shù)值中不顯示+skipws*輸入時跳過空白字符noskipws輸入時不跳過空白字符uppercase十六進(jìn)制數(shù)中使用’A’~’E’。若輸出前綴,則前綴輸出’0x’,科學(xué)計數(shù)法中輸出’E’Nouppercase*十六進(jìn)制數(shù)中使用’a’~’e’。若輸出前綴,則前綴輸出’0’,科學(xué)計數(shù)法中輸出’e’internal數(shù)值的符號(正負(fù)號)在指定寬度內(nèi)左對齊,數(shù)值右對齊,中間由填充字符填充其中setbase、setw、setfill、setprecision、setiosflags和resetiosflags為函數(shù)形式的帶有參數(shù)的操縱符。為方便使用,C++為輸出流操縱符設(shè)置了默認(rèn)值。例如,在默認(rèn)情況下整數(shù)采用十進(jìn)制形式輸出,等效于使用了流操縱符dec。流操縱符與插入運(yùn)算符“<<”和提取運(yùn)算符“>>”一起使用,從而方便格式控制。[程序7-5]使用流操縱符控制整數(shù)輸出#include<iostream>#include<iomanip>usingnamespacestd;intmain(){intn=65535,m=20;//1)分別輸出一個整數(shù)的十進(jìn)制、十六進(jìn)制和八進(jìn)制表示cout<<"1)"<<n<<"="<<hex<<n<<"="<<0ct<<n<<endl;//2)使用setbase分別輸出一個整數(shù)的十進(jìn)制、十六進(jìn)制和八進(jìn)制表示cout<<"2)"<<setbase(10)<<m<<"="<<setbase(16)<<m<<"="<<setbase(8)<<m<<endl;//3)使用showbase和setbase分別輸出一個整數(shù)的十進(jìn)制、十六進(jìn)制和八進(jìn)制表示cout<<"3)"<<showbase; //輸出表示數(shù)值進(jìn)制的前綴cout<<setbase(10)<<m<<"="<<setbase(16)<<m<<"="<<setbase(8)<<m<<endl;return0;}程序7-5的運(yùn)行結(jié)果如下:1)65535=ffff=1777772)20=14=243)20=0x14=024[程序7-6]使用流操縱符控制浮點(diǎn)數(shù)輸出#include<iostream>#include<iomanip>usingnamespacestd;intmain(){doublex=1234567.89,y=1.23456789;//1)無格式控制時cout<<"無格式控制:\t 1)x=("<<x<<"),y=("<<y<<")\n";//2)保留5位有效數(shù)字cout<<"保留5位有效數(shù)字:\t2)x=("<<setprecision(5)<<x<<"),y=("<<y<<")\n";//3)保留小數(shù)點(diǎn)后5位cout<<"保留小數(shù)點(diǎn)后5位:\t3)x=("<<fixed<<setprecision(5)<<x<<").y=("<<y<<")\n";//4)科學(xué)計數(shù)法,且保留小數(shù)點(diǎn)后5位cout<<"科學(xué)計數(shù)法且保留小數(shù)點(diǎn)后5位:4)x=("<<scientific<<setprecision(5)<<x<<"),y=("<<y<<")\n";//5)非負(fù)數(shù)顯示正號,輸出寬度為12字符,寬度不足時用*填補(bǔ)cout<<"5)"<<showpos<<fixed<<setw(12)<<setfill('*')<<y<<endl;//6)非負(fù)數(shù)不顯示正號,輸出寬度為12字符,寬度不足時右邊用填充字符填充cout<<"6)"<<noshowpos<<setw(12)<<left<<y<<endl;//7)輸出寬度為12字符,寬度不足時左邊用填充字符填充cout<<"7)"<<setw(12)<<right<<y<<endl;//8)寬度不足時,負(fù)號和數(shù)值分列左右,中間用填充字符填充cout<<"8)"<<setw(12)<<internal<<-y<<endl;return0;}程序7-6運(yùn)行結(jié)果如下:無格式控制:1)x=(1.23457e+006),y=(1.23457)保留5位有效數(shù)字:2)x=(1.2345e+006),y=(1.2346)保留小數(shù)點(diǎn)后5位:3)x=(1234567.89000),y=(1.23457)科學(xué)計數(shù)法且保留小數(shù)點(diǎn)后5位:4)x=(1.23457e+006),y=(1.23457e+0000)5)****+1.234576)1.23457*****7)*****1.234578)-****1.23457[程序說明]setw()的作用是一次性的,僅影響下一次cout的輸出。所以必要時每次輸出時都要使用setw()指定所需要的寬度。setfill(‘*’)的作用是持續(xù)的,影響多次。在使用cin輸入字符串時也可以通過setw()控制輸入格式。[程序7-7]通過setw()控制輸入格式#include<iostream>#include<iomanip>usingnamespacestd;intmain(){strings1,s2;cin>>setw(5)>>s1>>setw(3)>>s2;//設(shè)置輸入的字符串格式(長度)cout<<"s1="<<s1<<",s2="<<s2<<endl;return0;}運(yùn)行程序7-7,輸入:1234567890程序的輸出結(jié)果如下:s1=12345,s2=678[程序說明]程序中“setw(5)”使得讀入s1時只讀入5個字符,其后的“setw(3)”使得讀入s2時只讀入3個字符。二、標(biāo)志字
為滿足不同用戶對數(shù)據(jù)輸入輸出格式的要求,C++提供了通過setiosflags()設(shè)置標(biāo)志字進(jìn)行格式控制的方式。setiosflags()是帶參數(shù)的操縱符,在頭文件iostream中,用以設(shè)置指定的標(biāo)志,函數(shù)的參數(shù)為流的格式標(biāo)志位。標(biāo)志字是一個long型的數(shù)據(jù),由若干個系統(tǒng)定義的格式控制標(biāo)志位“組合”而成。常見的格式標(biāo)志和含義見表7-6.
標(biāo)志常量名值含義輸入/輸出ios::skipws0X0001跳過輸入中的空白Iios::left0X0002按輸出域左對齊,用填充字符填充右邊Oios::right*0X0004按輸出域右對齊,用填充字符填充左邊Oios:internal0X0008在符號位或基數(shù)指示符后填入字符Oios::dec*0X0010轉(zhuǎn)換為十進(jìn)制基數(shù)形式I/Oios::oct0X0020轉(zhuǎn)換為八進(jìn)制基數(shù)形式I/Oios::hex0X0040轉(zhuǎn)換為十六進(jìn)制基數(shù)形式I/Oios:showbase0X0080在輸出中顯示基數(shù)指示符Oios:showpoint0X0100在輸出浮點(diǎn)數(shù)時必須帶小數(shù)點(diǎn)和尾部的0Oios::uppercase0X0200以大寫字母表示十六進(jìn)制數(shù),科學(xué)計數(shù)法使用大寫字母EOios::showpos0X0400正數(shù)前加“+”號Oios::scientific0X0800科學(xué)記數(shù)法顯示浮點(diǎn)數(shù)Oios::fixed0X1000定點(diǎn)形式表示浮點(diǎn)數(shù)Oios::unitbuf0X2000插入操作后立即刷新流O
這些標(biāo)志常量實(shí)際就是在一個整數(shù)中僅將某一個二進(jìn)制位設(shè)置為1,而將其他位都清為0,當(dāng)需要設(shè)置多個標(biāo)志時,可以用位或“|”運(yùn)算符連接。
流格式標(biāo)志的每一位表示一種格式,標(biāo)志位之間會有相互制約關(guān)系。例如,表示數(shù)制的dec、oct和hex的位在同一時刻只能設(shè)置其中的一位:類似的還有表示對齊標(biāo)志位的left、right和internal位也是互斥的,表示實(shí)數(shù)格式標(biāo)志位的scientific和fixed位是互斥的。因此在設(shè)置了某個標(biāo)志,又要設(shè)置其他與之矛盾的標(biāo)志時,可先使用函數(shù)resetiosflags()清除原來的標(biāo)志。
為了便于清除同類互斥位,ios定義了幾個公有靜態(tài)符號常量:ios::basefield 值為dec|oct|hexios::adjustifield 值為left|right|internalios::floatfield 值為scientific|fixed例如,程序中可以采用以下方式設(shè)置標(biāo)準(zhǔn)輸出流為八進(jìn)制基數(shù)形式插入數(shù)據(jù)項:coutsetf(ios::oct,ios::basefield);其中ios::basefield表示清除已經(jīng)設(shè)置的各基數(shù)的格式位。需要注意的是,setiostflags()的作用與setw和width不同。它的影響是持久的,直到用resetiosflags()重新恢復(fù)默認(rèn)標(biāo)志字時為止。而setw和width只對隨后的一個數(shù)據(jù)有效,而后系統(tǒng)立刻恢復(fù)為系統(tǒng)默認(rèn)值。[程序7-8]通過setiosflags()設(shè)置標(biāo)志字進(jìn)行格式控制#include<iostream>#include<iomanip>usingnamespacestd;intmain(){doublex=12.34;cout<<"1)"<<setiosflags(ios::scientific|ios::showpos)<<x<<endl;cout<<"2)"<<setiosflags(ios::fixed)<<x<<endl;cout<<"3)"<<resetiosflags(ios::fixed)<<setiosflags(ios::scientific|ios::showpos)<<x<<endl;cout<<"4)"<<resetiosflags(ios::showpos)<<x<<endl;//清除要輸出正號的標(biāo)志return0;}運(yùn)行程序7-8,輸出結(jié)果如下:1)+1.234000e+0012)+12.343)+1.234000e+0014)1.234000c+0017.4調(diào)用cout的成員函數(shù)ostream類提供了在cout中控制輸出格式的成員函數(shù),常見的用于控制格式的成員函數(shù)原型如下:(1)設(shè)置和返回標(biāo)志字longflags(longLFlags);該函數(shù)的功能是使用參數(shù)LFlags設(shè)置(替換)標(biāo)志字,返回值為設(shè)置前的標(biāo)志字。longflags()const;該函數(shù)返回當(dāng)前的標(biāo)志字。(2)設(shè)置標(biāo)志位longsetf(longlFlags);該函數(shù)使用參數(shù)lFlags置位指定的標(biāo)志位,返回值為置位前的標(biāo)志字。注意,與函數(shù)flags()的“替換"方式不同,函數(shù)setf()為“添加”方式,即set()并不會更改其他lFlags不涉及的標(biāo)志位。longsetf(longlFlags,longIMask);該函數(shù)將參數(shù)lMask指定的標(biāo)志位清0,然后設(shè)置參數(shù)lFlags指定的標(biāo)志位,返回值為更新前的標(biāo)志字。(3)清除標(biāo)志位Longunsetf(longlFlags);該函數(shù)清除參數(shù)lFlags指定的標(biāo)志位,返回清除前的標(biāo)志字。函數(shù)unsetf()和setf()用到的“標(biāo)志位”與setionflags()和resetionsflags()用到的標(biāo)志位完全相同。(4)設(shè)置和返回輸出寬度intwidth(innw);該函數(shù)將下一個輸出項的顯示寬度設(shè)置為nw。如果nw大于數(shù)據(jù)所需寬度,則在沒有特別指示時數(shù)據(jù)采用右對齊方式。如果nw小于數(shù)據(jù)所需寬度,則nw無效,數(shù)據(jù)以默認(rèn)格式輸出。函數(shù)width()的設(shè)置沒有持續(xù)性,輸出一項數(shù)據(jù)后自動恢復(fù)為系統(tǒng)默認(rèn)設(shè)置。intwidth()const;該函數(shù)返回值為當(dāng)前的輸出寬度值。(5)設(shè)置填充字符charfill(charcFill);當(dāng)設(shè)置寬度大于數(shù)據(jù)輸出需要的寬度時,空白位置以字符參數(shù)cFill填充。若數(shù)據(jù)在寬度域左對齊,則在數(shù)據(jù)右邊填充;否則在左邊填充。默認(rèn)填充符為空白符。charfill()const;該函數(shù)返回當(dāng)前使用的填充符。(6)設(shè)置數(shù)據(jù)顯示精度intprecision(intnp);該函數(shù)用參數(shù)np設(shè)置數(shù)據(jù)顯示精度。如果浮點(diǎn)數(shù)以定點(diǎn)形式輸出,則np表示小數(shù)點(diǎn)后的數(shù)字位數(shù)。如果設(shè)置為科學(xué)記數(shù)法輸出,則np為尾數(shù)精度位數(shù)(包括小數(shù)點(diǎn))。系統(tǒng)默認(rèn)的數(shù)據(jù)顯示精度為6位。float類型最大數(shù)據(jù)顯示精度為6位,double類型最大數(shù)據(jù)顯示精度為15位。intprecision()const;該函數(shù)返回當(dāng)前數(shù)據(jù)顯示精度。在cout中調(diào)用成員函數(shù)控制輸出格式,其作用和對應(yīng)的流操縱符相同,見表7-7。表7-7ostream類的成員函數(shù)及與其作用相同的流操縱符成員函數(shù)作用相同的流操縱符precision(intnp)setprecision(np)width(intnw)setw(nw)fill(charcFill)setfill(cFill)setf(longlFlags)setiosflags(lFlags)unsetf(longlFlags)resetiosflags(lFlags)程序7-9使用cout中的函數(shù)控制輸出格式#include<iostream>usingnamespacestd;intmain(){doublevalues[]={1.23,20.3456,300.4567,4000.56789,5000.1234567};cout.fill('*'); //設(shè)置填充字符為星號*for(inti=0;i<sizeof(values)/sizeof(double);i++){cout<<"values["<<i<<"]=(";cout.width(10); //設(shè)置輸出寬度cout<<values[i]<<")"<<endl;}cout.fill(''); //設(shè)置填充字符為空格for(inti=0;i<sizeof(values)/sizeof(double);i++){cout<<"values["<<i<<"]=(";cout.width(10); //設(shè)置輸出寬度cout.precision(i+3); //設(shè)置保留有效數(shù)字cout<<values[i]<<")"<<endl;return0;}運(yùn)行程序7-9,得到的結(jié)果如下:ostream類還有一些輸出流的成員函數(shù),其原型如下:(1)字符插入ostream&put(charc);成員函數(shù)put()的功能是向輸出流中插入一個字符c。如果給出的參數(shù)類型為int,則輸出該ASCII碼對應(yīng)的字符,函數(shù)返回輸出流對象的引用。(2)數(shù)據(jù)塊插入ostream&write(constchar*pch,intnCount);成員函數(shù)write()的功能是向輸出流中插入pch指向的一個長度為nCount的字節(jié)序列。程序7-10使用cout()函數(shù)#include<iostream>usingnamespacestd;intmain(){charc='a',str[80]="0123456789abcdefghijkImn";intx=65;cout<<"cout.put('a'):";cout.put('a');cout<<"\ncout.put(c+25):";cout.put(c+25);cout<<"\ncout.put(x):";cout.put(x);cout<<"\ncout.write(str,20):";cout.write(str,20); //將str的前20個字節(jié)寫入到輸出流中return0;}程序7-10的運(yùn)行結(jié)果如下:cout.put('a'):acout.put(c+25):zcout.put(x):Acout.write(str,20):0123456789abcdefghij[程序說明]語句“cout.put(c+25)”是將變量c中保存的字母'a'轉(zhuǎn)換成整數(shù),即字符對應(yīng)的ASCII碼97,加25得到122,然后再輸出ASCII碼122對應(yīng)的字母z。語句“cout.put(x);”是輸出ASCII碼為65的字符A.7.5調(diào)用cin的成員函數(shù)istream類提供了一些公有成員函數(shù),它們可以以不同的方式提取輸入流中的數(shù)據(jù)。1.get()函數(shù)istream類有多個名為get的成員函數(shù)以適應(yīng)不同的用途,這里只介紹常用的。其原型如下:intget();此函數(shù)從輸入流中讀入一個字符(包括空白字符),返回值就是該字符的ASCII碼。如果碰到輸入結(jié)束符,則返回值為系統(tǒng)常量EOF(EndofFile,文件結(jié)束標(biāo)記)。空白字符為空格、制表符、回車等特殊字符。EOF在iostream類中定義為一個整型常量,值為-1)。istream類中從輸入流(包括文件)中讀取數(shù)據(jù)的成員函數(shù),當(dāng)把輸入數(shù)據(jù)都讀入完畢后再繼續(xù)讀取時,成員函數(shù)就會返回EOF。程序7-11從鍵盤輸入字符,直到輸入字符全部結(jié)束為止,顯示已經(jīng)輸入的字符總數(shù)。由于無法事先確定要從鍵盤中輸入多少個字符,也不知道輸入什么特定字符后停止輸入,所以可以采用EOF來判斷輸入是否結(jié)束。[程序7-11]采用EOF判斷輸入是否結(jié)束#include<iostream>usingnamespacestd;intmain(){intn=0;charch;while((ch=cin.get())!=EOF)//當(dāng)文件沒有結(jié)束時繼續(xù)進(jìn)行循環(huán){cout.put(ch);n++;}cout<<"輸入字符共計:"<<n<<endl;return0;}運(yùn)行程序7-11,從鍵盤輸入:IloveC++屏幕輸出:IloveC++.繼續(xù)輸入:^Z程序顯示下列信息后結(jié)束。輸入字符共計:12
在Windows環(huán)境下,當(dāng)進(jìn)行鍵盤輸入時,在單獨(dú)的一行按(Ctrl+Z)組合鍵后再按(Enter)鍵就代表文件輸入結(jié)束。因此運(yùn)行程序7-11時,輸入若干行之后,再按(Ctrl+Z)組合鍵和(Enter)鍵,cin.get()的返回值就是EOF,使while循環(huán)正常退出。在UNIX/Linux系統(tǒng)中,(Ctrl+D)組合鍵代表輸入文件結(jié)束。2.getline()函數(shù)getline()成員函數(shù)的原型如下:istream&getline(char*buf,intbutSize);其功能是從輸入流中的當(dāng)前字符開始讀取bufSize-1個字符到緩沖區(qū)buf,或讀到'\n'為止(哪個條件先滿足即按哪個執(zhí)行)。函數(shù)會在buf中讀入數(shù)據(jù)的結(jié)尾自動添加串結(jié)束標(biāo)記'\0'。istream&getline(char*buf,intbutSize,chardelim);其功能是從輸入流中的當(dāng)前字符開始讀取bufSize-1個字符到緩沖區(qū)buf,或讀到字符delim為止(哪個條件先滿足即按哪個執(zhí)行)。函數(shù)會在buf中讀入數(shù)據(jù)的結(jié)尾自動添加'\0'。兩者的區(qū)別在于,前者是讀到'\n'為止,后者是讀到指定字符delim為止。字符'\n'或delim都不會被存入buf中,但會從輸入流中取走。函數(shù)getline()的返回值是函數(shù)所作用的對象的引用。如果輸入流中'\n'或delim之前的字符個數(shù)達(dá)到或超過bufSize,則會導(dǎo)致讀入操作出錯,其結(jié)果是:雖然本次讀入已經(jīng)完成,但是之后的讀入都會失敗。[程序7-12]getline()函數(shù)功能演示#include<iostream>usingnamespacestd;intmain(){charbuf[10];inti=0;while(cin.getline(buf,10))//若輸入流的一行超過9個字符,則會出錯cout<<++i<<";"<<buf<<endl;cout<<"last:"<<buf<<endl;return0;}運(yùn)行程序7-12,輸入第1行:Hello由于輸入的字符數(shù)小于10(不包括“\n”),所以buf中保存了字符串“Hello”,程序輸出如下:1:Hello繼續(xù)輸入第2行:Thisis2雖然輸入的字符串中包含了空格,但輸入的字符數(shù)不足10,所以仍可以正常接收全部字符。程序輸出如下:2:Thisis2繼續(xù)輸入第3行:123456789程序輸出如下:3:123456789輸入第4行:abcdefghijk程序輸出如下:last:abcdefghi由于第4行中輸入的字符數(shù)超過了9個,函數(shù)getline()會將讀入的前9個字符保存在buf中,但函數(shù)getline()的返回值是出錯信息,所以程序會退出while循環(huán)。程序在while循環(huán)之后輸出最后結(jié)果并正常結(jié)束。3.eof()函數(shù)eof()成員函數(shù)的原型如下:booleof();eof()函數(shù)用于判斷輸入流是否已經(jīng)結(jié)束。返回值為true表示輸入結(jié)束。4.ignore()函數(shù)ignore()成員函數(shù)的原型如下:istream&ignore(intn=1,intdelim=EOF);此函數(shù)的作用是跳過輸入流中的n個字符,或跳過delim及其之前的所有字符(哪個條件先滿足就按哪個執(zhí)行)。兩個參數(shù)都有默認(rèn)值。因此cin.ignore()等效于cin.ignore(1,EOF),即跳過一個字符。該函數(shù)常用于跳過輸入中的無用部分,以便提取有用的部分。現(xiàn)有若干個電話號碼數(shù)據(jù),每一行是一個電話號碼,每個電話號碼均有一個前綴,格式如下:Home:12345678Tel:12345678901Office:87654321要求,將電話號碼轉(zhuǎn)換為如下形式:123456781234567890187654321根據(jù)題目中的要求和電話號碼格式說明,冒號':'是關(guān)鍵字符,冒號之后的字符串是需要提取的有效的電話號碼,所以可以采用函數(shù)ignore()跳過前面的無用部分,見程序7-13。[程序7-13]從輸入的字符串中提取電話號碼#include<iostream>usingnamespacestd;intmain(){ charstr[30]; while(!cin.eof())) //當(dāng)輸入流沒有結(jié)束時繼續(xù)循環(huán)
{cin.ignore(10,':'); //在cin流中跳過':'之前的全部字符
if(!cin.eof()) //輸入流若沒有結(jié)束
{cin>>str; //讀入電話號碼
cout<<str<<endl;} } return0;}運(yùn)行程序7-13,逐行輸入前面的測試數(shù)據(jù)可以得到對應(yīng)的電話號碼,最后按(Ctrl+Z)組合鍵和(Enter)鍵即可正常結(jié)束程序5.peek()函數(shù)peek()成員函數(shù)的原型如下:intpeek();
函數(shù)peek()返回輸入流中的當(dāng)前字符,但是并不將該字符從輸入流中取走——相當(dāng)于只是“看了一眼”將要讀入的下一個字符,因此叫“窺視"。cin.peek()不會跳過輸入流中的空格和回車符。在輸入流已
溫馨提示
- 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)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 森林公園生態(tài)旅游市場營銷考核試卷
- 游樂場設(shè)備智能監(jiān)測技術(shù)考核試卷
- 橡膠制品在船舶制造行業(yè)中的應(yīng)用研究考核試卷
- 生態(tài)環(huán)境保護(hù)法律法規(guī)考核試卷
- 社區(qū)反貧困與可持續(xù)發(fā)展考核試卷
- 消費(fèi)級機(jī)器人傳感器技術(shù)與應(yīng)用考核試卷
- 游戲行業(yè)法律法規(guī)及合規(guī)管理考核試卷
- 油氣倉儲自動化控制考核試卷
- 旅館業(yè)供應(yīng)鏈與物流管理考核試卷
- 昆明衛(wèi)生職業(yè)學(xué)院《三維地質(zhì)建模與可視化》2023-2024學(xué)年第二學(xué)期期末試卷
- 工程聯(lián)系單(模板)
- 2023年海南省財金集團(tuán)有限公司招聘筆試模擬試題及答案解析
- 耳聾與人工耳蝸植入術(shù)課件
- 公司獎項申請表(個人)
- 三年級上冊語文閱讀同步擴(kuò)展課件-第十五講 童話寓言的閱讀技巧(共14張PPT)-人教(部編版)
- 機(jī)油濾清器工作原理剖析
- 執(zhí)行異議及復(fù)議課件
- 工程施工資源配置計劃施工資源配置計劃
- 高中美術(shù)教案3-12地域的永恒魅力1
- 安全生產(chǎn)管理組織機(jī)構(gòu)設(shè)置圖
- 高考政治思維導(dǎo)圖
評論
0/150
提交評論