版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領
文檔簡介
《面向對象程序設計》七、輸入/輸出流對象2/4/20231第7章輸入/輸出流對象內容提要螺旋矩陣的輸入/輸出問題流無格式輸入/輸出輸入/輸出的格式控制自定義類型對象的輸入輸出文件的輸入/輸出問題2/4/20232第7章輸入/輸出流對象提出問題編程輸出M*M的螺旋矩陣,要求數據間距與M相同。例如,4*4的螺旋矩陣,其間距為4:
123412131451116156109872/4/20233第7章輸入/輸出流對象分析問題C++沒有定義任何用于執(zhí)行輸入或輸出的語句,但可以使用C語言中的標準I/O函數printf()和scanf()來解決此問題。2/4/20234第7章輸入/輸出流對象【例】有如下程序:#include<stdio.h>intb=20;floata=5.6;intmain(){printf("%d\n",a);scanf("%d",&a);scanf("%d",&b);printf("%d\n","abc");return0;}該程序的運行結果為:161061273623↙45↙43499802/4/20235第7章輸入/輸出流對象printf()與scanf()存在以下兩個缺點:1.非類型安全2.不可擴充性classA{…}Aa;…printf("%?",a);//不知用什么格式符來識別A的對象2/4/20236第7章輸入/輸出流對象C++用I/O流來解決這個問題。下面先介紹流的概念。2/4/20237第7章輸入/輸出流對象流的概念在C++程序中,數據可以從外部設備(鍵盤等)流入到計算機內存中,也可以從計算機內存流向外部設備(屏幕或磁盤文件等),這種數據傳遞被稱作輸入輸出。C++將數據從一個位置到另一個位置的傳遞抽象為流。所謂流(stream)就是指數據從一個位置流向另一個位置。流是字節(jié)的序列。C++的輸入輸出操作是基于流來處理的。2/4/20238第7章輸入/輸出流對象I/O流操作C++基于流的概念處理數據的輸入輸出,因此也稱之為輸入輸出流,即I/O流。I/O流具有兩個基本的行為特征,一是從流中獲取數據的操作稱為提取操作,二是向流中添加數據的操作稱為插入操作。2/4/20239第7章輸入/輸出流對象I/O流類C++標準庫圍繞流的概念,提供了一整套I/O流類簇,既可用于標準類型數據的I/O,也能用于自定義類型對象的I/O,這種擴展性是C++最有價值的特點之一。C++標準庫提供的I/O流類的各種操作都是類型安全(typesafe)的。不同類型的I/O流操作都是重載的,沒有定義過I/O功能的類型不具備I/O操作的能力。2/4/202310第7章輸入/輸出流對象I/O流類簇的層次結構C++標準庫提供的I/O流類簇有兩個平行基類:streambuf(filebuf,stringbuf,strstreambuf)ios(istream,ostream)ios類有下面直接派生類:輸入流類istream (ifstream,istringstream,istrstream)輸出流類ostream (ofstream,ostringstream,ostrstream)(iostream->fstream,stringstream,strstream)2/4/202311第7章輸入/輸出流對象I/O流分類C++標準庫提供的I/O流按功能可分為如下3類:標準I/O流:內存與標準輸入輸出設備(鍵盤、屏幕)之間數據的傳遞;文件I/O流:內存與外部磁盤文件之間數據的傳遞;字符串I/O流:內存變量與表示字符串流的字符數組之間數據的傳遞。2/4/202312第7章輸入/輸出流對象標準I/O流對象標準I/O流預定義了4個流類對象:cin、cout、cerr、clog。操作系統(tǒng)給把外設用文件名的方式進行管理,因此程序設計要訪問外設就跟訪問文件一樣方便。
2/4/202313第7章輸入/輸出流對象I/O分為無格式支持的低級I/O和具有格式支持的高級I/O。無格式支持的低級I/O以基本字節(jié)為操作對象,有格式支持的高級I/O把若干字節(jié)組合成有意義的單位,如整數、浮點數、字符、字符串及用戶自定義類型等等。2/4/202314第7章輸入/輸出流對象無格式輸入/輸出無格式輸入/輸出就是按系統(tǒng)預定義的格式進行的輸入/輸出。按默認約定,每個C++程序都能使用標準I/O流,如標準輸入、標準輸出。cin用來處理標準輸入,即鍵盤輸入;cout用來處理標準輸出,即屏幕輸出。它們被定義在iostream頭文件中。在使用cout和cin前,要用編譯預處理命令將所使用的頭文件包含到源程序中,其格式如下:
#include<iostream>2/4/202315第7章輸入/輸出流對象無格式輸出“<<”是預定義的插入運算符,作用在流類對象cout上,實現默認格式的屏幕輸出。使用cout輸出表達式值到屏幕上的格式如下:
cout<<E1<<E2<<…<<Em; 其中,E1、E2、…、Em為均為表達式。功能是計算各表達式的值,并將結果輸出到屏幕當前光標位置處。2/4/202316第7章輸入/輸出流對象無格式輸出cout是ostream流類的對象,它在iostream頭文件中作為全局對象定義,其格式如下: ostreamcout(stdout); 其中,stdout表示標準輸出設備名(屏幕)。在ostream流類中,對應每個基本數據類型定義運算符“<<”重載函數為友元,它們在ostream中聲明:ostream&operator<<(ostream&dest,char*pSource);ostream&operator<<(ostream&dest,intsource);ostream&operator<<(ostream&dest,charsource);2/4/202317第7章輸入/輸出流對象無格式輸入“>>”是預定義的提取運算符,作用在流類對象cin上,實現默認格式的鍵盤輸入。使用cin將數據輸入到變量的格式如下:
cin>>V1>>V2>>…>>Vn;
其中,V1、V2、…、Vn都是變量。功能是暫停執(zhí)行程序,等待用戶從鍵盤輸入數據,各數據間用空格或Tab鍵分隔,輸入數據類型要與接受變量類型一致,輸完后,按回車鍵結束。2/4/202318第7章輸入/輸出流對象無格式輸入cin是istream流類的對象,它在iostream頭文件中作為全局對象定義,其格式如下: istreamcin(stdin);在istream流類中,對應每個基本數據類型定義運算符“>>”重載函數為友元,它們在istream中聲明: istream&operator>>(istream&sour,char*pDes); istream&operator>>(istream&sour,intdes); istream&operator>>(istream&sour,chardes);2/4/202319第7章輸入/輸出流對象輸入輸出的格式控制C++提供了兩種格式化輸入/輸出方式:一種是用ios類成員函數進行格式化輸入輸出另一種是用專門的操作符函數進行格式化輸入輸出2/4/202320第7章輸入/輸出流對象用ios類成員函數格式化ios類成員函數主要是通過對狀態(tài)標志、輸出寬度、填充字符以及輸出精度的操作來完成輸入/輸出格式化。輸入輸出格式由各種狀態(tài)標志來確定,這些狀態(tài)標志在ios類中定義為枚舉量。由于該枚舉量定義在ios類中,因此引用時必須包含ios::前綴。使用時應該全部用符號名,絕不要用數值。2/4/202321第7章輸入/輸出流對象enum{ skipws=0x0001, //跳過輸入空格 left=0x0002, //按左對齊格式輸出 right=0x0004, //按右對齊格式輸出 internal=0x0008, //輸出符號和基指示符后的填補 dec=0x0010, //轉換為十進制(In/Out) oct=0x0020, //轉換為八進制(In/Out) hex=0x0040, //轉換為十六進制(In/Out) showbase=0x0080, //輸出顯示基指示符 showpoint=0x0100, //輸出顯示小數點 uppercase=0x0200, //大寫十六進制輸出 showpos=0x0400, //正整數顯示前加上“+” scientific=0x0800, //輸出用科學表示法表示的浮點數 fixed=0x1000, //輸出用固定小數點表示的浮點數 unitbuf=0x2000, //在輸出操作后刷新所有流 stdio=0x4000 //在輸出操作后刷新stdout和stderr}這些標志可以由ios類成員函數訪問,也可以用操作符函數訪問。2/4/202322第7章輸入/輸出流對象用ios成員函數對狀態(tài)標志進行操作ios類有3個成員函數可以對狀態(tài)標志進行操作,分別為flags()、setf()和unsetf(),并且ios類還定義了一個long型數據成員記錄當前狀態(tài)標志。這些狀態(tài)標志可用位或運算符“|”進行組合。用setf函數設置狀態(tài)標志,其一般格式如下:
longios::setf(longflags)2/4/202323第7章輸入/輸出流對象用ios成員函數對狀態(tài)標志進行操作用unsetf函數清除狀態(tài)標志,其一般格式如下:
longios::unsetf(longflags)用函數flags取狀態(tài)標志有兩種形式,其一般格式分別如下: longios::flags() longios::flags(longflag)
第一種形式返回與流相關的當前狀態(tài)標志值;第二種形式將流的狀態(tài)標志值設置為flag,并返回設置前的狀態(tài)標志值。2/4/202324第7章輸入/輸出流對象例使用ios成員函數操作狀態(tài)字voidshowflags(longf);voidmain(){ longf; f=cout.flags();//取當前狀態(tài)標志 showflags(f);//顯示狀態(tài)值 cout.setf(ios::showpos|ios::scientific|ios::fixed); //追加狀態(tài)標志 f=cout.flags();//取當前狀態(tài)標志 showflags(f);//顯示狀態(tài)值 cout.unsetf(ios::scientific);//從狀態(tài)標志中去掉標志 f=cout.flags();//取當前狀態(tài)標志 showflags(f);//顯示狀態(tài)值 f=cout.flags(ios::hex);//重新設置狀態(tài)標志 showflags(f); f=cout.flags();//取當前狀態(tài)標志 showflags(f);}2/4/202325第7章輸入/輸出流對象用ios成員函數設置輸出寬度設置輸出寬度函數有兩種形式,其一般格式分別如下:
intios::width(intlen) intios::width() 第一種形式是設置輸出寬度,并返回原來的輸出寬度;第二種形式是返回當前輸出寬度,輸出寬度為0。2/4/202326第7章輸入/輸出流對象例使用width控制輸出寬度#include<iostream>usingnamesoacestd;intmain(){ doublevalues[]={1.23,35.36,653.7,4358.24};for(inti=0;i<4;i++){cout.width(10);cout<<values[i]<<'\n';}}輸出結果:1.2335.36653.74358.242/4/202327第7章輸入/輸出流對象用ios成員函數設置填充字符填充字符的作用是當輸出值不滿輸出寬度時用填充字符來填充,默認填充字符為空格。它與width()函數配合使用,否則沒有意義。設置填充字符函數有兩種形式,其格式分別如下:
charios::fill(charch)
charios::fill() 第一種形式是重新設置填充字符,并返回設置前的填充字符;第二種形式是返回當前的填充字符。2/4/202328第7章輸入/輸出流對象例使用fill設置填充字符#include<iostream>usingnamesoacestd;intmain(){ doublevalues[]={1.23,35.36,653.7,4358.24};for(inti=0;i<4;i++){cout.width(10);cout.fill('*');cout<<values[i]<<'\n';}}輸出結果:******1.23*****35.36*****653.7***4358.242/4/202329第7章輸入/輸出流對象用ios成員函數設置輸出精度設置浮點數輸出精度有兩種形式,其格式分別如下:
intios::precision(intp) intios::precision() 第一種形式是重新設置輸出精度,并返回設置前的輸出精度;第二種形式是返回當前的輸出精度。2/4/202330第7章輸入/輸出流對象例使用precision設置填充字符#include<iostream>usingnamesoacestd;intmain(){ intj; j=cout.precision(); cout<<"presicion:"<<j<<endl; cout.precision(8); cout<<123.456789<<endl; cout<<"presicion:"<<cout.precision()<<endl;}輸出結果:precision:6123.45679precision:82/4/202331第7章輸入/輸出流對象用操作符函數格式化輸入輸出除了專門的ios類成員函數,c++標準庫還提供了標準的操作符函數專門操控這些狀態(tài)。這組函數不屬于任何類成員,定義在iomanip.h頭文件中。將它們用在提取運算符“>>”或插入運算符“<<”后面來設定輸入/輸出格式,即在讀寫對象之間插入一個修改狀態(tài)的操作。其中有些函數沒有參數,所以又叫操作符。
2/4/202332第7章輸入/輸出流對象設置輸入/輸出寬度函數setw(int)設置輸出填充字符函數setfill(int)設置輸出精度函數setprecision(int)設置輸入/輸出整型數數制函數dec、hex和oct
取消輸入結束符函數ws
控制換行操作符endl代表輸出單字符“\0”的操作符ends2/4/202333第7章輸入/輸出流對象例使用setw設置輸入/輸出寬度#include<iostream>#include<iomanip.h>usingnamesoacestd;intmain(){ char*p="12345",*q="678"; charf[4],g[4];//最后一位為'\0' inti=10; cout<<p<<setw(6)<<q<<setw(4)<<p<<q<<endl;//設置輸出寬度 cin>>setw(4)>>f>>g;//設置輸入寬度 cout<<f<<endl<<g<<endl<<"i:"<<i<<endl; return0;}運行結果:123456781234567812345↙12345i:102/4/202334第7章輸入/輸出流對象例分別用浮點、定點的方式表示一個實數#include<iostream>#include<iomanip.h>usingnamesoacestd;intmain(){ doublef=22.0/7; //在用浮點表示的輸出中,setprecision(n)表示實數有效位數 cout<<f<<endl;//默認有效位數為6 cout<<setprecision(3)<<f<<endl;//最小的有效位數為3 //在用定點表示的輸出中,setprecision(n)表示小數有效位數 cout<<setiosflags(ios::fixed); cout<<setprecision(8)<<f<<endl;//小數位數為8 return0;}運行結果:3.142863.143.142857142/4/202335第7章輸入/輸出流對象例使用dec、hex、oct設置輸出整型數制#include<iostream>#include<iomanip.h>usingnamesoacestd;intmain(){ intnumber=1001; cout<<"Decimal:"<<dec<<number<<endl<<"Hexadecimal:"<<hex<<number<<endl<<"Octal:"<<oct<<number<<endl; return0;}運行結果:Decimal:1001Hexadecimal:3E9Ocatl:17512/4/202336第7章輸入/輸出流對象用戶自定義操作符函數c++提供了標準的操作符函數,也提供了建立自定義操作符函數的方法。建立輸出操作符函數的格式如下: ostream&manip_name(ostream&stream) { <自定義語句序列> returnstream; }其中manip_name是自定義操作符函數的名字。2/4/202337第7章輸入/輸出流對象例用戶自定義輸出操作符函數#include<iostream>#include<iomanip.h>usingnamesoacestd;ostream&setup(ostream&stream){ stream.setf(ios::left); stream<<setw(10)<<setfill('$'); returnstream;}intmain(){ cout<<10<<""<<setup<<10<<endl; return0;}運行結果:1010&&&&&&&&2/4/202338第7章輸入/輸出流對象用戶自定義操作符函數建立輸入操作符函數的格式如下: istream&manip_name(istream&stream) { <自定義語句序列> returnstream; }其中manip_name是自定義操作符函數的名字。2/4/202339第7章輸入/輸出流對象例用戶自定義輸出操作符函數#include<iostream>#include<iomanip.h>usingnamesoacestd;istream&prompt(istream&stream){cin>>hex;cout<<"Enternumberusinghexformat:";returnstream;}intmain(){ inti; cin>>prompt>>i; cout<<i<<endl; return0;}運行結果:Enternumberusinghexformat:ff↙2552/4/202340第7章輸入/輸出流對象自定義類型對象的輸入/輸出上面都是對基本類型數據進行輸入/輸出操作,實際上,C++允許對自定義類型對象進行同樣簡單語法的輸入/輸出。示例自定義類型對象的輸入/輸出 2/4/202341第7章輸入/輸出流對象classDate{public: Date(inty,intm,intd){Year=y;Month=m;Day=d;} friendostream&operator<<(ostream&stream,Date&date); friendistream&operator>>(istream&stream,Date&date);private: intYear,Month,Day;};ostream&operator<<(ostream&stream,Date&date){stream<<date.Year<<"/"<<date.Month<<"/"<<date.Day<<endl; returnstream;}istream&operator>>(istream&stream,Date&date){ stream>>date.Year>>date.Month>>date.Day; returnstream;}2/4/202342第7章輸入/輸出流對象intmain(){ Datedate(2005,11,28); cout<<"Currentdate:"<<date<<endl; cout<<"Enternewdate:"; cin>>date; cout<<"Newdate:"<<date<<endl; return0;}輸出結果為:Currentdate:2005/11/28Enternewdate:2007129↙Newdate:2007/12/92/4/202343第7章輸入/輸出流對象文件的輸入/輸出如何對文本文件和二進制文件進行輸入和輸出操作?2/4/202344第7章輸入/輸出流對象文件的概念
文件一般指的是磁盤文件,它是存儲在磁盤上的相關數據集合。每個文件都有確定的名字。需要長久保存并能夠被重新讀寫的信息,將它保存在外存文件上。C++常用的文件有程序文件,數據文件以及設備文件。鍵盤作為標準輸入文件,顯示器作為標準輸出文件。C++標準庫提供了相關的文件操作。對需要輸入的大批量數據,可以事先以文件的形式存放在磁盤上,在程序中,從指定的文件中讀取數據;程序的運行結果也可以寫入磁盤上指定的文件,使用時再將文件中的數據讀入。2/4/202345第7章輸入/輸出流對象C++把文件看作是一個字符(字節(jié))的序列,即由一個個字符(字節(jié))數據順序組成。文件按存儲格式分二類:一種為字符格式文件,簡稱字符文件(ASCII碼文件或文本文件),另一種為內部格式文件,簡稱字節(jié)文件(二進制文件)字符文件中,每一個字節(jié)單元的內容存放一個字符的ASCII碼,能夠直接被顯示和打印。字節(jié)文件中,是把內存中的數據按其在內存中的存儲形式原樣輸出到磁盤文件存放。2/4/202346第7章輸入/輸出流對象兩種文件的比較ASCII碼文件占用字節(jié)多,把內存中的數據寫入ASCII碼文件或從ASCII碼文件讀數據存放在內存中,需要轉換。二進制文件占用字節(jié)少,把內存中的數據寫入二進制文件或從二進制文件讀數據存放在內存中,不需要轉換。 例如:10000是整型數據,用二進制表示占兩或四個字節(jié),如用ASCII碼表示,則占五個字節(jié)。對于字符信息,在字符文件和字節(jié)文件中保存的信息是相同的。對于數值信息,在字符文件和字節(jié)文件中保存的信息是不同的。2/4/202347第7章輸入/輸出流對象文件操作要在程序中使用文件,首先應在文件開始包含頭文件:
#include<fstream>在訪問文件之前,用頭文件fstream中提供的輸入文件流類ifstream、輸出文件流類ofstream或輸入輸出文件流類fstream定義一個文件流類的對象,然后用該對象調用相應類中的open成員函數,按照一定的打開方式打開一個文件。文件被打開后,就可以通過文件流對象訪問它。文件訪問結束后,再通過流對象關閉它,釋放緩沖區(qū)。2/4/202348第7章輸入/輸出流對象文件操作的一般步驟
為文件定義一個流類對象;使用open()函數建立(或打開)文件。如果文件不存在,則建立該文件;如果磁盤上已存在該文件,則打開該文件;進行讀寫操作。在建立(或打開)的文件上執(zhí)行所要求的輸入/輸出操作。一般來說,在內存與外設的數據傳輸中,由內存到外設稱為輸出或寫,反之則稱為輸入或讀;使用close()函數關閉文件。當完成操作后,應把打開的文件關閉,避免誤操作。2/4/202349第7章輸入/輸出流對象文件的打開每個文件流類都有一個open成員函數,并且具有完全相同的聲明格式,具體聲明格式為:
voidopen(constchar*fname,intmode,intaccess); 其中,fname指向要打開文件的文件名字符串,mode指定打開文件的方式,對應的實參是ios類中定義的open_mode枚舉類型中的枚舉常量,或由這些枚舉常量構成的按位或表達式,access指定文件的訪問方式。在C++中,打開一個文件就是將這個文件與對應流對象建立關聯;2/4/202350第7章輸入/輸出流對象2/4/202351第7章輸入/輸出流對象定義文件流對象和打開文件舉例:1)ofstreamfout; fout.open(“a:\\data1.dat”);2)ifstreamfin;fin.open(“a:\\data1.dat”,ios::in|ios::nocreat);3)ofstreamofs;ofs.open(“a:\\data1.dat”,ios::app);4)fstreamfio;fio.open(“a:\\data1.dat”,ios::out|ios::binary);2/4/202352第7章輸入/輸出流對象文件的關閉每個文件流類中都提供有一個關閉文件的成員函數close,當打開的文件操作結束后,就需要關閉它,使文件流與對應的物理文件斷開聯系。關閉任何一個流對象所對應的文件,就是用這個流對象調用close成員函數。文件流對應的文件被關閉后,還可以利用該文件流調用open成員函數打開其他的文件。
ofstreamfout; fout.open(“a:\\data1.dat”); …… fout.close();2/4/202353第7章輸入/輸出流對象文件指針
對于每個打開的文件,都存在著一個文件指針,初始指向一個隱含的位置,該位置由具體打開方式決定。 對文件的讀寫都是從當前文件指針所指的位置開始,在讀寫過程中,文件指針順序后移。文件的結束標志 每個文件都有一個結束標志。當文件指針移到文件的結束標志處時,表示文件結束。2/4/202354第7章輸入/輸出流對象測試文件是否結束,常用的方法有兩種:
1.ASCII碼文件的結束標志用“-1”表示。C++在ios類中用符號常量“EOF”表示-1,當讀取到的字符等于文件結束符EOF時表示文件訪問結束。 2.C++還提供了使用流對象調用eof()成員函數來測試文件當前狀態(tài)是否“文件結束”。如果eof()的值是非0值,表示文件結束;如果eof()的值是0,則表示文件沒有結束。用該方法測試的文件既可以是ASCII碼文件又可以是二進制文件。2/4/202355第7章輸入/輸出流對象字符文件的訪問操作向字符文件輸出數據 指依次把數據寫入到文件的末尾(文件結束符也隨之后移,它始終占據整個文件空間的最后一個字節(jié)位置)。從字符文件輸入數據 指從文件開始位置起依次向后提取數據,直到碰到文件結束符為止。2/4/202356第7章輸入/輸出流對象字符文件的訪問操作向字符文件輸出數據 調用從ostream流類中繼承來的插入操作符重載函數。 調用從ostream流類中繼承來的put成員函數。 聲明格式如下:
ostream&operator<<(簡單類型); ostream&put(char);2/4/202357第7章輸入/輸出流對象字符文件的訪問操作從字符文件輸入數據 調用提取操作符重載成員函數,每次從文件流中提取用空白符隔開的一個數據。 調用get成員函數,每次從文件流中提取一個字符并作為返回值返回。 調用getline成員函數,每次從文件流中提取一行字符到字符指針所指向的存儲空間中。 可以在istream文件中找到上述成員函數聲明。2/4/202358第7章輸入/輸出流對象例字符文件的讀寫#include<iostream>#include<fstream>usingnamespacestd;intmain(){ chars1[8],s2[8]; fstreamoutfile; cin>>s1; outfile.open(“exam.txt”,ios::out); if(!outfile) { cout<<“exam.txtcan’topen”<<endl; } outfile<<s1; outfile.close(); outfile.open(“exam.txt”,ios::in); outfile>>s2; cout<<s2<<endl; outfile.close(); return0;}運行結果:abcd↙abcd2/4/202359第7章輸入/輸出流對象字節(jié)文件的訪問操作字節(jié)文件是指在打開方式中帶有ios::binary選項的文件。向字節(jié)文件輸出數據 把內存中由指定字符指針所指向的具有一定字節(jié)數的內容原原本本地寫入到文件中,文件指針后移。從字節(jié)文件輸入數據 把具有一定字節(jié)數的內容原原本本地拷貝到內存中由指定字符指針所指向的存儲空間中,文件指針后移。2/4/202360第7章輸入/輸出流對象字節(jié)文件的訪問操作通過文件流對象調用在istream流類中定義的read成員函數能夠從文件流對象所對應的文件中讀出信息。通過文件流對象調用在ostream流類中定義的write成員函數能夠向文件流對象所對應的文件中寫入信息。這兩個成員函數的聲明格式如下:
istream&read(char*buffer,intlen); ostream&write(constchar*buffer,intlen);2/4/202361第7章輸入/輸出流對象例字節(jié)文件的讀寫#include<iostream>#include<fstream>usingnamespacestd;structperson{ charname[20]; doubleheight; unsignedshortage;}people[4]={“wang”,1.65,25,“zhang”,1.78,24,“l(fā)i”,1.85,21,}intmain(){ fstreaminfile,outfile; outfile.open(“exam.dat”,ios::out|ios::binary); if(!outfile) { cout<<“exam.datcan’topen”<<endl; abort(); }2/4/202362第7章輸入/輸出流對象 for(inti=0;i<4;i++) outfile.write((char*)&people[i],sizeof(people[i])); outfile.close(); infile.open(“exam.dat”,ios::in|ios::binary); if(!infile) { cout<<“exam.datcan’topen”<<endl; abort(); } for(intj=0;j<4;j++){ infile.read((char*)&people[j],sizeof(people[j])); cout<<people[j].name<<“\t”<<people[j].height <<“\t”<<people[j].age<<endl; } infile.close(); return0;}運行結果:wang 1.65 25zhang 1.78 24Li 1.85 21 0 02/4/202363第7章輸入/輸出流對象文件的隨機讀寫C++文件都是流文件,隨機文件的讀寫與文件指針相關,文件指針記錄著文件流的當前位置。有3個成員函數能對文件指針進行操作:
istream&istream::seekg(<流文件中位置>);
istream&istream::seekp(<偏移量>,<參照位置>); streamposistream::tellg(); 其中,streampos被定義為long型量,<流文件中位置><偏移量>都是long型量,并以字節(jié)為單位。<參照位置>具有如下含義: ios:cur,相對于當前讀指針所指定的位置; ios:beg,相對于流的開始位置; ios:end,相對于流的結尾處;2/4/202364第7章輸入/輸出流對象例文件的隨機讀寫#include<iostream>#include<fstream>usingnamespacestd;intmain(){ fstreamfile(“exam.dat”,ios::in|ios::out|ios::binary); if(!file) { cout<<“exam.datcan’topen”<<endl; abort(); } for(inti=0;i<15;i++) file.write((char*)&i,sizeof(int)); streampospos=file.tellp(); cout<<“currentbytenumber:”<<pos<<endl; for(i=15;i<45;i++) file.write((char*)&i,sizeof(int));
2/4/202365第7章輸入/輸出流對象 file.seekg(pos); file.read((char*)&i,sizeof(int)); cout<<“thedatastoredis”<<i<<endl; file.seekp(0,ios::beg); for(i=80;i<100;i++) file.write((char*)&i,sizeof(int)); file.seekg(pos); file.read((char*)&i,sizeof(int)); cout<<“thedatastoredis”<<i<<endl; file.seekg(20,ios::cur); file.read((char*)&i,sizeof(int)); cout<<“thedatastoredis”<<i<<endl; cout<<“currentbytenumber:”<<file.tellg()<<endl; return0;}seekg就是seekget,seekp是seekput,前者用于ifstream對象,后者用于ofstream對象,但是在ftream對象里,兩者沒有區(qū)別。運行結果:currentbytenumber:60thedatastoredis15thedatastoredis95thedatastoredis21currentbytenumber:882/4/202366第7章輸入/輸出流對象下面程序用istream和ostream類的操作符對點數據進行文件操作,從鍵盤上輸入兩個點的坐標,把它保存到磁盤文件上,并從磁盤上讀出數據,輸出到顯示器上。#include<iostream>#include<fstream>usingnamesoacestd;classPoint{public: Point(intx,inty){X=x;Y=y;} friendostream&operator<<(ostream&os,Point&aPoint); friendistream&operator>>(istream&is,Point&aPoint);protected: intX; intY;};2/4/202367第7章輸入/輸出流對象ostream&operator<<(ostream&os,Point&aPoint){ os<<"("<<aPoint.X<<","<<aPoint.Y<<")"; returnos;}istream&operator>>(istream&is,Point&aPoint){ is>>“(">>aPoint.X>>",">>aPoint.Y>>")"; returnis;}intmain(){ intx,y; ofstreamwritefile("crest.sav"); if(!writefile) { cout<<"Can'topenfile"; exit(-1); }2/4/202368第7章輸入/輸出流對象 cout
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯系上傳者。文件的所有權益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網頁內容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
- 4. 未經權益所有人同意不得將文件中的內容挪作商業(yè)或盈利用途。
- 5. 人人文庫網僅提供信息存儲空間,僅對用戶上傳內容的表現方式做保護處理,對用戶上傳分享的文檔內容本身不做任何修改或編輯,并不能對任何下載內容負責。
- 6. 下載文件中如有侵權或不適當內容,請與我們聯系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 資產評估基礎2025年考試考點試題解析及答案詳解
- 熱力蒸汽質量檢測方案
- 安全員A證考試考前沖刺試卷及參考答案詳解1套
- 未來五年甜杏仁企業(yè)縣域市場拓展與下沉戰(zhàn)略分析研究報告
- 未來五年小分子化藥企業(yè)縣域市場拓展與下沉戰(zhàn)略分析研究報告
- 未來五年大密紋唱片行業(yè)市場營銷創(chuàng)新戰(zhàn)略制定與實施分析研究報告
- 未來五年城市道路、橋梁、隧道設施管理服務企業(yè)數字化轉型與智慧升級戰(zhàn)略分析研究報告
- 未來五年影視傳媒企業(yè)數字化轉型與智慧升級戰(zhàn)略分析研究報告
- 未來五年豬肉香腸制品企業(yè)縣域市場拓展與下沉戰(zhàn)略分析研究報告
- 未來五年八椒企業(yè)縣域市場拓展與下沉戰(zhàn)略分析研究報告
- 2025年統(tǒng)編版五年級上冊語文期末專項訓練:字音、字形、字義(含答案)
- 睡眠對考試的重要性
- 網絡輿情態(tài)勢感知系統(tǒng)-洞察分析
- 高思導引3-6年級分類題目-數字謎02-三下02-簡單乘除法豎式
- 情侶自愿轉賬贈與協(xié)議書范本
- 2024-2030年中國異辛烷行業(yè)市場發(fā)展趨勢與前景展望戰(zhàn)略分析報告
- 力士樂液壓培訓教材
- JJG 692-2010無創(chuàng)自動測量血壓計
- 人教版四年級數學下冊第四單元大單元教學任務單
- 旋挖鉆孔灌注樁施工記錄表(新)
- 北京市XXXX年度“小學數學測試方案”培訓課件
評論
0/150
提交評論