第九章 輸入輸出流庫_第1頁
第九章 輸入輸出流庫_第2頁
第九章 輸入輸出流庫_第3頁
第九章 輸入輸出流庫_第4頁
第九章 輸入輸出流庫_第5頁
已閱讀5頁,還剩63頁未讀, 繼續(xù)免費閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認領(lǐng)

文檔簡介

1第九章輸入/輸出流庫9.1概述C++具有一個功能強大的I/O類繼承體系結(jié)構(gòu)用于處理數(shù)據(jù)的輸入/輸出問題,該體系結(jié)構(gòu)不僅提供了對系統(tǒng)內(nèi)置數(shù)據(jù)類型的輸入/輸出操作,而且允許通過重載擴展其功能以實現(xiàn)自定義數(shù)據(jù)類型的輸入和輸出操作。本章主要介紹C++流的基本結(jié)構(gòu),數(shù)據(jù)的輸入輸出及其格式化問題,同時還介紹了C++文件的編程技術(shù)。1.流的概念A(yù)8bctyx1234源設(shè)備目標設(shè)備字符序列從源設(shè)備連續(xù)不斷地流向目標設(shè)備,最后按先流出先到達的有序方式匯聚在目標設(shè)備中,如同河流一樣,故此叫流。2第九章輸入/輸出流庫(1)流有向的數(shù)據(jù)流動的抽象描述,是數(shù)據(jù)流動的渠道和方向,是程序與輸入/輸出設(shè)備的連接橋梁。(2)I/O流指對流的操作集合,它將數(shù)據(jù)流向流對象,或從流對象流出數(shù)據(jù)。(3)輸出流數(shù)據(jù)從內(nèi)存緩沖區(qū)傳送到目標設(shè)備中的流。(4)輸入流數(shù)據(jù)從目標設(shè)備傳送到內(nèi)存緩沖區(qū)中的流。3第九章輸入/輸出流庫流實際上是一種對象,它在使用前被建立,使用后被刪除。如:cin表示輸入流對象,C++已將其與鍵盤關(guān)聯(lián);cout表示輸出流對象,C++已將其與顯示器關(guān)聯(lián)。數(shù)據(jù)的輸入/輸出操作就是從流中提取數(shù)據(jù)或者向流中添加數(shù)據(jù)。通常把從流中提取數(shù)據(jù)的操作稱為析取,即讀操作;向流中添加數(shù)據(jù)的操作稱為插入操作,即寫操作。2.C++I/O流類的繼承結(jié)構(gòu)C++建立了一個十分龐大的流類庫來實現(xiàn)數(shù)據(jù)的輸入/輸出操作,其中的每個流類實現(xiàn)不同的功能,這些類通過繼承組合在一起。4第九章輸入/輸出流庫5第九章輸入/輸出流庫3.C++主要的流類簡介(1)streambuf主要作為其他類的支持,定義了對緩沖區(qū)的通用操作,如設(shè)置緩沖區(qū),從緩沖區(qū)中讀取數(shù)據(jù),或向緩沖區(qū)寫入數(shù)據(jù)等操作。(2)filebuf類使用文件來保存緩沖區(qū)中的字符序列。它定義了文件讀、寫、打開、關(guān)閉等常用操作。(3)ios是所有流類的基類,提供對流狀態(tài)進行設(shè)置的主要功能。如文件數(shù)據(jù)的格式碼設(shè)置與取消,關(guān)鏈文件緩沖區(qū)借以實現(xiàn)數(shù)據(jù)讀寫等。(4)istream是輸入流類,實現(xiàn)數(shù)據(jù)輸入的功能。(5)ostream是輸出流類,實現(xiàn)數(shù)據(jù)輸出的功能。6第九章輸入/輸出流庫(6)iostream是istream和ostream的派生類,它繼承了istream類和ostream類的行為,支持數(shù)據(jù)輸入、輸出的雙向操作,在程序中常通過它來實現(xiàn)數(shù)據(jù)的輸入與輸出功能。(7)fstreambase從ios派生,提供了文件操作的許多功能,作為其他文件操作類的公共基類。(8)ifstream類用來實現(xiàn)文件讀取操作。(9)ofstream類用來實現(xiàn)文件寫入操作。(10)fstream繼承了fstreambase和iostream類的功能,實現(xiàn)了文件讀/寫的雙向操作。4.C++預(yù)定義的輸入/輸出流對象為了便于程序數(shù)據(jù)的輸入/輸出,C++預(yù)定義了幾個標準輸入/輸出流對象,在程序中可以直接引用它們來輸入/輸出數(shù)據(jù)。如下表所示:7第九章輸入/輸出流庫流對象定義說明ostreamcout;cout與標準輸出設(shè)備相關(guān)聯(lián)(顯示器)ostreamcerr;cerr與標準錯誤輸出設(shè)備相關(guān)聯(lián)(非緩沖方式)ostreamclog;clog與標準錯誤輸出設(shè)備相關(guān)聯(lián)(緩沖方式)istreamcin;與標準輸入設(shè)備相關(guān)聯(lián)(鍵盤)89.2使用cin與cout輸入/輸出數(shù)據(jù)cin:設(shè)備輸入流對象(鍵盤),與運算符>>一起完成輸入操作。cout:設(shè)備輸出流對象(顯示器),與運算符<<一起完成輸出操作。<<:插入操作符,是重載的左移位運算符,C++編譯時首先檢查其左右操作數(shù),以判斷是執(zhí)行移位還是插入操作,所以不會出現(xiàn)歧義。該操作符用來輸出變量數(shù)據(jù)。格式為:cout<<輸出項列表(常量、變量、轉(zhuǎn)義符等);>>:析取操作符,是重載的右移位運算符,C++編譯時首先檢查其左右操作數(shù),以判斷是執(zhí)行移位還是析取操作,所以不會出現(xiàn)歧義。該操作符用來為變量輸入數(shù)據(jù)。格式為:cin>>變量列表;第九章輸入/輸出流庫91.使用cin輸入數(shù)據(jù)(1)語法①輸入單個變量的值 cin>>x;②輸入多個變量的值 cin>>x1>>x2>>x3>>x4>>……>>xn;其中x,x1,……,xn可以是內(nèi)置數(shù)據(jù)類型如int,char,float,double等。(2)注意事項①在一條cin語句中同時為多個變量輸入數(shù)據(jù)時,輸入數(shù)據(jù)的個數(shù)應(yīng)當(dāng)與cin語句中變量個數(shù)相同,各輸入數(shù)據(jù)之間用一個或多個空白(包括空格、回車、Tab)作為間隔符,全部數(shù)據(jù)輸入完成后,按Enter鍵結(jié)束。第九章輸入/輸出流庫10②在>>后面只能出現(xiàn)變量名,下面的語句是錯誤的。cin>>"x=">>x; //錯誤,>>后面含有字符串"x="cin>>12>>x; //錯誤,>>后面含有常數(shù)12③cin具有自動識別數(shù)據(jù)類型的能力,析取運算>>將根據(jù)它后面的變量的類型從輸入流中為它們提取對應(yīng)的數(shù)據(jù)。比如:cin>>x;假設(shè)輸入數(shù)據(jù)2,析取運算符>>將根據(jù)其后的x的類型決定輸入的2到底是數(shù)字還是字符。若x是char類型,則2就是字符;若x是int,float之類的類型,則2就是一個數(shù)字。再如,若輸入34,且x是char類型,則只有字符3被存儲到x中,4將繼續(xù)保存在流中;若x是int或float,則34就會存儲x中。第九章輸入/輸出流庫11④數(shù)值型數(shù)據(jù)的輸入在讀取數(shù)值型數(shù)據(jù)時,析取運算符>>首先略掉數(shù)據(jù)前面的所有空白符號,在遇到正、負號或數(shù)字,才開始讀入,包括浮點型數(shù)據(jù)的小數(shù)點,并在遇到空白符或其他非數(shù)字字符時停止。例如: intx1; doublex2; charx3; cin>>x1>>x2>>x3;假如輸入35.4A并按Enter鍵,x1是35、x2是0.4、x3是‘A’。(3)輸入數(shù)據(jù)案例分析第九章輸入/輸出流庫12假設(shè)有變量定義語句如下:inta,b;doublez;charch;下面的語句說明數(shù)據(jù)輸入的含義。語句 輸入 內(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第九章輸入/輸出流庫13語句 輸入 內(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,等待輸入下一個數(shù)據(jù)存入zcin>>a>>z; 23.224 a=2,z=3.2,24被保留在輸入流中等待被讀取cin>>a>>ch; 132 a=132,計算機等待輸入ch的值cin>>ch>>a; 132 ch='1',a=32第九章輸入/輸出流庫142.使用cout輸出數(shù)據(jù)(1)語法①輸出單個變量的值 cout<<x;②輸出多個變量的值 cout<<x1<<x2<<x3<<x4<<……<<xn;其中x,x1,……,xn可以是內(nèi)置數(shù)據(jù)類型如int,char,float,double等。(2)注意事項①cout既可輸出變量的值,也可輸出常量。②對于字符變量和字符串變量,cout將把變量的值輸出到顯示器上。對于字符常量和字符串常量,cout將把它們原樣輸出在屏幕上。第九章輸入/輸出流庫15③與C語言一樣,在C++程序中也可以將一條命令寫在多行上。④輸出換行。在cout語句中換行可用:“\n”或endl。⑤在連續(xù)輸出多個數(shù)據(jù)時,應(yīng)注意在數(shù)據(jù)之間插入間隔符。因為cout輸出不帶任何格式。⑥確定數(shù)制基數(shù),輸出時可用hex(16進制),oct(8進制),dec(10進制)指定輸出數(shù)值型數(shù)據(jù)的進制。如:#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}第九章輸入/輸出流庫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); ......};第九章輸入/輸出流庫172.istream成員函數(shù)使用說明(1)get()函數(shù)①intget()不帶參數(shù)的get()從輸入流中提取一個字符(包括空白字符),并返回該字符作為函數(shù)的調(diào)用值。當(dāng)遇到文件結(jié)束時,返回文件結(jié)束符EOF。②istream&get(char*c,intn,char='\n')從輸入流中提取n-1個字符(包括空白字符)存入字符數(shù)組c中,并在字符串末尾自動加'\0'。第3個參數(shù)用于指定字符結(jié)束的分隔符,默認是‘\n’。該函數(shù)在下列情況會終止讀取字符的操作:讀取了n-1個字符;遇到了指定的結(jié)束分隔符;遇到了文件結(jié)束符。第九章輸入/輸出流庫18注意:該函數(shù)不會將輸入流中的結(jié)束分隔符讀入數(shù)組中,數(shù)據(jù)讀取完成后結(jié)束分隔符仍保留在輸入流中,為后續(xù)數(shù)據(jù)讀入留下隱患。③istream&get(char&c)從輸入流中提取一個字符(包括空白字符)送字符引用c中。遇到文件結(jié)束符時返回0,否則返回istream對象的引用。(2)istream&read(char*c,intn)從輸入流中讀取n個字節(jié)送字符數(shù)組c中。非格式化的讀,對讀取的字節(jié)不作任何處理,數(shù)據(jù)由程序解釋。(3)istream&ignore(intn=1,int=EOF)從輸入流中讀取n個(默認1個)字符不保存,遇到指定結(jié)束符(默認EOF)時終止輸入。實質(zhì)上從輸入流中刪除n個字符。第九章輸入/輸出流庫19(4)istream&getline(char*c,intn,char='\n')從輸入流中提取n-1個字符(包括空白字符)存入字符數(shù)組c中,并在字符串末尾自動加'\0'。第3個參數(shù)用于指定字符結(jié)束的分隔符,默認是‘\n’。該函數(shù)在下列情況會終止讀取字符的操作:讀取了n-1個字符;遇到了指定的結(jié)束分隔符;遇到了文件結(jié)束符。注意:該函數(shù)不會將輸入流中的結(jié)束分隔符讀入數(shù)組中,但會清除結(jié)束分隔符,為后續(xù)數(shù)據(jù)讀入提供方便。第九章輸入/輸出流庫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個字符 cout<<a<<endl; //顯示12345678 cin.ignore(); //清除上次輸入的’\n’第九章輸入/輸出流庫21 cout<<"usegetline(s1,10)inputchar:"; cin.getline(s1,10); //輸入thisisastr,讀9個 cout<<s1<<endl; //顯示thisisa}本例輸入流及數(shù)據(jù)讀取情況如下圖所示:第九章輸入/輸出流庫223.ostream類中的常用成員函數(shù)classostream:virtualpublicios{public: ostream&operator<<(long&); ostream&operator<<(…); //還有重載其它類型數(shù)據(jù)的輸出 ...... ostream&flush(); ostream&put(char); ostream&write(constchar*,int); ......};第九章輸入/輸出流庫234.ostream成員函數(shù)使用說明(1)ostream&put(charc)插入一個無格式的字節(jié)到輸出流中。其中c是要輸出的字符,函數(shù)返回輸出流對象的引用。(2)ostream&write(constchar*c,intn)插入一個無格式的字符序列到輸出流中。其中c是要輸出的字符數(shù)組,n是要輸出的字符個數(shù),函數(shù)返回輸出流對象的引用。(3)ostream&flush()緩沖輸出:數(shù)據(jù)寫入緩沖區(qū),緩沖區(qū)滿時才將數(shù)據(jù)送輸出設(shè)備。緩沖輸出的輸出數(shù)據(jù)會有所延遲。非緩沖輸出:數(shù)據(jù)寫入緩沖區(qū),并立即將數(shù)據(jù)送輸出設(shè)備。第九章輸入/輸出流庫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!第九章輸入/輸出流庫259.4數(shù)據(jù)輸入/輸出的格式控制1.格式控制的目的(1)進行不同進制之間的轉(zhuǎn)換:8進制、16進制、十進制等。(2)精度的控制:小數(shù)點的位數(shù)等。(3)輸入/輸出的寬度控制。(4)格式之間的狀態(tài)轉(zhuǎn)換。2.格式控制的方法(1)使用ios類中的有關(guān)格式控制的成員函數(shù)①格式控制狀態(tài)標志輸入輸出的格式由各種狀態(tài)標志來確定,這些標志在ios類中定義為枚舉量,用一個十六位二進制數(shù)表示。第九章輸入/輸出流庫26ios::skipws 跳過輸入流中的空白字符ios::left 輸出數(shù)據(jù)按左對齊,如[12]ios::right 輸出數(shù)據(jù)按右對齊,如[12]ios::dec 按十進制數(shù)據(jù)輸出ios::oct 按八進制數(shù)據(jù)輸出ios::hex 按十六進制數(shù)據(jù)輸出ios::showbase 在輸出數(shù)據(jù)前面顯示基數(shù)(八進制是0,十六進制是0x)ios::showpoint 浮點數(shù)輸出帶小數(shù)點ios::uppercase 用大寫字母輸出十六進制數(shù)(即ABCDEF,默認是小寫)ios::showpos 在正數(shù)前加“+”ios::scientific 用科學(xué)計數(shù)法輸出浮點數(shù),如[2.122E2]ios::fixed 用定點數(shù)形式輸出浮點數(shù),如[212.2]ios::unitbuf 完成后立即刷新緩沖區(qū)第九章輸入/輸出流庫27②設(shè)置標志用ios類的成員函數(shù)setf()設(shè)置,格式為:cin.setf(ios::標志位|……); //“|”表示同時設(shè)置若干個標志或cout.setf(ios::標志位|……);③清除標志用ios類的成員函數(shù)unsetf()設(shè)置,格式為:cin.unsetf(ios::標志位|……); //“|”表示同時清除若干個標志或cout.unsetf(ios::標志位|……);④取狀態(tài)標志用ios類的成員函數(shù)flags(),格式為:cin.flags();cout.flags(); //返回流的標志位或cin.flags(ios::標志位);cout.flags(ios::標志位);//重新設(shè) //置并返回流的標志位第九章輸入/輸出流庫28⑤設(shè)置域?qū)捰胕os類的成員函數(shù)width()設(shè)置,格式為:cout.width(n); //設(shè)置輸出域?qū)抧位并返回原來域?qū)抍out.width(); //返回當(dāng)前域?qū)挗尢畛渥址胕os類的成員函數(shù)fill()設(shè)置,與width()配合,格式為:cout.fill(字符); //設(shè)置填充字符并返回原來填充字符cout.fill(); //返回當(dāng)前填充字符⑦設(shè)置精度用ios類的成員函數(shù)precision()設(shè)置,格式為:cout.precision(n); //設(shè)置顯示精度為n位并返回原來精度cout.precision(); //返回當(dāng)前顯示精度第九章輸入/輸出流庫29例:用ios成員函數(shù)及格式化標志設(shè)置輸出數(shù)據(jù)的格式#include<iostream.h>voidmain(){ charc[]="thisisstring"; doubled=-1234.8976; cout.width(30); //設(shè)置域?qū)?0個字符 cout.fill(‘*’); //填充字符“*” cout.setf(ios::right); //輸出右對齊(默認) cout<<c<<“----L1”<<endl; //輸出c,左邊填充“*” cout.width(30); //每個輸出語句需要設(shè)置寬度 cout.setf(ios::left); //左對齊 cout<<c<<“----L2”<<endl; //輸出c,右邊填充“*“第九章輸入/輸出流庫30 cout.setf(ios::dec|ios::showbase|ios::showpoint); cout.width(30); //十進制,顯示基數(shù),浮點數(shù)輸出帶小數(shù)點 cout<<d<<“----L3”<<“\n”; //默認6位精度 cout.setf(ios::showpoint); //浮點數(shù)輸出帶小數(shù)點 cout.precision(10); //精度10位,不含小數(shù)點與符號位 cout.width(30); //每個輸出語句需要設(shè)置寬度 cout<<d<<"----L4"<<"\n"; cout.width(30); cout.setf(ios::oct); //顯示基數(shù),八進制 cout<<100<<"----L5"<<"\n";}第九章輸入/輸出流庫31運行結(jié)果:****************thisisstring----L1thisisstring****************----L2-1234.90**********************----L3-1234.897600******************----L40144**************************----L5第九章輸入/輸出流庫32(2)使用操縱符及操縱符函數(shù)控制格式改變格式比較簡單的方法是使用特殊的、類似于函數(shù)的運算符,稱為操縱符,也叫操縱算子。它以一個流引用為參數(shù),并返回同一流的引用,并可以嵌入到輸入或輸出鏈中,即不要前綴流對象,直接調(diào)用操縱符。使用操縱符及操縱符函數(shù)需要在源程序中包含頭文件“iomanip.h”①操縱符第九章輸入/輸出流庫33Showbase(noshowbase) 顯示(不顯示)數(shù)值的基數(shù)前綴Showpoint(noshowpoint) 顯示小數(shù)點(存在小數(shù)部分時才顯示小數(shù)點)showpos(noshowpos) 在非負數(shù)中顯示(不顯示)”+”skipws(noskips) 輸入數(shù)據(jù)時,跳過(不跳過)空白字符uppercase(nouppercase) 十六進制顯示為0X(0x),科學(xué)計數(shù)法顯示E(e)dec/oct/hex 十進制/八進制/十六進制left/right 設(shè)置數(shù)據(jù)輸出對齊方式為:左/右對齊fixed 以小數(shù)形式顯示浮點數(shù)scientific 用科學(xué)計數(shù)法顯示浮點數(shù)flush 刷新輸出緩沖區(qū)ends 插入空白字符,然后刷新ostream緩沖區(qū)endl 插入換行字符,然后刷新ostream緩沖區(qū)ws 跳過開始的空白第九章輸入/輸出流庫34②操縱符函數(shù)setfill(ch) 設(shè)置以ch中的字符為填充字符setprecision(n) 設(shè)置精度為n位有效數(shù)字setw(w) 設(shè)置數(shù)據(jù)的輸出寬度為w個字符setbase(b) 基數(shù)設(shè)置為b(b=8,10,16)進制第九章輸入/輸出流庫35例:實數(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è)置精度}第九章輸入/輸出流庫36運行結(jié)果:111.41.411.4141.41421.414211.4142141.4142136第九章輸入/輸出流庫37例:輸出寬度的控制#include<iostream.h>#include<iomanip.h>voidmain(){intx=12345;

