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

下載本文檔

版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領

文檔簡介

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

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

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

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

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯系上傳者。文件的所有權益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網頁內容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
  • 4. 未經權益所有人同意不得將文件中的內容挪作商業或盈利用途。
  • 5. 人人文庫網僅提供信息存儲空間,僅對用戶上傳內容的表現方式做保護處理,對用戶上傳分享的文檔內容本身不做任何修改或編輯,并不能對任何下載內容負責。
  • 6. 下載文件中如有侵權或不適當內容,請與我們聯系,我們立即糾正。
  • 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論