版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
面向?qū)ο?/p>
——第7章輸入輸出流2主要內(nèi)容流無格式輸入/輸出輸入/輸出的格式控制文件的輸入/輸出3分析問題C++沒有定義任何用于執(zhí)行輸入或輸出的語句,但可以使用C語言中的標(biāo)準(zhǔn)I/O函數(shù)printf()和scanf()來解決此問題。printf()與scanf()存在兩個(gè)缺點(diǎn):非類型安全不可擴(kuò)充性
4C++使用類型安全的I/O流操作。不同類型的I/O流操作都是重載的,沒有定義過I/O功能的類型不具備I/O操作的能力。C++標(biāo)準(zhǔn)庫既可作為標(biāo)準(zhǔn)數(shù)據(jù)類型數(shù)據(jù)的I/O,也能用于自定義類型的對(duì)象的I/O,這種擴(kuò)展性是C++最有價(jià)值的特點(diǎn)之一。C++用輸入輸出流來解決這個(gè)問題。5流所謂流(stream)是指數(shù)據(jù)從一個(gè)位置流向另一個(gè)位置。流是字節(jié)的序列。輸入/輸出是一種數(shù)據(jù)傳遞操作,可以看作字符序列在計(jì)算機(jī)內(nèi)存與外設(shè)之間的流動(dòng),C++將數(shù)據(jù)從一個(gè)對(duì)象到另一個(gè)對(duì)象的流動(dòng)抽象為“流”。流動(dòng)的方向不同,構(gòu)成輸入/輸出流,即I/O流。6I/O流在C++程序中,數(shù)據(jù)可以從鍵盤流入到程序,也可以從程序流向屏幕或磁盤文件。從流中獲取數(shù)據(jù)的操作稱為提取操作,向流中添加數(shù)據(jù)的操作稱為插入操作。數(shù)據(jù)的輸入/輸出就是通過I/O流來實(shí)現(xiàn)的。7編譯系統(tǒng)已經(jīng)以運(yùn)算符或函數(shù)的形式做好了對(duì)標(biāo)準(zhǔn)外設(shè)(鍵盤、屏幕、打印機(jī)、文件)的接口,使用時(shí)只需按照要求的格式調(diào)用即可。cin>>x;cout<<x;內(nèi)存鍵盤文件光筆....輸入流顯示器文件打印機(jī)...輸出流8I/O流類庫的層次結(jié)構(gòu)C++編譯系統(tǒng)提供的I/O流類庫含有兩個(gè)平行基類:streambufiosios類有4個(gè)直接派生類:輸入流類istream輸出流類ostream文件流類fstreambase串流類strstreambase9I/O流類庫的頭文件iostream:I/O流類庫的最主要的頭文件,它包括操作所有I/O所需的基本信息,還包括cin、cout、cerr和clog共4個(gè)對(duì)象。iomanip:包含帶參數(shù)的流操縱算子的有關(guān)信息。fstream:包含對(duì)文件I/O操作的有關(guān)信息。strstream:包含對(duì)內(nèi)存格式化I/O操作的有關(guān)信息。stdiostream:包含混合使用C和C++風(fēng)格的I/O操作的有關(guān)信息。10intmain(){floata,b,c,disc;cout<<“pleaseinputa,b,c:”;cin>>a>>b>>c;if(a==0)cerr<<“aisequaltozero,error!”<<endl;elseif((disc=b*b-4*a*c)<0)cerr<<“disc=b*b-4*a*c<0”<<endl;else{cout<<“x1=”<<(-b+sqrt(disc))/(2*a)<<endl;cout<<“x2=”<<(-b-sqrt(disc))/(2*a)<<endl;}return0;}1:pleaseinputa,b,c:023aisequaltozero,error!2:pleaseinputa,b,c:523disc=b*b-4*a*c<03:pleaseinputa,b,c:12.51.5x1=-1x2=-1.511無格式輸入/輸出無格式輸入/輸出就是按系統(tǒng)預(yù)定義的格式進(jìn)行的輸入/輸出。按默認(rèn)約定,每個(gè)C++程序都能使用標(biāo)準(zhǔn)I/O流,如標(biāo)準(zhǔn)輸入、標(biāo)準(zhǔn)輸出。cin用來處理標(biāo)準(zhǔn)輸入,即鍵盤輸入;cout用來處理標(biāo)準(zhǔn)輸出,即屏幕輸出。它們被定義在iostream頭文件中。在使用cout和cin前,要用編譯預(yù)處理命令將所使用的頭文件包含到源程序中,其格式如下:#include<iostream>12無格式輸出“<<”是預(yù)定義的插入運(yùn)算符,作用在流類對(duì)象cout上,實(shí)現(xiàn)默認(rèn)格式的屏幕輸出。使用cout輸出表達(dá)式值到屏幕上的格式如下:
cout<<E1<<E2<<…<<Em;
其中,E1、E2、…、Em為均為表達(dá)式。用“cout<<”輸出基本類型的數(shù)據(jù)時(shí),可以不必考慮數(shù)據(jù)是什么類型,系統(tǒng)會(huì)判斷數(shù)據(jù)的類型,并調(diào)用與之匹配的運(yùn)算符重載函數(shù)。13無格式輸出cout是ostream流類的對(duì)象,它在iostream頭文件中作為全局對(duì)象定義,其格式如下:
ostreamcout(stdout);
其中,stdout表示標(biāo)準(zhǔn)輸出設(shè)備名(屏幕)。14無格式輸入“>>”是預(yù)定義的提取運(yùn)算符,作用在流類對(duì)象cin上,實(shí)現(xiàn)默認(rèn)格式的鍵盤輸入。使用cin將數(shù)據(jù)輸入到變量的格式如下:
cin>>V1>>V2>>…>>Vn;
其中,V1、V2、…、Vn都是變量。功能是暫停執(zhí)行程序,等待用戶從鍵盤輸入數(shù)據(jù),各數(shù)據(jù)間用空格或Tab鍵分隔,輸入數(shù)據(jù)類型要與接受變量類型一致,輸完后,按回車鍵結(jié)束。15無格式輸入cin是istream流類的對(duì)象,它在iostream頭文件中作為全局對(duì)象定義,其格式如下:
istreamcin(stdin);
標(biāo)準(zhǔn)輸入設(shè)備名(鍵盤)16輸入輸出的格式控制C++提供了兩種格式化輸入/輸出方式:一種是用流對(duì)象的有關(guān)成員函數(shù)進(jìn)行格式化輸入輸出另一種是用專門的控制符進(jìn)行格式化輸入輸出17
用流對(duì)象的成員函數(shù)格式化流成員函數(shù)主要是通過對(duì)狀態(tài)標(biāo)志、輸出寬度、填充字符以及輸出精度的操作來完成輸入/輸出格式化。輸入/輸出的格式由各種狀態(tài)標(biāo)志來確定,在ios類中定義為枚舉量。枚舉量定義在ios類中,因此引用時(shí)必須包含ios::前綴。使用時(shí)應(yīng)該全部用符號(hào)名,絕不要用數(shù)值。18用流對(duì)象的成員函數(shù)對(duì)狀態(tài)標(biāo)志進(jìn)行操作
ios類有3個(gè)成員函數(shù)可以對(duì)狀態(tài)標(biāo)志進(jìn)行操作,并且定義了一個(gè)long型數(shù)據(jù)成員記錄當(dāng)前狀態(tài)標(biāo)志。這些狀態(tài)標(biāo)志可用位或運(yùn)算符“|”進(jìn)行組合。用setf函數(shù)設(shè)置狀態(tài)標(biāo)志,其一般格式如下:
longios::setf(longflags)19用流對(duì)象的成員函數(shù)對(duì)狀態(tài)標(biāo)志進(jìn)行操作清除狀態(tài)標(biāo)志用unsetf函數(shù)清除狀態(tài)標(biāo)志,其一般格式如下:
longios::unsetf(longflags)20用流對(duì)象的成員函數(shù)對(duì)狀態(tài)標(biāo)志進(jìn)行操作用函數(shù)flags取狀態(tài)標(biāo)志有兩種形式,其格式分別如下:
longios::flags()//返回與流相關(guān)的當(dāng)前狀態(tài)標(biāo)志值
longios::flags(longflag)//將流的狀態(tài)標(biāo)志值設(shè)置為flag,并返回設(shè)置前的狀態(tài)標(biāo)志值。21用流對(duì)象的成員函數(shù)對(duì)狀態(tài)標(biāo)志進(jìn)行操作以上三組函數(shù)必須用流類對(duì)象(cin或cout)來調(diào)用,其格式如下:
<流對(duì)象名>.<函數(shù)名>(ios::<狀態(tài)標(biāo)志>)
cout.setf(ios::showpos);cout.setf(ios::scientific);cout.setf(ios::showpos|ios::scientific);2200000010000000010011001000100001001000100010000100100010001000010000100000000000voidshowflags(longf);intmain(){longf;f=cout.flags();//取當(dāng)前狀態(tài)標(biāo)志
showflags(f);//顯示狀態(tài)值
cout.setf(ios::showpos|ios::scientific|ios::fixed);//追加狀態(tài)標(biāo)志
f=cout.flags();//取當(dāng)前狀態(tài)標(biāo)志
showflags(f);//顯示狀態(tài)值
cout.unsetf(ios::scientific);//從狀態(tài)標(biāo)志中去掉scientificf=cout.flags();//取當(dāng)前狀態(tài)標(biāo)志
showflags(f);//顯示狀態(tài)值
f=cout.flags(ios::hex);//重新設(shè)置狀態(tài)標(biāo)志
showflags(f);f=cout.flags();//取當(dāng)前狀態(tài)標(biāo)志
showflags(f);return0;}voidshowflags(longf){longi;for(i=0x8000;i;i=i>>1)//用右移方式使i中的值為"1"的位不斷右移
if(i&f)cout<<"1";//判斷f中的某一位是否為"1"elsecout<<"0";cout<<endl;}【例】示例對(duì)狀態(tài)標(biāo)志的操作。23用流對(duì)象的成員函數(shù)設(shè)置輸出寬度設(shè)置輸出寬度函數(shù)有兩種形式,其格式分別如下:
intios::width(intlen) intios::width()第一種形式是設(shè)置輸出寬度,并返回原來的輸出寬度;第二種形式是返回當(dāng)前輸出寬度,默認(rèn)輸出寬度為0。只對(duì)其后的第一個(gè)輸出項(xiàng)有效。24設(shè)置填充字符填充字符的作用是當(dāng)輸出值不滿輸出寬度時(shí)用填充字符來填充,默認(rèn)填充字符為空格。它與width()函數(shù)配合使用,否則沒有意義。設(shè)置填充字符函數(shù)有兩種形式,其格式分別如下:
charios::fill(charch)charios::fill()第一種形式是重新設(shè)置填充字符,并返回設(shè)置前的填充字符;第二種形式是返回當(dāng)前的填充字符。25設(shè)置輸出精度設(shè)置浮點(diǎn)數(shù)輸出精度有兩種形式,其格式分別如下:
intios::precision(intp)intios::precision()第一種形式是重新設(shè)置輸出精度,并返回設(shè)置前的輸出精度;第二種形式是返回當(dāng)前的輸出精度。默認(rèn)輸出精度為6。26以上三組函數(shù)必須用流類對(duì)象(cin或cout)來調(diào)用。27width:08(newwidth)fillingwordis:(ASCIIcode32)*(42)(newfillingword)precision:6123.45679(example)8(newprecision)intmain(){inti;i=cout.width();cout<<"width:"<<i<<endl;cout.width(8);cout<<cout.width()<<"(newwidth)"<<endl;charc;c=cout.fill();cout<<"fillingwordis:"<<c<<"(ASCIIcode"<<(int)c<<")"<<endl;cout.fill('*');cout<<cout.fill()<<"("<<(int)cout.fill()<<")(newfillingword)"<<endl;intj;j=cout.precision();cout<<"precision:"<<j<<endl;cout.precision(8);cout<<123.456789<<"(example)"<<endl;cout<<cout.precision()<<"(newprecision)"<<endl;return0;}【例】示例設(shè)置輸出寬度、填充字符、輸出精度。28用控制符格式化為了不直接以標(biāo)志位的方式去處理流的狀態(tài),c++標(biāo)準(zhǔn)庫提供了標(biāo)準(zhǔn)的控制符專門操控這些狀態(tài)。這組控制符不屬于任何類成員,定義在iomanip頭文件中。將它們用在提取運(yùn)算符“>>”或插入運(yùn)算符“<<”后面來設(shè)定輸入/輸出格式,即在讀寫對(duì)象之間插入一個(gè)修改狀態(tài)的操作。
29設(shè)置輸入/輸出寬度setw(int)用整型參數(shù)來制定輸入/輸出域的寬度。使用時(shí)只對(duì)其后一項(xiàng)輸入/輸出有效。當(dāng)用于輸出時(shí),若實(shí)際寬度小于設(shè)置寬度時(shí),數(shù)據(jù)向右對(duì)齊,反之則按數(shù)據(jù)的實(shí)際寬度輸出。當(dāng)用于輸入時(shí),若輸入的數(shù)據(jù)寬度超過設(shè)置寬度時(shí),超出的數(shù)據(jù)部分被截?cái)喽蛔鳛橄乱豁?xiàng)輸入內(nèi)容。3012345678123456781234512345i:10#include<iostream>#include<iomanip>usingnamespacestd;intmain(){char*p="12345",*q="678";charf[4],g[4];//最后一位為'\0'inti=10;cout<<p<<setw(6)<<q<<setw(4)<<p<<q<<endl;//設(shè)置輸出寬度
cin>>setw(4)>>f>>g;//設(shè)置輸入寬度
cout<<f<<endl<<g<<endl<<"i:"<<i<<endl;return0;}【例】用控制符示例設(shè)置輸入/輸出寬度31設(shè)置輸出填充字符setfill(char)與ios::fill相同,常與setw(int)聯(lián)合使用,從而向不滿設(shè)置輸出寬度的空間填入指定的字符,不設(shè)置則填空格。設(shè)置后直至下一次設(shè)置前一直有效。參數(shù)可以是字符常量或字符變量。設(shè)置輸出精度setprecision(int)指明輸出實(shí)數(shù)的有效位數(shù)。參數(shù)為0時(shí),按默認(rèn)有效位數(shù)6輸出。在以fixed形式和scientific形式輸出時(shí)參數(shù)為小數(shù)位數(shù)。32setiosflags(ios::fixed)用定點(diǎn)方式表示實(shí)數(shù)。setiosflags(ios::scientific)用科學(xué)記數(shù)法方式表示實(shí)數(shù)。如果setprecision(n)與setiosflags(ios::fixed)合用,可以控制小數(shù)點(diǎn)右邊的數(shù)字個(gè)數(shù)。如果setprecision(n)與setiosflags(ios::scientific)合用,可以控制科學(xué)記數(shù)法中尾數(shù)的小數(shù)位數(shù)。
setiosflags(ios::left)輸出數(shù)據(jù)左對(duì)齊setiosflags(ios::right)輸出數(shù)據(jù)右對(duì)齊33setiosflags(ios::uppercase)大寫表示setiosflags(ios::showpos)輸出正數(shù)時(shí)給出“+”號(hào)setiosflags(ios::skipws)忽略前導(dǎo)空格resetiosflags()終止已設(shè)置的輸出格式狀態(tài),在括號(hào)中應(yīng)指定內(nèi)容34Zoot1.23Jimmy35.36Al653.7Stan4358.24#include<iostream>#include<iomanip>usingnamespacestd;intmain(){doublevalues[]={1.23,35.36,653.7,4358.24};char*names[]={"Zoot","Jimmy","Al","Stan"};for(inti=0;i<4;i++)cout<<setiosflags(ios::left)//設(shè)置左對(duì)齊
<<setw(6)<<names[i]<<resetiosflags(ios::left)//取消左對(duì)齊
<<setw(10)<<values[i]<<endl;return0;}【例】設(shè)置對(duì)齊方式和輸出寬度示例353.142863.143.14285714#include<iostream>#include<iomanip>usingnamespacestd;intmain(){doublef=22.0/7;//在用浮點(diǎn)形式表示的輸出中,setprecision(n)表示實(shí)數(shù)的有效位數(shù)
cout<<f<<endl;//默認(rèn)有效位數(shù)為6cout<<setprecision(3)<<f<<endl;//設(shè)置有效位數(shù)為3//在用定點(diǎn)形式表示的輸出中,setprecision(n)表示實(shí)數(shù)的小數(shù)位數(shù)
cout<<setiosflags(ios::fixed);cout<<setprecision(8)<<f<<endl;//小數(shù)位數(shù)為8return0;}【例】分別用浮點(diǎn)、定點(diǎn)的方式表示一個(gè)實(shí)數(shù)cout<<setprecision(8);cout<<setiosflags(ios::scientific)<<f<<endl;//尾數(shù)小數(shù)位數(shù)為83.14285714e+00036設(shè)置輸入/輸出整型數(shù)數(shù)制dec、hex和oct??刂茡Q行的控制符endl
代表輸出單字符“\0”的控制符ends37用戶自定義控制符函數(shù)建立輸出控制符函數(shù)的格式如下:
ostream&manip_name(ostream&stream){<自定義語句序列>returnstream;}控制符函數(shù)名38#include<iostream>#include<iomanip>usingnamespacestd;ostream&setup(ostream&stream){stream.setf(ios::left);stream<<setw(10)<<setfill('$');returnstream;}intmain(){cout<<10<<""<<setup<<10<<endl;return0;}【例】示例用戶自定義輸出控制符函數(shù)1010$$$$$$$$39用戶自定義控制符函數(shù)建立輸入控制符函數(shù)的格式如下:
istream&manip_name(istream&stream){<自定義語句序列>returnstream;}操作符函數(shù)名40#include<iostream>#include<iomanip>usingnamespacestd;istream&prompt(istream&stream){cin>>hex;cout<<"Enternumberusinghexformat:";returnstream;}intmain(){inti;cin>>prompt>>i;cout<<i<<endl;return0;}【例】示例用戶自定義輸入控制符函數(shù)Enternumberusinghexformat:ff25541
文件的輸入/輸出C++把文件看作是一個(gè)字符(字節(jié))的序列,即由一個(gè)個(gè)字符(字節(jié))順序組成。根據(jù)數(shù)據(jù)的組織形式,可分為ASCII碼文件和二進(jìn)制文件。ASCII碼文件又稱為文本文件,它的每一個(gè)字節(jié)存放一個(gè)ASCII碼,代表一個(gè)字符。二進(jìn)制文件是把內(nèi)存中的數(shù)據(jù)按其在內(nèi)存中的存儲(chǔ)形式原樣輸出到磁盤文件存放。42由于ASCII碼形式與字符一一對(duì)應(yīng),因此便于對(duì)字符進(jìn)行輸出或逐個(gè)處理,但它要占用較多的存儲(chǔ)空間,若存于二進(jìn)制文件中,可以節(jié)省存儲(chǔ)空間,但不能直接輸出字符形式。
56:ASCII表示為0011010100110110,占兩字節(jié)
56:二進(jìn)制表示為111000,占六個(gè)二進(jìn)制位43C++在頭文件fstream中定義了C++的文件流類體系,當(dāng)程序中使用文件時(shí),要包含頭文件fstream,其中定義了各種文件操作運(yùn)算符及函數(shù)。iosifstream(輸入文件流)ofstream(輸出文件流)fstream文件流定義用于輸入的文件對(duì)象定義用于輸出的文件對(duì)象定義用于輸入輸出的文件對(duì)象44內(nèi)存變量(程序)鍵盤輸入文件屏幕輸出文件cin>>xcout<<xinfile>>xoutfile<<x程序?qū)ξ谋疚募牟僮髋c對(duì)鍵盤、顯示器的操作比較:在涉及文本文件的操作時(shí),將輸入文件看成鍵盤,將輸出文件看成顯示器,格式不變。只需在程序中增加打開與關(guān)閉文件的語句。45C++中進(jìn)行文件操作的一般步驟
為文件定義一個(gè)流類對(duì)象;使用open()函數(shù)建立(或打開)文件。如果文件不存在,則建立該文件;如果磁盤上已存在該文件,則打開該文件;進(jìn)行讀寫操作。在建立(或打開)的文件上執(zhí)行所要求的輸入/輸出操作。一般來說,在內(nèi)存與外設(shè)的數(shù)據(jù)傳輸中,由內(nèi)存到外設(shè)稱為輸出或?qū)懀粗畡t稱為輸入或讀;使用close()函數(shù)關(guān)閉文件。當(dāng)完成操作后,應(yīng)把打開的文件關(guān)閉,避免誤操作。46在C++中,打開一個(gè)文件就是將這個(gè)文件與一個(gè)流建立關(guān)聯(lián);關(guān)閉一個(gè)文件就是取消這種關(guān)聯(lián)。open()函數(shù)的原型在fstream中定義。其原型為:
voidopen(char*filename,intmod,intaccess);其中第一個(gè)參數(shù)是用來傳遞文件名;第二個(gè)參數(shù)的值決定文件的使用方式;第三個(gè)參數(shù)的值決定文件的訪問方式。對(duì)于ifstream流類,mod的值為ios::in;對(duì)于ofstream流類,mod的值為ios::out47打開文件先建立流對(duì)象,然后調(diào)用函數(shù)open連接外部文件
流類對(duì)象名;
對(duì)象名.open(文件名,方式);調(diào)用流類帶參數(shù)的構(gòu)造函數(shù),建立流對(duì)象的同時(shí)連接外部文件
流類對(duì)象名(文件名,方式);
其中,“流類”為ifstream、ofstream或fstream。文件的打開與關(guān)閉48關(guān)閉文件使用close()成員函數(shù)進(jìn)行關(guān)閉:流對(duì)象名.close()
其中,流對(duì)象名是待關(guān)閉的文件流的對(duì)象名。文件的打開與關(guān)閉49120,310.85#include<iostream>#include<fstream>usingnamespacestd;intmain(){ ofstreamostrm;
//定義流類對(duì)象
ostrm.open("f1.dat");//打開文件
ostrm<<120<<endl;//寫操作
ostrm<<310.85<<endl; ostrm.close();//關(guān)閉文件
ifstreamistrm("f1.dat");//定義流類對(duì)象
intn; doubled; istrm>>n>>d;//讀操作
cout<<n<<","<<d<<endl; istrm.close();//關(guān)閉文件
return0;}【例】示例文件的輸入/輸出操作。50文本文件的讀寫:文本文件用默認(rèn)方式打開。文件的讀寫#include<iostream>#include<fstream>usingnamespacestd;intmain(){chars1[80],s2[8];fstreamoutfile;cin>>s1;outfile.open("exam.txt",ios::out);if(!outfile){cout<<"exam.txtcan’topen"<<endl;abort();}outfile<<s1;outfile.close();
outfile.open("exam.txt",ios::in);outfile>>s2;cout<<s2<<endl;outfile.close();return0;}51二進(jìn)制文件的讀寫若在文件的打開方式中沒有特別說明,打開的文件均為ASCII碼文件,若要打開二進(jìn)制文件,則要特別說明并用特定的讀寫函數(shù)。二進(jìn)制文件用binary方式打開,讀寫方式完全由程序控制。fstreaminfile,outfile;infile.open(“inf1.dat”,ios::in|ios::binary);outfile.open(“outf1.dat”,ios::out|ios::binary);
文件名
輸入方式打開
二進(jìn)制文件
文件名
輸出方式打開
二進(jìn)制文件文件的讀寫52輸入函數(shù):infile.read(char*,int)輸入文件對(duì)象名
數(shù)據(jù)進(jìn)入的內(nèi)存地址
一次讀入的字節(jié)數(shù)inta[10];infile.read((char*)a,10*sizeof(int));//從文件中輸入十個(gè)整型數(shù)到ainti;infile.read((char*)&i,sizeof(int));//從文件中輸入一個(gè)整型數(shù)到i由于二進(jìn)制文件中的數(shù)據(jù)不是ASCII碼,故不能直接對(duì)其讀寫,必須要通過特定的函數(shù)予以轉(zhuǎn)換。文件內(nèi)存讀入地址要強(qiáng)制轉(zhuǎn)換成字符型53輸出文件對(duì)象名
要輸出的數(shù)據(jù)在內(nèi)存中的地址
一次輸出的字節(jié)數(shù)inta[10]={0,1,2,3,4,5,6,7,8,9};outfile.write((char*)a,10*sizeof(int));//向文件輸出一個(gè)整型數(shù)組ainti=4;outfile.write((char*)&i,sizeof(int));//向文件輸出一個(gè)整型數(shù)i輸出函數(shù):outfile.write(char*,int)文件內(nèi)存寫出地址要強(qiáng)制轉(zhuǎn)換成字符型54【例】二進(jìn)制文件的讀寫structperson{charname[20];doubleheight;unsignedshortage;}people[3]={"wang",1.65,25,"zhang",1.78,24,"li",1.85,21};intmain(){fstreaminfile,outfile; outfile.open("exam.dat",ios::out|ios::binary);if(!outfile){cout<<"exam.datcan'topen"<<endl;abort();}for(inti=0;i<3;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<3;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;}55文件的隨機(jī)讀寫:文件打開以后,系統(tǒng)自動(dòng)生成兩個(gè)隱含的流指針:讀指針和寫指針。在輸入文件流類中,有關(guān)讀指針的函數(shù)如下:移動(dòng)讀指針函數(shù)istream&istream::seekg(streampospos);
該函數(shù)的功能是將輸入文件的指針移動(dòng)到pos指定的位置中。文件的讀寫56istream&istream::seekg(streamoffoffset,seek_dirorigin);其中,origin的類型seek_dir是一個(gè)枚舉類型,有以下三種取值:ios::beg表示指針的起始位置為文件頭ios::cur表示指針的起始位置為當(dāng)前位置ios::end表示指針的起始位置為文件尾該函數(shù)的功能是從origin指定的開始位置起,將文件指針移動(dòng)offset個(gè)字節(jié)數(shù)。文件的讀寫57返回讀指針當(dāng)前指向的位置值 streamposistream::tellg();該函數(shù)的功能是確定文件指針的當(dāng)前位置。文件的讀寫58相應(yīng)地,ostream類提供有關(guān)寫指針的函數(shù)如下:移動(dòng)寫指針函數(shù)ostream&ostream::seekp(streampospos);ostream&ostream::seekp(streamoffoffset,seek_dirorigin);返回寫指針當(dāng)前指向的位置值streamposostream::tellp();
函數(shù)參數(shù)的意義與讀指針函數(shù)一樣。文件的讀寫59【例】文件的隨機(jī)讀寫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));file.seekg(pos);file.read((char*)&i,sizeof(int));cout<<"Thedatastoredis"<<i<<endl;file.seekp(0,ios::beg);for(i=80;i<10
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(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ì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 《GRP時(shí)間管理RevB》課件
- 2025年長沙貨運(yùn)從業(yè)資格證考試模擬考試題庫答案
- 2025年內(nèi)蒙古貨物運(yùn)輸從業(yè)資格證考試題
- 2025年廣安貨運(yùn)資格證考試題
- 2025年石家莊貨運(yùn)從業(yè)考試試題答案解析
- 粵教版八年級(jí)下冊(cè)地理-第八章-珠江三角洲-單元檢測(cè)
- 社區(qū)用電安全規(guī)定
- 四川省城市排水工程招標(biāo)文件
- 文化產(chǎn)業(yè)園硅PU施工合同
- 裝卸作業(yè)應(yīng)急預(yù)案
- 《建筑力學(xué)》期末機(jī)考資料
- 南水北調(diào)江蘇水源公司2024年校園招聘高頻難、易錯(cuò)點(diǎn)500題模擬試題附帶答案詳解
- 幼兒園小班健康《打針吃藥我不怕》課件
- 廣州英語小學(xué)六年級(jí)英語六上冊(cè)作文范文1-6單元
- 2025屆上海市寶山區(qū)行知實(shí)驗(yàn)生物高一上期末教學(xué)質(zhì)量檢測(cè)模擬試題含解析
- 中國戲曲 昆曲學(xué)習(xí)通超星期末考試答案章節(jié)答案2024年
- 農(nóng)村飲水安全動(dòng)態(tài)監(jiān)測(cè)工作方案
- 《司馬光》公開課一等獎(jiǎng)創(chuàng)新教案
- 中醫(yī)藥創(chuàng)新團(tuán)隊(duì)及人才支持計(jì)劃實(shí)施方案、申報(bào)書
- 農(nóng)場(chǎng)場(chǎng)長、副場(chǎng)長崗位責(zé)任制
- 2024年山東省青島中德生態(tài)園(青島國際經(jīng)濟(jì)合作區(qū))管委會(huì)選聘52人歷年高頻500題難、易錯(cuò)點(diǎn)模擬試題附帶答案詳解
評(píng)論
0/150
提交評(píng)論