//缺省格式為右對齊cout<<"Defaultisonright:"<<endl <<setw(10)<<x<<endl<<endl;

//修改為左對齊cout.setf(ios::left);cout<<setw(10)<<x<<endl<<endl;

//取消左對齊又變?yōu)橛覍Rcout.unsetf(ios::left);cout<<setw(10)<<x<<endl;}運行結(jié)果:Defaultisonright:123451234512345第九章輸入/輸出流庫38例:格式輸出中空白的填充#include<iostream.h>#include<iomanip.h>voidmain(){intx=12345;

//缺省為右對齊cout<<"Defaultisonright:"<<endl <<setw(10)<<x<<endl<<endl;

//右對齊,左邊填充“*”cout.fill('*');cout<<setw(10)<<x<<endl<<endl;

//左對齊,右邊填充“%”cout.setf(ios::left);cout<<setw(10)<<setfill('%')<<x<<endl;}運行結(jié)果:Defaultisonright:12345*****1234512345%%%%%第九章輸入/輸出流庫39例:科學(xué)計算等格式輸出#include<iostream.h>voidmain(){doublex=0.001234567,y=1.946e9;cout<<"Displayedindefaultformat:"<<endl <<x<<'\t'<<y<<endl<<endl; //缺省格式輸出(定點)cout.setf(ios::scientific); //科學(xué)表示格式輸出cout<<"Displayedinscientificformat:"<<endl <<x<<'\t'<<y<<endl;cout.setf(ios::fixed); //定點格式輸出cout<<"Displayedinfixedformat:"<<endl <<x<<'\t'<<y<<endl;}第九章輸入/輸出流庫40運行結(jié)果:Displayedindefaultformat:0.001234571.946e+009Displayedinscientificformat:1.234567e-0031.946000e+009Displayedinfixedformat:0.001234571.946e+009第九章輸入/輸出流庫419.5文件的輸入/輸出1.概述(1)文件的概念文件是存儲在存儲介質(zhì)上(如磁盤、磁帶、光盤)的數(shù)據(jù)集合。(2)文件的類型①文本文件文本文件在磁盤上存放相關(guān)字符的ASCII碼,所以又稱為ASCII文件。②二進制文件二進制文件在磁盤上存儲相關(guān)數(shù)據(jù)的二進制代碼,它是把內(nèi)存中的數(shù)據(jù),按其在內(nèi)存中的存儲形式原樣寫到磁盤上而形成的文件。第九章輸入/輸出流庫42(3)流與文件C++將文件看成是一個個字符在磁盤上的有序集合,用流來實現(xiàn)文件的讀寫操作。輸入:數(shù)據(jù)流從文件流入內(nèi)存。輸出:數(shù)據(jù)流從內(nèi)存流入文件。從操作系統(tǒng)的觀點,所有與主機相連的設(shè)備都視為文件,如鍵盤、顯示器、打印機等。(4)與文件相關(guān)的流C++有3種文件流:輸入文件流ifstream、輸出文件流ofstream、輸入/輸出文件流fstream。這些文件流都定義在fstream.h文件中。第九章輸入/輸出流庫432.文件操作的一般步驟(1)在源程序中包含頭文件fstream.h;(2)為要進行操作的文件建立一個流,即定義流對象;如:ifstreamin; //定義輸入流對象in ofstreamout; //定義輸出流對象out fstreamio; //定義輸入輸出流對象io(3)使用open()函數(shù)建立(打開)文件。不存在則建立、存在則打開;(4)進行文件的讀寫操作;(5)使用close()函數(shù)關(guān)閉文件。3.文件的打開與關(guān)閉第九章輸入/輸出流庫44(1)打開文件①open()函數(shù)的原型 voidopen(char*filename,intmod,intaccess);②*filename:指向文件名字符串的指針③mod:文件的打開方式第九章輸入/輸出流庫45第九章輸入/輸出流庫文件打開方式說明ios::in以輸入方式打開文件,即讀文件(ifstream類對象默認方式)ios::out以輸出方式打開文件,即寫文件(ofstream類對象默認方式)ios::app以添加方式打開文件,新增加的內(nèi)容添加在文件尾ios::ate以添加方式打開文件,新增加的內(nèi)容添加在文件尾,但下次添加時則添加在當(dāng)前位置ios::trunc如文件存在就打開并清除其內(nèi)容,如不存在就建立新文件ios::binary以二進制方式打開文件(默認為文本文件)ios::nocreate打開已有文件,若文件不存在,則打開失敗ios::noreplace若打開的文件已經(jīng)存在,則打開失敗46④access:文件的訪問方式,缺省值為“0” 0:一般文件;1:只讀文件;2:隱藏文件;3:系統(tǒng)文件⑤打開格式 流對象.open(filename,mod,access);⑥討論第一、ofstreamout; //定義流類對象out out.open(“test”,ios::out,0); //打開或:out.open(“test”); //缺省為輸出第九章輸入/輸出流庫47第九章輸入/輸出流庫第二、在實際中,常用下面的方式來打開: ofstreamout(“test”); //創(chuàng)建流對象的同時打開文件第三、為確定一個文件是否能夠打開,可以使用下面的方法: ifstreammystream(“myfile”);//文件打開失敗,mystream=0 if(!mystream) cout<<“Cannotopenthefile!\n”; //顯示錯誤信息(2)關(guān)閉文件 流對象.close() 如:mystream.close();48第九章輸入/輸出流庫例9.14一個簡單的輸入輸出例子//Saveasmain.cpp#include<fstream.h>voidmain(){ ofstreamostrm; //定義輸出流對象 ostrm.open(“f1.dat”); //創(chuàng)建文件 ostrm<<120<<endl; //寫文件 ostrm<<310.85<<endl; //寫文件 ostrm.close(); //關(guān)閉文件 ifstreamistrm(“f1.dat”); //定義輸入流對象并打開文件49第九章輸入/輸出流庫 intn; doubled; istrm>>n>>d; //讀文件 cout<<n<<","<<d<<endl; istrm.close(); //關(guān)閉文件}運行結(jié)果:50例9.15把一個整數(shù)、一個浮點數(shù)和一個字符串寫入磁盤文件test中。//Saveasmain.cpp#include<fstream.h> //包含輸入輸出文件流的頭文件voidmain(){ofstreammyout(“test”); //定義流對象myout并創(chuàng)建文件testif(!myout) cout<<"cannotopenfile:test";myout<<10<<""<<123.45<<""<<"object\n";//向文件寫數(shù)據(jù)myout.close(); //關(guān)閉文件}第九章輸入/輸出流庫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)閉文件第九章輸入/輸出流庫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)) //逐個讀出字符到ch,直到結(jié)束標志‘\0’ myout.put(ch); //將ch中的字符寫入到文件,最后自動寫入結(jié)束標志myin.close();myout.close();}第九章輸入/輸出流庫534.二進制文件前面介紹的文件都是文本文件,文本文件是字符流;二進制文件是字節(jié)流。(1)二進制文件與文本文件的區(qū)別在讀文件時,它們判定文件結(jié)束標志的方法存在區(qū)別。在讀文本文件的過程中,當(dāng)get

