版權(quán)說(shuō)明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
1第九章輸入/輸出流庫(kù)9.1概述C++具有一個(gè)功能強(qiáng)大的I/O類繼承體系結(jié)構(gòu)用于處理數(shù)據(jù)的輸入/輸出問(wèn)題,該體系結(jié)構(gòu)不僅提供了對(duì)系統(tǒng)內(nèi)置數(shù)據(jù)類型的輸入/輸出操作,而且允許通過(guò)重載擴(kuò)展其功能以實(shí)現(xiàn)自定義數(shù)據(jù)類型的輸入和輸出操作。本章主要介紹C++流的基本結(jié)構(gòu),數(shù)據(jù)的輸入輸出及其格式化問(wèn)題,同時(shí)還介紹了C++文件的編程技術(shù)。1.流的概念A(yù)8bctyx1234源設(shè)備目標(biāo)設(shè)備字符序列從源設(shè)備連續(xù)不斷地流向目標(biāo)設(shè)備,最后按先流出先到達(dá)的有序方式匯聚在目標(biāo)設(shè)備中,如同河流一樣,故此叫流。2第九章輸入/輸出流庫(kù)(1)流有向的數(shù)據(jù)流動(dòng)的抽象描述,是數(shù)據(jù)流動(dòng)的渠道和方向,是程序與輸入/輸出設(shè)備的連接橋梁。(2)I/O流指對(duì)流的操作集合,它將數(shù)據(jù)流向流對(duì)象,或從流對(duì)象流出數(shù)據(jù)。(3)輸出流數(shù)據(jù)從內(nèi)存緩沖區(qū)傳送到目標(biāo)設(shè)備中的流。(4)輸入流數(shù)據(jù)從目標(biāo)設(shè)備傳送到內(nèi)存緩沖區(qū)中的流。3第九章輸入/輸出流庫(kù)流實(shí)際上是一種對(duì)象,它在使用前被建立,使用后被刪除。如:cin表示輸入流對(duì)象,C++已將其與鍵盤關(guān)聯(lián);cout表示輸出流對(duì)象,C++已將其與顯示器關(guān)聯(lián)。數(shù)據(jù)的輸入/輸出操作就是從流中提取數(shù)據(jù)或者向流中添加數(shù)據(jù)。通常把從流中提取數(shù)據(jù)的操作稱為析取,即讀操作;向流中添加數(shù)據(jù)的操作稱為插入操作,即寫操作。2.C++I/O流類的繼承結(jié)構(gòu)C++建立了一個(gè)十分龐大的流類庫(kù)來(lái)實(shí)現(xiàn)數(shù)據(jù)的輸入/輸出操作,其中的每個(gè)流類實(shí)現(xiàn)不同的功能,這些類通過(guò)繼承組合在一起。4第九章輸入/輸出流庫(kù)5第九章輸入/輸出流庫(kù)3.C++主要的流類簡(jiǎn)介(1)streambuf主要作為其他類的支持,定義了對(duì)緩沖區(qū)的通用操作,如設(shè)置緩沖區(qū),從緩沖區(qū)中讀取數(shù)據(jù),或向緩沖區(qū)寫入數(shù)據(jù)等操作。(2)filebuf類使用文件來(lái)保存緩沖區(qū)中的字符序列。它定義了文件讀、寫、打開(kāi)、關(guān)閉等常用操作。(3)ios是所有流類的基類,提供對(duì)流狀態(tài)進(jìn)行設(shè)置的主要功能。如文件數(shù)據(jù)的格式碼設(shè)置與取消,關(guān)鏈文件緩沖區(qū)借以實(shí)現(xiàn)數(shù)據(jù)讀寫等。(4)istream是輸入流類,實(shí)現(xiàn)數(shù)據(jù)輸入的功能。(5)ostream是輸出流類,實(shí)現(xiàn)數(shù)據(jù)輸出的功能。6第九章輸入/輸出流庫(kù)(6)iostream是istream和ostream的派生類,它繼承了istream類和ostream類的行為,支持?jǐn)?shù)據(jù)輸入、輸出的雙向操作,在程序中常通過(guò)它來(lái)實(shí)現(xiàn)數(shù)據(jù)的輸入與輸出功能。(7)fstreambase從ios派生,提供了文件操作的許多功能,作為其他文件操作類的公共基類。(8)ifstream類用來(lái)實(shí)現(xiàn)文件讀取操作。(9)ofstream類用來(lái)實(shí)現(xiàn)文件寫入操作。(10)fstream繼承了fstreambase和iostream類的功能,實(shí)現(xiàn)了文件讀/寫的雙向操作。4.C++預(yù)定義的輸入/輸出流對(duì)象為了便于程序數(shù)據(jù)的輸入/輸出,C++預(yù)定義了幾個(gè)標(biāo)準(zhǔn)輸入/輸出流對(duì)象,在程序中可以直接引用它們來(lái)輸入/輸出數(shù)據(jù)。如下表所示:7第九章輸入/輸出流庫(kù)流對(duì)象定義說(shuō)明ostreamcout;cout與標(biāo)準(zhǔn)輸出設(shè)備相關(guān)聯(lián)(顯示器)ostreamcerr;cerr與標(biāo)準(zhǔn)錯(cuò)誤輸出設(shè)備相關(guān)聯(lián)(非緩沖方式)ostreamclog;clog與標(biāo)準(zhǔn)錯(cuò)誤輸出設(shè)備相關(guān)聯(lián)(緩沖方式)istreamcin;與標(biāo)準(zhǔn)輸入設(shè)備相關(guān)聯(lián)(鍵盤)89.2使用cin與cout輸入/輸出數(shù)據(jù)cin:設(shè)備輸入流對(duì)象(鍵盤),與運(yùn)算符>>一起完成輸入操作。cout:設(shè)備輸出流對(duì)象(顯示器),與運(yùn)算符<<一起完成輸出操作。<<:插入操作符,是重載的左移位運(yùn)算符,C++編譯時(shí)首先檢查其左右操作數(shù),以判斷是執(zhí)行移位還是插入操作,所以不會(huì)出現(xiàn)歧義。該操作符用來(lái)輸出變量數(shù)據(jù)。格式為:cout<<輸出項(xiàng)列表(常量、變量、轉(zhuǎn)義符等);>>:析取操作符,是重載的右移位運(yùn)算符,C++編譯時(shí)首先檢查其左右操作數(shù),以判斷是執(zhí)行移位還是析取操作,所以不會(huì)出現(xiàn)歧義。該操作符用來(lái)為變量輸入數(shù)據(jù)。格式為:cin>>變量列表;第九章輸入/輸出流庫(kù)91.使用cin輸入數(shù)據(jù)(1)語(yǔ)法①輸入單個(gè)變量的值 cin>>x;②輸入多個(gè)變量的值 cin>>x1>>x2>>x3>>x4>>……>>xn;其中x,x1,……,xn可以是內(nèi)置數(shù)據(jù)類型如int,char,float,double等。(2)注意事項(xiàng)①在一條cin語(yǔ)句中同時(shí)為多個(gè)變量輸入數(shù)據(jù)時(shí),輸入數(shù)據(jù)的個(gè)數(shù)應(yīng)當(dāng)與cin語(yǔ)句中變量個(gè)數(shù)相同,各輸入數(shù)據(jù)之間用一個(gè)或多個(gè)空白(包括空格、回車、Tab)作為間隔符,全部數(shù)據(jù)輸入完成后,按Enter鍵結(jié)束。第九章輸入/輸出流庫(kù)10②在>>后面只能出現(xiàn)變量名,下面的語(yǔ)句是錯(cuò)誤的。cin>>"x=">>x; //錯(cuò)誤,>>后面含有字符串"x="cin>>12>>x; //錯(cuò)誤,>>后面含有常數(shù)12③cin具有自動(dòng)識(shí)別數(shù)據(jù)類型的能力,析取運(yùn)算>>將根據(jù)它后面的變量的類型從輸入流中為它們提取對(duì)應(yīng)的數(shù)據(jù)。比如:cin>>x;假設(shè)輸入數(shù)據(jù)2,析取運(yùn)算符>>將根據(jù)其后的x的類型決定輸入的2到底是數(shù)字還是字符。若x是char類型,則2就是字符;若x是int,float之類的類型,則2就是一個(gè)數(shù)字。再如,若輸入34,且x是char類型,則只有字符3被存儲(chǔ)到x中,4將繼續(xù)保存在流中;若x是int或float,則34就會(huì)存儲(chǔ)x中。第九章輸入/輸出流庫(kù)11④數(shù)值型數(shù)據(jù)的輸入在讀取數(shù)值型數(shù)據(jù)時(shí),析取運(yùn)算符>>首先略掉數(shù)據(jù)前面的所有空白符號(hào),在遇到正、負(fù)號(hào)或數(shù)字,才開(kāi)始讀入,包括浮點(diǎn)型數(shù)據(jù)的小數(shù)點(diǎn),并在遇到空白符或其他非數(shù)字字符時(shí)停止。例如: intx1; doublex2; charx3; cin>>x1>>x2>>x3;假如輸入35.4A并按Enter鍵,x1是35、x2是0.4、x3是‘A’。(3)輸入數(shù)據(jù)案例分析第九章輸入/輸出流庫(kù)12假設(shè)有變量定義語(yǔ)句如下:inta,b;doublez;charch;下面的語(yǔ)句說(shuō)明數(shù)據(jù)輸入的含義。語(yǔ)句 輸入 內(nèi)存變量的值cin>>ch; A ch='A'cin>>ch; AB ch='A',而'B'被保留在輸入流中等待被讀取cin>>a; 32 a=32cin>>a; 32.23 a=32,.23留在輸入流中等待被讀取cin>>z; 76.21 z=76.21cin>>z; 65 z=65.0第九章輸入/輸出流庫(kù)13語(yǔ)句 輸入 內(nèi)存變量的值cin>>a>>ch>>z;23B3.2 a=23,ch=‘B’,Z=3.2cin>>a>>ch>>z;
23B3.2 a=23,ch=‘B’,Z=3.2cin>>a>>b>>z;
2332 a=23,b=32,等待輸入下一個(gè)數(shù)據(jù)存入zcin>>a>>z; 23.224 a=2,z=3.2,24被保留在輸入流中等待被讀取cin>>a>>ch; 132 a=132,計(jì)算機(jī)等待輸入ch的值cin>>ch>>a; 132 ch='1',a=32第九章輸入/輸出流庫(kù)142.使用cout輸出數(shù)據(jù)(1)語(yǔ)法①輸出單個(gè)變量的值 cout<<x;②輸出多個(gè)變量的值 cout<<x1<<x2<<x3<<x4<<……<<xn;其中x,x1,……,xn可以是內(nèi)置數(shù)據(jù)類型如int,char,float,double等。(2)注意事項(xiàng)①cout既可輸出變量的值,也可輸出常量。②對(duì)于字符變量和字符串變量,cout將把變量的值輸出到顯示器上。對(duì)于字符常量和字符串常量,cout將把它們?cè)瓨虞敵鲈谄聊簧?。第九章輸?輸出流庫(kù)15③與C語(yǔ)言一樣,在C++程序中也可以將一條命令寫在多行上。④輸出換行。在cout語(yǔ)句中換行可用:“\n”或endl。⑤在連續(xù)輸出多個(gè)數(shù)據(jù)時(shí),應(yīng)注意在數(shù)據(jù)之間插入間隔符。因?yàn)閏out輸出不帶任何格式。⑥確定數(shù)制基數(shù),輸出時(shí)可用hex(16進(jìn)制),oct(8進(jìn)制),dec(10進(jìn)制)指定輸出數(shù)值型數(shù)據(jù)的進(jìn)制。如:#include<iostream.h>voidmain(){ intx=34;cout<<hex<<17<<""<<x<<""<<18<<endl;//顯示112212cout<<17<<""<<oct<<x<<""<<18<<endl;//顯示114222cout<<dec<<17<<""<<x<<""<<18<<endl;//顯示173418}第九章輸入/輸出流庫(kù)169.3使用I/O成員函數(shù)輸入/輸出數(shù)據(jù)1.istream類中的常用成員函數(shù)classistream:virtualpublicios{public: istream&operator>>(double&); istream&operator>>(…); //還有重載其它類型數(shù)據(jù)的輸入 intget(); istream&get(char*,int,char='\n'); istream&get(char&); istream&getline(char*,int,char='\n'); istream&read(char*,int); istream&ignore(int=1,int=EOF); ......};第九章輸入/輸出流庫(kù)172.istream成員函數(shù)使用說(shuō)明(1)get()函數(shù)①intget()不帶參數(shù)的get()從輸入流中提取一個(gè)字符(包括空白字符),并返回該字符作為函數(shù)的調(diào)用值。當(dāng)遇到文件結(jié)束時(shí),返回文件結(jié)束符EOF。②istream&get(char*c,intn,char='\n')從輸入流中提取n-1個(gè)字符(包括空白字符)存入字符數(shù)組c中,并在字符串末尾自動(dòng)加'\0'。第3個(gè)參數(shù)用于指定字符結(jié)束的分隔符,默認(rèn)是‘\n’。該函數(shù)在下列情況會(huì)終止讀取字符的操作:讀取了n-1個(gè)字符;遇到了指定的結(jié)束分隔符;遇到了文件結(jié)束符。第九章輸入/輸出流庫(kù)18注意:該函數(shù)不會(huì)將輸入流中的結(jié)束分隔符讀入數(shù)組中,數(shù)據(jù)讀取完成后結(jié)束分隔符仍保留在輸入流中,為后續(xù)數(shù)據(jù)讀入留下隱患。③istream&get(char&c)從輸入流中提取一個(gè)字符(包括空白字符)送字符引用c中。遇到文件結(jié)束符時(shí)返回0,否則返回istream對(duì)象的引用。(2)istream&read(char*c,intn)從輸入流中讀取n個(gè)字節(jié)送字符數(shù)組c中。非格式化的讀,對(duì)讀取的字節(jié)不作任何處理,數(shù)據(jù)由程序解釋。(3)istream&ignore(intn=1,int=EOF)從輸入流中讀取n個(gè)(默認(rèn)1個(gè))字符不保存,遇到指定結(jié)束符(默認(rèn)EOF)時(shí)終止輸入。實(shí)質(zhì)上從輸入流中刪除n個(gè)字符。第九章輸入/輸出流庫(kù)19(4)istream&getline(char*c,intn,char='\n')從輸入流中提取n-1個(gè)字符(包括空白字符)存入字符數(shù)組c中,并在字符串末尾自動(dòng)加'\0'。第3個(gè)參數(shù)用于指定字符結(jié)束的分隔符,默認(rèn)是‘\n’。該函數(shù)在下列情況會(huì)終止讀取字符的操作:讀取了n-1個(gè)字符;遇到了指定的結(jié)束分隔符;遇到了文件結(jié)束符。注意:該函數(shù)不會(huì)將輸入流中的結(jié)束分隔符讀入數(shù)組中,但會(huì)清除結(jié)束分隔符,為后續(xù)數(shù)據(jù)讀入提供方便。第九章輸入/輸出流庫(kù)20例:用函數(shù)get和getline讀取數(shù)據(jù)。#include<iostream.h>voidmain(){ charc,a[80],s1[80]; cout<<"useget()inputchar:"; while((c=cin.get())!='\n') //輸入abcd cout<<c; //顯示abcd cout<<endl; cout<<"useget(a,10)inputchar:"; cin.get(a,10); //輸入12345678,不夠9個(gè)字符 cout<<a<<endl; //顯示12345678 cin.ignore(); //清除上次輸入的’\n’第九章輸入/輸出流庫(kù)21 cout<<"usegetline(s1,10)inputchar:"; cin.getline(s1,10); //輸入thisisastr,讀9個(gè) cout<<s1<<endl; //顯示thisisa}本例輸入流及數(shù)據(jù)讀取情況如下圖所示:第九章輸入/輸出流庫(kù)223.ostream類中的常用成員函數(shù)classostream:virtualpublicios{public: ostream&operator<<(long&); ostream&operator<<(…); //還有重載其它類型數(shù)據(jù)的輸出 ...... ostream&flush(); ostream&put(char); ostream&write(constchar*,int); ......};第九章輸入/輸出流庫(kù)234.ostream成員函數(shù)使用說(shuō)明(1)ostream&put(charc)插入一個(gè)無(wú)格式的字節(jié)到輸出流中。其中c是要輸出的字符,函數(shù)返回輸出流對(duì)象的引用。(2)ostream&write(constchar*c,intn)插入一個(gè)無(wú)格式的字符序列到輸出流中。其中c是要輸出的字符數(shù)組,n是要輸出的字符個(gè)數(shù),函數(shù)返回輸出流對(duì)象的引用。(3)ostream&flush()緩沖輸出:數(shù)據(jù)寫入緩沖區(qū),緩沖區(qū)滿時(shí)才將數(shù)據(jù)送輸出設(shè)備。緩沖輸出的輸出數(shù)據(jù)會(huì)有所延遲。非緩沖輸出:數(shù)據(jù)寫入緩沖區(qū),并立即將數(shù)據(jù)送輸出設(shè)備。第九章輸入/輸出流庫(kù)24輸出緩沖區(qū)刷新函數(shù)。用于刷新輸出流,即不論緩沖區(qū)滿與不滿,立即將緩沖區(qū)中的數(shù)據(jù)送到輸出設(shè)備。例:用get讀取數(shù)據(jù),用put及write輸出。#include<iostream.h>voidmain(){ charc; chara[]="Thisisastring!"; cout<<"useget()inputchar:"; while((c=cin.get())!=‘\n’) //輸入howareyou! cout.put(c); //顯示howareyou! cout.put('\n'); cout.put(‘T’).put(‘h’).put(‘i’).put(‘s’).put(‘\n’);//顯示This cout.write(a,sizeof(a)-1).put(‘\n’);//顯示Thisisastring! cout<<“l(fā)ook”<<“\there!”<<endl;}//顯示lookhere!第九章輸入/輸出流庫(kù)259.4數(shù)據(jù)輸入/輸出的格式控制1.格式控制的目的(1)進(jìn)行不同進(jìn)制之間的轉(zhuǎn)換:8進(jìn)制、16進(jìn)制、十進(jìn)制等。(2)精度的控制:小數(shù)點(diǎn)的位數(shù)等。(3)輸入/輸出的寬度控制。(4)格式之間的狀態(tài)轉(zhuǎn)換。2.格式控制的方法(1)使用ios類中的有關(guān)格式控制的成員函數(shù)①格式控制狀態(tài)標(biāo)志輸入輸出的格式由各種狀態(tài)標(biāo)志來(lái)確定,這些標(biāo)志在ios類中定義為枚舉量,用一個(gè)十六位二進(jìn)制數(shù)表示。第九章輸入/輸出流庫(kù)26ios::skipws 跳過(guò)輸入流中的空白字符ios::left 輸出數(shù)據(jù)按左對(duì)齊,如[12]ios::right 輸出數(shù)據(jù)按右對(duì)齊,如[12]ios::dec 按十進(jìn)制數(shù)據(jù)輸出ios::oct 按八進(jìn)制數(shù)據(jù)輸出ios::hex 按十六進(jìn)制數(shù)據(jù)輸出ios::showbase 在輸出數(shù)據(jù)前面顯示基數(shù)(八進(jìn)制是0,十六進(jìn)制是0x)ios::showpoint 浮點(diǎn)數(shù)輸出帶小數(shù)點(diǎn)ios::uppercase 用大寫字母輸出十六進(jìn)制數(shù)(即ABCDEF,默認(rèn)是小寫)ios::showpos 在正數(shù)前加“+”ios::scientific 用科學(xué)計(jì)數(shù)法輸出浮點(diǎn)數(shù),如[2.122E2]ios::fixed 用定點(diǎn)數(shù)形式輸出浮點(diǎn)數(shù),如[212.2]ios::unitbuf 完成后立即刷新緩沖區(qū)第九章輸入/輸出流庫(kù)27②設(shè)置標(biāo)志用ios類的成員函數(shù)setf()設(shè)置,格式為:cin.setf(ios::標(biāo)志位|……); //“|”表示同時(shí)設(shè)置若干個(gè)標(biāo)志或cout.setf(ios::標(biāo)志位|……);③清除標(biāo)志用ios類的成員函數(shù)unsetf()設(shè)置,格式為:cin.unsetf(ios::標(biāo)志位|……); //“|”表示同時(shí)清除若干個(gè)標(biāo)志或cout.unsetf(ios::標(biāo)志位|……);④取狀態(tài)標(biāo)志用ios類的成員函數(shù)flags(),格式為:cin.flags();cout.flags(); //返回流的標(biāo)志位或cin.flags(ios::標(biāo)志位);cout.flags(ios::標(biāo)志位);//重新設(shè) //置并返回流的標(biāo)志位第九章輸入/輸出流庫(kù)28⑤設(shè)置域?qū)捰胕os類的成員函數(shù)width()設(shè)置,格式為:cout.width(n); //設(shè)置輸出域?qū)抧位并返回原來(lái)域?qū)抍out.width(); //返回當(dāng)前域?qū)挗尢畛渥址胕os類的成員函數(shù)fill()設(shè)置,與width()配合,格式為:cout.fill(字符); //設(shè)置填充字符并返回原來(lái)填充字符cout.fill(); //返回當(dāng)前填充字符⑦設(shè)置精度用ios類的成員函數(shù)precision()設(shè)置,格式為:cout.precision(n); //設(shè)置顯示精度為n位并返回原來(lái)精度cout.precision(); //返回當(dāng)前顯示精度第九章輸入/輸出流庫(kù)29例:用ios成員函數(shù)及格式化標(biāo)志設(shè)置輸出數(shù)據(jù)的格式#include<iostream.h>voidmain(){ charc[]="thisisstring"; doubled=-1234.8976; cout.width(30); //設(shè)置域?qū)?0個(gè)字符 cout.fill(‘*’); //填充字符“*” cout.setf(ios::right); //輸出右對(duì)齊(默認(rèn)) cout<<c<<“----L1”<<endl; //輸出c,左邊填充“*” cout.width(30); //每個(gè)輸出語(yǔ)句需要設(shè)置寬度 cout.setf(ios::left); //左對(duì)齊 cout<<c<<“----L2”<<endl; //輸出c,右邊填充“*“第九章輸入/輸出流庫(kù)30 cout.setf(ios::dec|ios::showbase|ios::showpoint); cout.width(30); //十進(jìn)制,顯示基數(shù),浮點(diǎn)數(shù)輸出帶小數(shù)點(diǎn) cout<<d<<“----L3”<<“\n”; //默認(rèn)6位精度 cout.setf(ios::showpoint); //浮點(diǎn)數(shù)輸出帶小數(shù)點(diǎn) cout.precision(10); //精度10位,不含小數(shù)點(diǎn)與符號(hào)位 cout.width(30); //每個(gè)輸出語(yǔ)句需要設(shè)置寬度 cout<<d<<"----L4"<<"\n"; cout.width(30); cout.setf(ios::oct); //顯示基數(shù),八進(jìn)制 cout<<100<<"----L5"<<"\n";}第九章輸入/輸出流庫(kù)31運(yùn)行結(jié)果:****************thisisstring----L1thisisstring****************----L2-1234.90**********************----L3-1234.897600******************----L40144**************************----L5第九章輸入/輸出流庫(kù)32(2)使用操縱符及操縱符函數(shù)控制格式改變格式比較簡(jiǎn)單的方法是使用特殊的、類似于函數(shù)的運(yùn)算符,稱為操縱符,也叫操縱算子。它以一個(gè)流引用為參數(shù),并返回同一流的引用,并可以嵌入到輸入或輸出鏈中,即不要前綴流對(duì)象,直接調(diào)用操縱符。使用操縱符及操縱符函數(shù)需要在源程序中包含頭文件“iomanip.h”①操縱符第九章輸入/輸出流庫(kù)33Showbase(noshowbase) 顯示(不顯示)數(shù)值的基數(shù)前綴Showpoint(noshowpoint) 顯示小數(shù)點(diǎn)(存在小數(shù)部分時(shí)才顯示小數(shù)點(diǎn))showpos(noshowpos) 在非負(fù)數(shù)中顯示(不顯示)”+”skipws(noskips) 輸入數(shù)據(jù)時(shí),跳過(guò)(不跳過(guò))空白字符uppercase(nouppercase) 十六進(jìn)制顯示為0X(0x),科學(xué)計(jì)數(shù)法顯示E(e)dec/oct/hex 十進(jìn)制/八進(jìn)制/十六進(jìn)制left/right 設(shè)置數(shù)據(jù)輸出對(duì)齊方式為:左/右對(duì)齊fixed 以小數(shù)形式顯示浮點(diǎn)數(shù)scientific 用科學(xué)計(jì)數(shù)法顯示浮點(diǎn)數(shù)flush 刷新輸出緩沖區(qū)ends 插入空白字符,然后刷新ostream緩沖區(qū)endl 插入換行字符,然后刷新ostream緩沖區(qū)ws 跳過(guò)開(kāi)始的空白第九章輸入/輸出流庫(kù)34②操縱符函數(shù)setfill(ch) 設(shè)置以ch中的字符為填充字符setprecision(n) 設(shè)置精度為n位有效數(shù)字setw(w) 設(shè)置數(shù)據(jù)的輸出寬度為w個(gè)字符setbase(b) 基數(shù)設(shè)置為b(b=8,10,16)進(jìn)制第九章輸入/輸出流庫(kù)35例:實(shí)數(shù)的精度控制#include<iostream.h>#include<iomanip.h>#include<math.h>voidmain(){doublex=sqrt(2.0);for(intindex=0;index<9;index++){cout.precision(index); //使用ios的成員函數(shù)設(shè)置精度 cout<<x<<endl;}cout<<endl;for(index=0;index<9;index++) cout<<setprecision(index)<<x<<endl;//使用操縱符設(shè)置精度}第九章輸入/輸出流庫(kù)36運(yùn)行結(jié)果:111.41.411.4141.41421.414211.4142141.4142136第九章輸入/輸出流庫(kù)37例:輸出寬度的控制#include<iostream.h>#include<iomanip.h>voidmain(){intx=12345;
//缺省格式為右對(duì)齊cout<<"Defaultisonright:"<<endl <<setw(10)<<x<<endl<<endl;
//修改為左對(duì)齊cout.setf(ios::left);cout<<setw(10)<<x<<endl<<endl;
//取消左對(duì)齊又變?yōu)橛覍?duì)齊cout.unsetf(ios::left);cout<<setw(10)<<x<<endl;}運(yùn)行結(jié)果:Defaultisonright:123451234512345第九章輸入/輸出流庫(kù)38例:格式輸出中空白的填充#include<iostream.h>#include<iomanip.h>voidmain(){intx=12345;
//缺省為右對(duì)齊cout<<"Defaultisonright:"<<endl <<setw(10)<<x<<endl<<endl;
//右對(duì)齊,左邊填充“*”cout.fill('*');cout<<setw(10)<<x<<endl<<endl;
//左對(duì)齊,右邊填充“%”cout.setf(ios::left);cout<<setw(10)<<setfill('%')<<x<<endl;}運(yùn)行結(jié)果:Defaultisonright:12345*****1234512345%%%%%第九章輸入/輸出流庫(kù)39例:科學(xué)計(jì)算等格式輸出#include<iostream.h>voidmain(){doublex=0.001234567,y=1.946e9;cout<<"Displayedindefaultformat:"<<endl <<x<<'\t'<<y<<endl<<endl; //缺省格式輸出(定點(diǎn))cout.setf(ios::scientific); //科學(xué)表示格式輸出cout<<"Displayedinscientificformat:"<<endl <<x<<'\t'<<y<<endl;cout.setf(ios::fixed); //定點(diǎn)格式輸出cout<<"Displayedinfixedformat:"<<endl <<x<<'\t'<<y<<endl;}第九章輸入/輸出流庫(kù)40運(yùn)行結(jié)果:Displayedindefaultformat:0.001234571.946e+009Displayedinscientificformat:1.234567e-0031.946000e+009Displayedinfixedformat:0.001234571.946e+009第九章輸入/輸出流庫(kù)419.5文件的輸入/輸出1.概述(1)文件的概念文件是存儲(chǔ)在存儲(chǔ)介質(zhì)上(如磁盤、磁帶、光盤)的數(shù)據(jù)集合。(2)文件的類型①文本文件文本文件在磁盤上存放相關(guān)字符的ASCII碼,所以又稱為ASCII文件。②二進(jìn)制文件二進(jìn)制文件在磁盤上存儲(chǔ)相關(guān)數(shù)據(jù)的二進(jìn)制代碼,它是把內(nèi)存中的數(shù)據(jù),按其在內(nèi)存中的存儲(chǔ)形式原樣寫到磁盤上而形成的文件。第九章輸入/輸出流庫(kù)42(3)流與文件C++將文件看成是一個(gè)個(gè)字符在磁盤上的有序集合,用流來(lái)實(shí)現(xiàn)文件的讀寫操作。輸入:數(shù)據(jù)流從文件流入內(nèi)存。輸出:數(shù)據(jù)流從內(nèi)存流入文件。從操作系統(tǒng)的觀點(diǎn),所有與主機(jī)相連的設(shè)備都視為文件,如鍵盤、顯示器、打印機(jī)等。(4)與文件相關(guān)的流C++有3種文件流:輸入文件流ifstream、輸出文件流ofstream、輸入/輸出文件流fstream。這些文件流都定義在fstream.h文件中。第九章輸入/輸出流庫(kù)432.文件操作的一般步驟(1)在源程序中包含頭文件fstream.h;(2)為要進(jìn)行操作的文件建立一個(gè)流,即定義流對(duì)象;如:ifstreamin; //定義輸入流對(duì)象in ofstreamout; //定義輸出流對(duì)象out fstreamio; //定義輸入輸出流對(duì)象io(3)使用open()函數(shù)建立(打開(kāi))文件。不存在則建立、存在則打開(kāi);(4)進(jìn)行文件的讀寫操作;(5)使用close()函數(shù)關(guān)閉文件。3.文件的打開(kāi)與關(guān)閉第九章輸入/輸出流庫(kù)44(1)打開(kāi)文件①open()函數(shù)的原型 voidopen(char*filename,intmod,intaccess);②*filename:指向文件名字符串的指針③mod:文件的打開(kāi)方式第九章輸入/輸出流庫(kù)45第九章輸入/輸出流庫(kù)文件打開(kāi)方式說(shuō)明ios::in以輸入方式打開(kāi)文件,即讀文件(ifstream類對(duì)象默認(rèn)方式)ios::out以輸出方式打開(kāi)文件,即寫文件(ofstream類對(duì)象默認(rèn)方式)ios::app以添加方式打開(kāi)文件,新增加的內(nèi)容添加在文件尾ios::ate以添加方式打開(kāi)文件,新增加的內(nèi)容添加在文件尾,但下次添加時(shí)則添加在當(dāng)前位置ios::trunc如文件存在就打開(kāi)并清除其內(nèi)容,如不存在就建立新文件ios::binary以二進(jìn)制方式打開(kāi)文件(默認(rèn)為文本文件)ios::nocreate打開(kāi)已有文件,若文件不存在,則打開(kāi)失敗ios::noreplace若打開(kāi)的文件已經(jīng)存在,則打開(kāi)失敗46④access:文件的訪問(wèn)方式,缺省值為“0” 0:一般文件;1:只讀文件;2:隱藏文件;3:系統(tǒng)文件⑤打開(kāi)格式 流對(duì)象.open(filename,mod,access);⑥討論第一、ofstreamout; //定義流類對(duì)象out out.open(“test”,ios::out,0); //打開(kāi)或:out.open(“test”); //缺省為輸出第九章輸入/輸出流庫(kù)47第九章輸入/輸出流庫(kù)第二、在實(shí)際中,常用下面的方式來(lái)打開(kāi): ofstreamout(“test”); //創(chuàng)建流對(duì)象的同時(shí)打開(kāi)文件第三、為確定一個(gè)文件是否能夠打開(kāi),可以使用下面的方法: ifstreammystream(“myfile”);//文件打開(kāi)失敗,mystream=0 if(!mystream) cout<<“Cannotopenthefile!\n”; //顯示錯(cuò)誤信息(2)關(guān)閉文件 流對(duì)象.close() 如:mystream.close();48第九章輸入/輸出流庫(kù)例9.14一個(gè)簡(jiǎn)單的輸入輸出例子//Saveasmain.cpp#include<fstream.h>voidmain(){ ofstreamostrm; //定義輸出流對(duì)象 ostrm.open(“f1.dat”); //創(chuàng)建文件 ostrm<<120<<endl; //寫文件 ostrm<<310.85<<endl; //寫文件 ostrm.close(); //關(guān)閉文件 ifstreamistrm(“f1.dat”); //定義輸入流對(duì)象并打開(kāi)文件49第九章輸入/輸出流庫(kù) intn; doubled; istrm>>n>>d; //讀文件 cout<<n<<","<<d<<endl; istrm.close(); //關(guān)閉文件}運(yùn)行結(jié)果:50例9.15把一個(gè)整數(shù)、一個(gè)浮點(diǎn)數(shù)和一個(gè)字符串寫入磁盤文件test中。//Saveasmain.cpp#include<fstream.h> //包含輸入輸出文件流的頭文件voidmain(){ofstreammyout(“test”); //定義流對(duì)象myout并創(chuàng)建文件testif(!myout) cout<<"cannotopenfile:test";myout<<10<<""<<123.45<<""<<"object\n";//向文件寫數(shù)據(jù)myout.close(); //關(guān)閉文件}第九章輸入/輸出流庫(kù)51例9.16將例9.15產(chǎn)生的文件test中的數(shù)據(jù)讀出并顯示。//Saveasmain.cpp#include<fstream.h>voidmain(){inta;floatb;char*str=newchar[80];ifstreammyin(“test”);if(!myin) cout<<"cannotopenfile:test";myin>>a>>b>>str; //從文件讀數(shù)據(jù)到變量a、b、strcout<<a<<“”<<b<<“”<<str; //顯示數(shù)據(jù)cout<<endl;myin.close();} //關(guān)閉文件第九章輸入/輸出流庫(kù)52例9.17將文件file_from的內(nèi)容拷貝到文件file_to中#include<fstream.h>voidmain(){charch;ifstreammyin("file_from");if(!myin)cout<<"cannotopenfile:file_from";ofstreammyout("file_to");if(!myout)cout<<"cannotopenfile:file_to";while(myin.get(ch)) //逐個(gè)讀出字符到ch,直到結(jié)束標(biāo)志‘\0’ myout.put(ch); //將ch中的字符寫入到文件,最后自動(dòng)寫入結(jié)束標(biāo)志myin.close();myout.close();}第九章輸入/輸出流庫(kù)534.二進(jìn)制文件前面介紹的文件都是文本文件,文本文件是字符流;二進(jìn)制文件是字節(jié)流。(1)二進(jìn)制文件與文本文件的區(qū)別在讀文件時(shí),它們判定文件結(jié)束標(biāo)志的方法存在區(qū)別。在讀文本文件的過(guò)程中,當(dāng)get
之類的成員函數(shù)遇到文件結(jié)束符時(shí),它返回常量EOF作為文件結(jié)束標(biāo)志。二進(jìn)制文件不能用EOF作為文件結(jié)束的判定值,因?yàn)镋OF的值是-1,而-1在二進(jìn)制文件中是一個(gè)有效的數(shù)據(jù)。因此,C++提供成員函數(shù)eof來(lái)解決這個(gè)問(wèn)題,用法如下: intxx::eof()其中,xx代表輸入流對(duì)象,到達(dá)文件末尾時(shí),返回一個(gè)非0值,否則返回0。第九章輸入/輸出流庫(kù)54(2)二進(jìn)制文件操作方法用get和put按字節(jié)方式讀寫文件數(shù)據(jù)。read和write
按數(shù)據(jù)塊的方式讀寫文件數(shù)據(jù)。例:用二進(jìn)制方式建立一個(gè)磁盤文件,將ASCII編碼為0~90之間的字符寫入到文件d:\dk\a.dat中,然后用二進(jìn)制文件方式讀出并在屏幕上顯示a.dat的內(nèi)容#include<iostream.h>#include<fstream.h>voidmain(){ charch; ofstreamout("d:\\dk\\a.dat",ios::out|ios::binary); //dk已存在第九章輸入/輸出流庫(kù)55 for(inti=0;i<90;i++){ if(!(i%30)) out.put('\n'); out.put(char(i)); out.put(''); } out.close(); ifstreamin("d:\\dk\\a.dat",ios::in|ios::binary); while(in.get(ch)) cout<<ch; cout<<endl; in.close();}第九章輸入/輸出流庫(kù)565.隨機(jī)存取文件(1)順序訪問(wèn)與隨機(jī)訪問(wèn)順序訪問(wèn):是指按照從前到后的順序依次對(duì)文件進(jìn)行讀寫操作,有些存儲(chǔ)設(shè)備只支持順序訪問(wèn),如磁帶。隨機(jī)訪問(wèn):也稱為直接訪問(wèn),可以按任意次序?qū)ξ募M(jìn)行讀寫操作。(2)順序文件與隨機(jī)文件順序文件:用于順序訪問(wèn)的文件。隨機(jī)文件:用于隨機(jī)訪問(wèn)的文件。(3)隨機(jī)文件的問(wèn)題①多次讀同一文件,每次從頭讀起,如何完成?②如何指向文件的結(jié)尾?第九章輸入/輸出流庫(kù)57③如何知道文件已結(jié)束?解決方式:對(duì)于隨機(jī)文件,C++流類提供了一個(gè)操作它的文件讀寫指針,該指針可在文件中移動(dòng),將它指向要讀寫的字節(jié)位置,然后從該位置讀取或?qū)懭胫付ㄗ止?jié)數(shù)的數(shù)據(jù)塊,這樣就實(shí)現(xiàn)了文件數(shù)據(jù)的隨機(jī)訪問(wèn)。(4)移動(dòng)文件指針①seekg(pos)和seekp(pos)pos為long型。這兩個(gè)函數(shù)都是從文件頭開(kāi)始,把文件指針向后移動(dòng)pos個(gè)字符(字節(jié)),seekg用于輸入文件;seekp用于輸出文件。②seekg(pos,origin)和seekp(pos,origin)第九章輸入/輸出流庫(kù)58pos為long型。從文件中指定位置開(kāi)始移動(dòng)文件指針,參數(shù)origin表示文件指針位置,pos表示相對(duì)于這個(gè)位置的位移量。origin有3種取值:ios::beg:表示從文件頭開(kāi)始,pos為正。ios::cur:表示從當(dāng)前位置開(kāi)始,pos可正(后移)可負(fù)(前移)。ios::end:表示從文件尾部開(kāi)始,pos為負(fù)。③tellg()和tellp()這兩個(gè)函數(shù)返回文件指針的當(dāng)前位置,tellg()用于輸入文件,tellp()用于輸出文件。第九章輸入/輸出流庫(kù)59(5)read()istream類成員函數(shù)read的原型為:istream&read(char*pDst,intsize);第一個(gè)參數(shù)pDst定位讀取數(shù)據(jù)的存放位置,可以匹配任意類型的起始地址,但調(diào)用時(shí)應(yīng)強(qiáng)制轉(zhuǎn)換為char*。第二個(gè)參數(shù)size指出等待讀取的字節(jié)數(shù),可以設(shè)置為:size=n*sizeof(type)如果type取值為類類型名如CType,則當(dāng)size=n*sizeof(CType),表示讀取n個(gè)對(duì)象。n等于1時(shí)讀取一個(gè)對(duì)象。type也可以是double,此時(shí)表示讀取的數(shù)據(jù)是double型的變量。第九章輸入/輸出流庫(kù)60(6)write()ostream類成員函數(shù)write的原型為:ostream&write(constchar*pSrc,intsize);第一個(gè)形參pSrc定位所寫數(shù)據(jù)源的位置,可匹配任意類型的起始地址,但調(diào)用時(shí)應(yīng)強(qiáng)制轉(zhuǎn)換為char*。第二個(gè)參數(shù)size指出等待存寫的字節(jié)數(shù),可以設(shè)置為:size=n*sizeof(type)如果type取值為double,則當(dāng)size=n*sizeof(double)表示讀取n個(gè)double變量。n等于1時(shí)存寫一個(gè)double變
溫馨提示
- 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒(méi)有圖紙預(yù)覽就沒(méi)有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫(kù)網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 2025年度個(gè)人裝修工程石材安裝合同
- 個(gè)人專屬高效勞務(wù)協(xié)議(2024優(yōu)化版)
- 2025版無(wú)人機(jī)植保作業(yè)質(zhì)量控制合同樣本3篇
- 教育信息化與學(xué)生成長(zhǎng)檔案的建設(shè)研究
- 二零二五年度誠(chéng)意金支付及旅游產(chǎn)品預(yù)購(gòu)協(xié)議4篇
- 二零二五年度綠色食品生產(chǎn)設(shè)備按揭購(gòu)買協(xié)議2篇
- 提升學(xué)生網(wǎng)路素養(yǎng)助力其終身學(xué)習(xí)與發(fā)展
- 2025版無(wú)子女離婚協(xié)議書:離婚后子女權(quán)益保障與家庭責(zé)任協(xié)議12篇
- 二零二五年度車庫(kù)門故障診斷與快速修復(fù)服務(wù)協(xié)議3篇
- 二零二五年度潔具綠色生產(chǎn)認(rèn)證合同范本共20套3篇
- 2025年山東省濟(jì)南市第一中學(xué)高三下學(xué)期期末統(tǒng)一考試物理試題含解析
- 中學(xué)安全辦2024-2025學(xué)年工作計(jì)劃
- 網(wǎng)絡(luò)安全保障服務(wù)方案(網(wǎng)絡(luò)安全運(yùn)維、重保服務(wù))
- 2024年鄉(xiāng)村振興(產(chǎn)業(yè)、文化、生態(tài))等實(shí)施戰(zhàn)略知識(shí)考試題庫(kù)與答案
- 現(xiàn)代科學(xué)技術(shù)概論智慧樹(shù)知到期末考試答案章節(jié)答案2024年成都師范學(xué)院
- 軟件模塊化設(shè)計(jì)與開(kāi)發(fā)標(biāo)準(zhǔn)與規(guī)范
- 2024年遼寧鐵道職業(yè)技術(shù)學(xué)院高職單招(英語(yǔ)/數(shù)學(xué)/語(yǔ)文)筆試歷年參考題庫(kù)含答案解析
- 無(wú)痛人工流產(chǎn)術(shù)課件
- 有機(jī)農(nóng)業(yè)種植模式
- 勞務(wù)派遣招標(biāo)文件
- 法醫(yī)病理學(xué)課件
評(píng)論
0/150
提交評(píng)論