




已閱讀5頁,還剩22頁未讀, 繼續(xù)免費閱讀
版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領
文檔簡介
27第九章 流類庫和輸入/輸出習題第九章 流類庫和輸入/輸出習題一. 本概念與基礎知識測試題9.1 填空題9.1.1 在C+中“流”是表示 (1) 。從流中取得數(shù)據(jù)稱為 (2) ,用符號 (3) 表示;向流中添加數(shù)據(jù)稱為 (4) ,用符號 (5) 表示。答案:(1)數(shù)據(jù)從一個對象到另一個對象的傳送(2)提取操作(3)(4)插入操作(5)(stream_extraction operator)(6)”)運算符在缺省情況下是跳過空白(包括空格,制表,backspace和回車等)的,這樣拷貝的文件會缺少一些字符。第二,該程序應能確定文件是否拷貝結束。按行進行拷貝,getline()回車換行符并不放在buf中,因此要加一個回車換行符。9.2.9 對文件流,“!”運算符完成什么功能?答:返回狀態(tài)字state操作非法和操作失敗這兩位。9.2.10 二進制文件讀函數(shù)read()能否知道文件是否結束?應怎樣判斷文件結束?答:讀函數(shù)并不能知道文件是否結束,可用狀態(tài)函數(shù)int ios:eof()來判斷文件是否結束。必須指出系統(tǒng)是根據(jù)當前操作的實際情況設置狀態(tài)位,如需根據(jù)狀態(tài)位來判斷下一步的操作,必須在一次操作后立即去調取狀態(tài)位,以判斷本次操作是否有效。9.2.11 由二進制文件和文本文件來保存對象各有什么優(yōu)點和缺點?答:使用二進制文件,可以控制字節(jié)長度,讀寫數(shù)據(jù)時不會出現(xiàn)二義性,可靠性高。同時不知格式是無法讀取的,保密性好。文件結束后,系統(tǒng)不會再讀(見eofbit的說明),但程序不會自動停下來,所以要判斷文件中是否已沒有數(shù)據(jù)。使用文本文件來保存對象,操作簡單,但誰都可以讀取這些數(shù)據(jù),無保密性。9.2.12 文件的隨機訪問為什么總是用二進制文件,而不用文本文件?答:在C+中可以由程序來實現(xiàn)文件指針的移動,從而實現(xiàn)文件的隨機訪問,即可讀寫流中任意一段內容。一般文本文件很難準確定位,所以隨機訪問多用于二進制文件。9.2.13 怎樣使用istream和ostream的成員函數(shù)來實現(xiàn)隨機訪問文件?答:在ios類中說明了一個公有枚舉類型:enum seek_dirbeg=0,/文件開頭cur=1,/文件指針的當前位置end=2/文件結尾;istream類中提供了如下三個成員函數(shù):istream&istream:seekg(streampos);/指針直接定位istream&istream:seekg(streamoff, ios:seek_dir);/指針相對定位long istream:tellg();/返回當前指針位置seekg(streamoff,ios:seek_dir)應用最廣,如:datafile.seekg(-20L,ios:cur);表示將文件定位指針從當前位置向文件頭部方向移20個字節(jié)。datafile.seekg(20L,ios:beg);表示將文件定位指針從文件頭向文件尾方向移20個字節(jié)。datafile.seekg(-20L,ios:end);表示將文件定位指針從文件尾向文件頭方向移20個字節(jié)。tellg()和seekg()往往配合使用。ostream類也提供了三個成員函數(shù)管理文件定位指針,它們是:ostream&ostream:seekp(streampos);ostream&ostream:seekp(streamoff,ios:seek_dir);long ostream:tellp();定位指針只有一個但函數(shù)有兩組,這兩組個函數(shù)功能完全一樣。二. 編程與綜合練習題9.3 編程實現(xiàn)以下數(shù)據(jù)輸入輸出:a) 以左對齊方式輸出整數(shù),域寬為12;b) 以八進制、十進制、十六進制輸入輸出整數(shù);c) 實現(xiàn)浮點數(shù)的指數(shù)格式和定點格式的輸入輸出,并指定精度;d) 把字符串讀入字符型數(shù)組變量中,從鍵盤輸入,要求輸入串的空格也全部讀入,以回車換行符結束;e) 以上要求用流成員函數(shù)和流操作子各做一遍。解:特別注意flags()和setf()的使用方法。注意注釋。#include#includeusing namespace std;int main(void)int inum1=255,inum2=8191,inum3=65535;double fnum=31.415926535,fnum1;char str255;cout以左對齊方式輸出整數(shù),域寬為12:endl;cout.flags(ios:left);cout.width(12);coutinum1;cout.width(12);coutinum2;cout.width(12);coutinum3endl;cout.flags(ios:left|ios:oct|ios:showbase);/或(cout.flags()|ios:oct|ios:showbase)cout.width(12);coutinum1;cout.width(12);coutinum2;cout.width(12);coutinum3endl;cout.setf(ios:hex,ios:hex|ios:oct);/或cout.setf(ios:hex);cout.unsetf(ios:oct);/特別注意第二個參數(shù)要包含第一個參數(shù),否則兩個參數(shù)位置上的位全清零,結果錯cout.width(12);coutinum1;cout.width(12);coutinum2;cout.width(12);coutinum3endl;cout.precision(10); /精度為10位,小數(shù)點后10位cout.setf(ios:scientific,ios:floatfield);/floatfield為0x1800cout科學數(shù)表達方式:fnumn;cout.setf(ios:fixed,ios:floatfield); /設為定點,取消科學數(shù)方式cout定點表達方式:fnumn;cout請輸入PI:fnum1;/輸入3.1415926535coutfnum1n;/由輸出看輸入精度無作用cin.get();/吸收回車cout請輸入一個字符串:endl;cin.getline(str,255);coutstrendl;cout.flags(0);cout以左對齊方式輸出整數(shù),域寬為12:endl;coutleftdecsetw(12)inum1;coutsetw(12)inum2;coutsetw(12)inum3endl;coutshowbaseoctsetw(12)inum1;coutsetw(12)inum2;coutsetw(12)inum3endl;couthexsetw(12)inum1;coutsetw(12)inum2;coutsetw(12)inum3endl;coutsetprecision(10)scientific科學數(shù)表達方式:fnumn;coutfixed定點表達方式:fnumn; /精度10位,指小數(shù)點后10位return 0;9.4 修改【例9.3】,增加一個字符串輸入后要求確認,以保證輸入的字符串(如姓名、地址等)無誤。解:#includeusing namespace std;int main(void)char ch,str255;docout請輸入一個字符串:endl;cin.getline(str,255);coutstrendl;cout輸入正確嗎?Y or Nch;cin.get();/吸收輸入Y or N時留下的回車while(!(ch=Y|ch=y);cout輸入正確:endl;coutstrendl;return 0;9.5 重載學生類的“”運算符。#include#include#include#includeusing namespace std;class studentint id ; /學號string name; / 姓名char sex; / 性別int age; / 年齡string address; /家庭地址float eng, phy, math, electron; /英語,物理,數(shù)學和電子學成績public:student(int=0,string=#,char=#,int=0,string=#,float=0,float=0,float=0,float=0);friend ostream&operator(istream&sour,student&st); /重載提取運算符; /流類作為形式參數(shù)必須是引用student:student(int i,string n,char s,int a,string add,float en,float ph,float ma,float ele)id=i;name=n;sex=s;age=a;address=add;eng=en; phy=ph; math=ma; electron=ele;ostream&operator(ostream&dest,student&st) /重載插入運算符tst.sextst.agetst.addresstst.engtst.phytst.mathtst.electron(istream&sour,student&st) /重載提取運算符cout請輸入學號:st.id;cout請輸入姓名:;cout請輸入性別:st.sex;cout請輸入年齡:st.age;cout請輸入地址:st.address;cout請輸入英語、物理、數(shù)學、電子各科成績:st.engst.physt.mathst.electron;return sour;int main()student st1,st2(2104105,陳英,m,19,黃山路380號,89,78,90,96);cinst1;coutst1”運算符,對所有可能的錯誤都能要求重輸。解:#includeusing namespace std;class Complexdouble Real,Image;public:Complex(double r=0.0, double i=0.0):Real(r),Image(i);/定義構造函數(shù)/見【例5.7】,這里省略,以節(jié)約篇幅friend ostream&operator(istream&s,Complex&a); /流類作為形式參數(shù)必須是引用ostream&operator(ostream&s,const Complex &z)return s(z.Real,z.Image(istream&s,Complex &a)/格式為r;r,i;(r);(r,i);整個復數(shù)輸完才可回車/容錯強,如:sd(fr56cv,s79nml,45)i,78回車 可正確判讀為(56,79)double re=0,im=0;char c=0;dosc;while(c!=(&c!=.&!(c=0&cc;while(c!=.&!(c=0&cre;/實部dos.get(c);/因為可能是回車while(c!=n&c!=)&c!=,);/讀空數(shù)字串后的無用字符if(c=,)do/只讀數(shù)字串sc;while(c!=.&!(c=0&cim;/虛部dos.get(c);/因為可能是回車while(c!=n&c!=);/讀空數(shù)字串后的無用字符else im=0;/無此步,第二次賦值出錯if(c!=)s.clear(ios:failbit);/漏了括號給一個操作失敗標志elses.putback(c);/無括號,返回一個字符到輸入緩沖區(qū)sre;/實部dos.get(c);/因為可能是回車while(c!=n&c!=,);/讀空數(shù)字串后的無用字符if(c=,)do/只讀數(shù)字串sc;while(c!=.&!(c=0&cim;/虛部dos.get(c);/因為可能是回車while(c!=n);/讀空數(shù)字串后的無用字符else im=0;/無此步,第二次賦值出錯if(s) a=Complex(re,im);return s;int main()Complex a,b,c,d;cout輸入一個實數(shù)a;cout輸入一個復數(shù)b;cout輸入一個用括號括起來的實數(shù)c;cout輸入一個用括號括起來復數(shù)d;couta=atb=btc=ctd=dn;return 0;9.7 以文本方式把一個文本文件(如+源文件)的前十行拷貝到一個新的文件中。解:注意只能用于純文本文件,如用于word文件則失敗。word文檔構造前面有一大堆說明,按文本讀必然失敗。第二,用傳統(tǒng)的運行庫,按行讀有可能丟失一些回車,而用新的標準庫則解決了這個問題。用VC+標準庫函數(shù),即用頭文件iostream時,如果函數(shù)未能讀到結束字符而停止,流出錯(輸入輸出操作失?。?,后面不再讀入,必須清0流狀態(tài)字,才能繼續(xù)讀入。一行字符分幾次讀完,原來有可能無法判斷是讀到結束字符結束還是讀到指定字符結束,現(xiàn)在可以判斷了:如果流正常,則讀到了結束字符。#include#include /不包含#includeusing namespace std;int main()int line=0;char filename256,buf256;fstream sfile,dfile;cout輸入源文件路徑名:filename;/對路徑各方面而言空格是無關緊要的,否則要用getline()等成員函數(shù)sfile.open(filename,ios:in);/打開一個已存在的文件while(!sfile)cout源文件找不到,請重新輸入路徑名:filename;sfile.open(filename,ios:in);cout輸入目標文件路徑名:filename; /只能創(chuàng)建文件,不能建立子目錄,如路徑不存在則失敗dfile.open(filename,ios:out);if(!dfile)cout目標文件創(chuàng)建失敗endl;return 1;while(sfile.getline(buf,256),sfile.eof()!=1&line10)/按行拷貝 A行if(sfile.rdstate()=0) dfilebufn;/因流正常,讀到回車符,但未提取 B行l(wèi)ine+;elsedfilebuf;/流不正常,還未讀到回車換行符,所以不加nsfile.clear();/狀態(tài)字被置為0x02,必須清0 sfile.close();dfile.close();return 0;9.8 用二進制方式,把一個文件連接到另一個文件的尾部,選擇適當?shù)奈募蜷_方式完成。解:注意連接只能用于純文本文件,如用于word文件則失敗。如果用word文檔,則可見目標文檔大小在翻倍,但只能讀最前面一段。因為word文檔構造前面有一大堆說明,真正連接時,后面的源文件前面的說明要去掉,但這做不到。#include#include#includeusing namespace std;int main()int n;char filename256,buf100;fstream sfile,dfile;cout輸入源文件路徑名:filename;/對路徑各方面而言空格是無關緊要的,否則要用getline()等成員函數(shù)sfile.open(filename,ios:in|ios:binary);/打開一個已存在的二進制文件while(!sfile)cout源文件找不到,請重新輸入路徑名:filename;sfile.open(filename,ios:in|ios:binary);cout輸入目標文件路徑名:filename; /只能創(chuàng)建文件,不能建立子目錄,如路徑不存在則失敗dfile.open(filename,ios:app|ios:out|ios:binary);/文件指針在尾部if(!dfile)cout目標文件創(chuàng)建失敗endl;return 1;while(!sfile.eof()/二進制方式需另判文件是否結束 Asfile.read(buf,100);n=sfile.gcount();dfile.write(buf,n);/按實際讀取字節(jié)數(shù)寫 sfile.close();dfile.close();return 0;9.9 同上題,采用重新定位文件指針方式來實現(xiàn)(隨機訪問方式)。解:同樣連接只能用于純文本文件,如用于word文件則失敗。如果用word文檔,則可見目標文檔大小在翻倍,但只能讀最前面一段。因為word文檔構造前面有一大堆說明,真正鏈接時,后面的源文件前面的說明要去掉,但這做不到。#include#include#includeusing namespace std;int main()int n;char filename256,buf100;fstream sfile,dfile;cout輸入源文件路徑名:filename;/對路徑各方面而言空格是無關緊要的,否則要用getline()等成員函數(shù)sfile.open(filename,ios:in|ios:binary);/打開一個已存在的二進制文件while(!sfile)cout源文件找不到,請重新輸入路徑名:filename;sfile.open(filename,ios:in|ios:binary);cout輸入目標文件路徑名:filename; /只能創(chuàng)建文件,不能建立子目錄,如路徑不存在則失敗dfile.open(filename,ios:in|ios:out|ios:binary); /打開輸入輸出文件if(!dfile)dfile.clear(0);dfile.open(filename,ios:out); /建立輸出文件dfile.close();dfile.open(filename,ios:in|ios:out|ios:binary); /改為輸入輸出文件dfile.seekp(0,ios:end);/寫指針重定位到文件尾, seekp和seekg是同一個文件指針while(!sfile.eof()/二進制方式需另判文件是否結束 Asfile.read(buf,100);n=sfile.gcount();dfile.write(buf,n);/按實際讀取字節(jié)數(shù)寫 sfile.close();dfile.close();return 0;9.10 采用篩選法求100以內的所有素數(shù)(參見【例3.16】)。將所得數(shù)據(jù)存入文本文件和二進制文件。對送入文本文件中的素數(shù),要求存放格式是每行10個素數(shù),每個數(shù)占6個字符,左對齊;可用任一文本編輯器將它打開閱讀。二進制文件整型數(shù)的長度請用sizeof()來獲得,要求可以正序讀出,也可以逆序讀出(利用文件定位指針移動實現(xiàn)),讀出數(shù)據(jù)按文本文件中的格式輸出顯示。解:前半題文本文件與習題3.17相同,只是那里是右對齊,這里只新做了二進制文件。注意逆序輸出前,試讀看有多少數(shù)據(jù)時,一旦讀到文件結束,eofbit=1,不清0,后面操作不能進行。#include#include#includeconst int n=100;void main()ofstream ofile;ifstream ifile;int an,i,j;char ch,b256;for(i=0;in;i+) ai=1+i;/用數(shù)組保存整數(shù)1-100a0=0;/1不是素數(shù),置0for(i=0;in;i+)if(ai=0) continue;/該數(shù)已經(jīng)置0,判斷下一個數(shù)for(j=i+1;jn;j+) if(aj%ai=0) aj=0;/是ai倍數(shù)的元素置0;ofile.open(myfile9_9.txt);int count=0;ofile.flags(ios:left);ofile1-n之間的素數(shù):endl;for(i=0;in;i+)/輸出所有素數(shù)if(ai!=0)ofilesetw(6)ai;count+;if(count%10=0) ofileendl;/每行10個數(shù)據(jù)ofile.close();cout是否要將文本文件輸出?Y或Nch;if(ch=y|ch=Y)ifile.open(myfile9_9.txt);i=0;while(ifile.get(bi)/讀標題,不可用,它不能讀白字符,if(bi=n) break;i+;bi=0;cout.flags(ios:left);coutbi;/由文件讀入if(ifile.eof()!=0) break;coutsetw(6)i;/屏幕顯示count+;if(count%10=0) coutendl;/每行10個數(shù)ifile.close();coutendl;ofile.open(myfile9_9.dat,ios:out|ios:binary);for(i=0;in;i+)/輸出所有素數(shù)if(ai!=0)ofile.write(char*)&ai,sizeof(int);ofile.close();cout是否要將二進制文件輸出?Y或Nch;if(ch=y|ch=Y)count=0;ifile.open(myfile9_9.dat,ios:in|ios:binary);while(1)ifile.read(char*)&i,sizeof(int);if(ifile.eof()!=0) break;coutsetw(6)i;/屏幕顯示count+;if(count%10=0) coutendl;ifile.close();coutendl;cout是否要將二進制文件逆序輸出?Y或Nch;if(ch=y|ch=Y)count=0;ifile.open(myfile9_9.dat,ios:in|ios:binary);while(1)ifile.read(char*)&i,sizeof(int);if(ifile.eof()!=0) break;count+;ifile.clear(0);/當文件讀完時,eofbit=1,不清0,后面的操作不能進行ifile.seekg(-4,ios:end);for(j=1;j=count;j+)ifile.read(char*)&i,sizeof(int);coutsetw(6)i;/屏幕顯示if(j%10=0) coutendl;ifile.seekg(-8,ios:cur);ifile.close();coutendl;9.11 正弦函數(shù)在0o90o的范圍中是單調遞增的,建立兩個文件:一個放sin0o,sin2o,sin80o;另一個放sin1o,sin3o,sin79o, sin81o,sin82 o,sin90o,用歸并法,把這兩個數(shù)據(jù)文件合并為升序排序的文件,重組為一個完整的sin()函數(shù)表文件。解:題解中注釋掉的直接讀寫法與使用成員函數(shù)結果完全相同,對于類對象,讀和寫及占據(jù)內存大小均指數(shù)據(jù)成員。主函數(shù)中要避免第2次運行時表中出現(xiàn)重復數(shù)據(jù)。#include#include#include#includeusing namespace std;class sinxdouble Degree;/角度double Value;/正弦值public:sinx(double =0);void display();void Bdatatofile(fstream &); /文件流類作為形式參數(shù)必須是引用void Bdatafromfile(fstream &);void datainput(double deg);bool operator=(sinx &);bool operator=(sinx &);bool sinx:operator=(sinx & si)double k;k=Degree-si.Degree;if(k=0) return true;else return false;bool sinx:operator=(sinx & si)double k;k=Degree-si.Degree;if(k=0) return true;else return false;sinx:sinx(double deg)Degree=deg;Value=sin(deg*3.1415926535/180);void sinx:display()coutsetw(10)Degreesetw(10)Valueendl;void sinx:datainput(double deg)Degree=deg;Value=sin(deg*3.1415926535/180);void sinx:Bdatatofile(fstream & dest)dest.write(char*)&Degree,sizeof(double);dest.write(char*)&Value,sizeof(double);void sinx:Bdatafromfile(fstream & sour)sour.read(char*)&Degree,sizeof(double);sour.read(char*)&Value,sizeof(double);/由此可見讀和寫是完全對稱的過程,次序決不能錯template class ArrayT *elements;char name20;int Subscript;/已用最大下標值int maxSize;fstream datafile;public:Array(char* =myfile,int=20);Array();bool IsFull() constreturn Subscript=maxSize-1;void renews();/數(shù)組擴大一倍void ordinsert(T&);/升序輸入void listshow();/顯示數(shù)組;template Array:Array(char* filename,int maxs)maxSize=maxs;Subscript=-1;/私有數(shù)據(jù)不容許直接賦初值,必須在構造函數(shù)中賦初值strcpy(name,filename);T temp;elements=new TmaxSize;datafile.open(name,ios:binary|ios:in);if(!datafile=0)while(!datafile.eof()temp.Bdatafromfile(datafile);/datafile.read(char*)&temp,sizeof(T);/直接讀寫法與使用成員函數(shù)結果相同if(datafile.eof()=0)/讀到無數(shù)據(jù)可讀后,
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
- 4. 未經(jīng)權益所有人同意不得將文件中的內容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內容本身不做任何修改或編輯,并不能對任何下載內容負責。
- 6. 下載文件中如有侵權或不適當內容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 《茶的起源和發(fā)展》課件
- 機場空防安全檢討書
- 《經(jīng)濟發(fā)展策略分析》課件
- 教導處范文高中青年教師說課比賽實施方案
- 《氣流與室內通風》課件
- 雙十二探旅新紀元
- 作業(yè)成就學習
- 《精密數(shù)控加工技術》課件
- 《病毒變異動態(tài)》課件
- 2025四川省存量房委托買賣合同范本
- 2025年四川省成都市青羊區(qū)中考二診化學試題(原卷版+解析版)
- 2024年南京市建鄴區(qū)平安聯(lián)盟工作輔助人員招聘筆試真題
- 2025至2030中國核燃料加工行業(yè)競爭趨勢及發(fā)展前景可持續(xù)報告
- 山西省部分重點中學2024-2025學年高三4月模擬檢測語文試題(含答案)
- 浙江省寧波市2024學年第二學期高考與選考模擬考試化學試卷及答案(寧波二模)
- 【MOOC】大學英語聽說譯-河南理工大學 中國大學慕課MOOC答案
- 幼兒園班級幼兒圖書目錄清單(大中小班)
- 水平四籃球行進間運球教學設計
- 雨露計劃職業(yè)教育補助學籍證明四川
- 15MW雙饋風力發(fā)電機電氣原理圖
- 三軸水泥攪拌樁施工記錄表
評論
0/150
提交評論