之類的成員函數(shù)遇到文件結(jié)束符時,它返回常量EOF作為文件結(jié)束標志。二進制文件不能用EOF作為文件結(jié)束的判定值,因為EOF的值是-1,而-1在二進制文件中是一個有效的數(shù)據(jù)。因此,C++提供成員函數(shù)eof來解決這個問題,用法如下: intxx::eof()其中,xx代表輸入流對象,到達文件末尾時,返回一個非0值,否則返回0。第九章輸入/輸出流庫54(2)二進制文件操作方法用get和put按字節(jié)方式讀寫文件數(shù)據(jù)。read和write

按數(shù)據(jù)塊的方式讀寫文件數(shù)據(jù)。例:用二進制方式建立一個磁盤文件,將ASCII編碼為0~90之間的字符寫入到文件d:\dk\a.dat中,然后用二進制文件方式讀出并在屏幕上顯示a.dat的內(nèi)容#include<iostream.h>#include<fstream.h>voidmain(){ charch; ofstreamout("d:\\dk\\a.dat",ios::out|ios::binary); //dk已存在第九章輸入/輸出流庫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();}第九章輸入/輸出流庫565.隨機存取文件(1)順序訪問與隨機訪問順序訪問:是指按照從前到后的順序依次對文件進行讀寫操作,有些存儲設(shè)備只支持順序訪問,如磁帶。隨機訪問:也稱為直接訪問,可以按任意次序?qū)ξ募M行讀寫操作。(2)順序文件與隨機文件順序文件:用于順序訪問的文件。隨機文件:用于隨機訪問的文件。(3)隨機文件的問題①多次讀同一文件,每次從頭讀起,如何完成?②如何指向文件的結(jié)尾?第九章輸入/輸出流庫57③如何知道文件已結(jié)束?解決方式:對于隨機文件,C++流類提供了一個操作它的文件讀寫指針,該指針可在文件中移動,將它指向要讀寫的字節(jié)位置,然后從該位置讀取或?qū)懭胫付ㄗ止?jié)數(shù)的數(shù)據(jù)塊,這樣就實現(xiàn)了文件數(shù)據(jù)的隨機訪問。(4)移動文件指針①seekg(pos)和seekp(pos)pos為long型。這兩個函數(shù)都是從文件頭開始,把文件指針向后移動pos個字符(字節(jié)),seekg用于輸入文件;seekp用于輸出文件。②seekg(pos,origin)和seekp(pos,origin)第九章輸入/輸出流庫58pos為long型。從文件中指定位置開始移動文件指針,參數(shù)origin表示文件指針位置,pos表示相對于這個位置的位移量。origin有3種取值:ios::beg:表示從文件頭開始,pos為正。ios::cur:表示從當(dāng)前位置開始,pos可正(后移)可負(前移)。ios::end:表示從文件尾部開始,pos為負。③tellg()和tellp()這兩個函數(shù)返回文件指針的當(dāng)前位置,tellg()用于輸入文件,tellp()用于輸出文件。第九章輸入/輸出流庫59(5)read()istream類成員函數(shù)read的原型為:istream&read(char*pDst,intsize);第一個參數(shù)pDst定位讀取數(shù)據(jù)的存放位置,可以匹配任意類型的起始地址,但調(diào)用時應(yīng)強制轉(zhuǎn)換為char*。第二個參數(shù)size指出等待讀取的字節(jié)數(shù),可以設(shè)置為:size=n*sizeof(type)如果type取值為類類型名如CType,則當(dāng)size=n*sizeof(CType),表示讀取n個對象。n等于1時讀取一個對象。type也可以是double,此時表示讀取的數(shù)據(jù)是double型的變量。第九章輸入/輸出流庫60(6)write()ostream類成員函數(shù)write的原型為:ostream&write(constchar*pSrc,intsize);第一個形參pSrc定位所寫數(shù)據(jù)源的位置,可匹配任意類型的起始地址,但調(diào)用時應(yīng)強制轉(zhuǎn)換為char*。第二個參數(shù)size指出等待存寫的字節(jié)數(shù),可以設(shè)置為:size=n*sizeof(type)如果type取值為double,則當(dāng)size=n*sizeof(double)表示讀取n個double變量。n等于1時存寫一個double變

溫馨提示

  • 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)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論