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

下載本文檔

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

文檔簡介

第十一章流類庫與輸入/輸出C++語言程序設(shè)計1本章主要內(nèi)容I/O流的概念標(biāo)準(zhǔn)輸入輸出文件操作2I/O流的概念流是對輸入/輸出的一個抽象表述。程序通過從流中提取字符和向流中插入字符來實現(xiàn)輸入和輸出。

I/O流類庫是一個提供輸入/輸出功能的,面向?qū)ο蟮念悗臁?/p>

3I/O流類庫的層次結(jié)構(gòu)ios流基類istream通用輸入流類ostream通用輸出流類iostream通用輸入輸出流類ifstream輸入文件流類ofstream輸出文件流類

fstream輸入輸出文件流類

4標(biāo)準(zhǔn)輸入輸出流對象cout標(biāo)準(zhǔn)輸出,默認輸出設(shè)備屏幕cerr標(biāo)準(zhǔn)錯誤輸出,沒有緩沖,發(fā)送給它的內(nèi)容立即被輸出,默認輸出設(shè)備屏幕。clog類似于cerr,但是有緩沖,緩沖區(qū)滿時被輸出,默認輸出設(shè)備打印機。cin標(biāo)準(zhǔn)輸入,默認輸入設(shè)備鍵盤5運算符插入(<<)運算符是所有標(biāo)準(zhǔn)C++數(shù)據(jù)類型預(yù)先設(shè)計的,用于傳送字節(jié)到一個輸出流對象。提取運算符(>>)對于所有標(biāo)準(zhǔn)C++數(shù)據(jù)類型都是預(yù)先設(shè)計好的,它是從一個輸入流對象獲取字節(jié)最容易的方法。6classRMB{public:RMB(unsignedintd=0,unsignedintc=0); RMBoperator+(RMB&);RMB&operator++(); RMBoperator++(int);friendostream&operator<<(ostream&os,constRMB&r);friendistream&operator>>(istream&is,RMB&r);private:unsignedintyuan; unsignedint};7ostream&operator<<(ostream&os,constRMB&r) { os<<r.yuan<<''<<r.jf<<endl; returnos; }istream&operator>>(istream&is,RMB&r) { is>>r.yuan>>r.jf; returnis;}8intmain() {RMBd4,d5; cout<<"pleaseinput:yuanjf"<<endl;

cin>>d4>>d5; cout<<d4<<d5<<endl; }9使用流對象成員函數(shù)用getline()讀取輸入行:讀取分隔符用get()輸入一系列字符:不讀取分隔符用ignore()讀取并丟棄一系列字符用get()讀取一個字符用put()輸出一個字符用peek()查看輸入流中的下一個字符用read()實現(xiàn)無格式輸入用write()實現(xiàn)無格式輸出10使用get和put成員函數(shù)輸入輸出字符

#include<iostream>usingnamespacestd;intmain(){ intch; cout<<"Inputasentence:"<<endl; while((ch=cin.get())!=EOF)cout.put(ch);//使用get和put來讀取顯示字符 return0;}11使用peek()成員函數(shù)輸入輸出字符

#include<iostream>usingnamespacestd;intmain(){ intch; cout<<"Inputasentence:"<<endl; while(cin.peek()!=‘*’)

{cin.get(ch);cout.put(ch); return0;}12流狀態(tài)eofbit如果到達文件尾,則設(shè)為1badbit如果流被破壞,則設(shè)為1failbit如果輸入沒有讀到預(yù)期字符或輸出沒有寫入預(yù)期字符,則設(shè)置為1eof()eof被設(shè)置,返回truefail()badbit或failbit被設(shè)置,返回trueclear()13流狀態(tài)控制if(cin.fail()&&!cin.eof()){cin.clear();while(!isspace(cin.get()))continue;}14控制輸出格式成員函數(shù)方式

包含頭文件<iostream>precision(n),width(n),flags(c),flags(8),flags(16),flags(10),fill(c)用控制符

包含頭文件<iomanip>setprecision(n),setw(n),setfill(c),oct,hex,dec,setiosflags(),resetiosflags()15設(shè)置整數(shù)流的基數(shù)——

dec、oct、hex和setbase

#include<iostream>#include<iomanip>usingnamespacestd;intmain(){intnum;cout<<"Enteradecnumber:";cin>>num;//使用hex流操縱符顯示十六進制整數(shù)cout<<num<<"inhexis:"<<

hex<<num<<endl;//使用oct流操縱符顯示八進制整數(shù)cout<<dec<<num<<"inoctis:"<<oct<<num<<endl;//使用setbase流操縱符顯示十進制整數(shù)cout<<setbase(10)<<num<<"indecis:"<<num<<endl;return0;}輸出結(jié)果:Enteradecnumber:3737inhexis:2537inoctis:4537indecis3716設(shè)置浮點數(shù)精度——

precision和setprecision

#include<iostream>#include<iomanip>#include<cmath>usingnamespacestd;intmain()//設(shè)置小數(shù)點后面的位數(shù)

{doubleroot=sqrt(3.0); cout<<"setbyprecision:\n"<<fixed;//使用fixed精度for(inti=0;i<=4;i++){ cout.precision(i); cout<<root<<endl;}

return0;}輸出結(jié)果:Setbyprecision:21.71.731.7321.732117設(shè)置域?qū)挘簑idth和setw

#include<iostream>#include<iomanip>usingnamespacestd;voidmain(){doublevalues[]={1.23,35.36,653.7,4358.24};char*names[]={"zrf","ssh","zzz","sss"};for(inti=0;i<4;i++) //設(shè)置域?qū)捿敵鰗cout.width(20);

cout<<names[i]<<setw(20)<<values[i]<<'\n';}}//域?qū)捲O(shè)置僅對下一次流提取或流插入操作有效。默認不足用空格補。不帶參數(shù)的width函數(shù)返回當(dāng)前域?qū)挕?/p>

18設(shè)置填充標(biāo)志——

fill和setfill

#include<iostream>#include<iomanip>usingnamespacestd;intmain(){intnum=80000;cout<<<setw(10)<<num<<endl; cout<<left<<setw(10)<<num<<endl;//左對齊cout<<internal<<setw(10)<<num<<endl<<endl; cout<<right;cout.fill('*'); //添加填補字符*cout<<setw(10)<<dec<<num<<endl;cout<<left<<setw(10)<<setfill('%')<<num<<endl; //添加填補字符%return0;}19例11-3設(shè)置對齊方式#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)<<setw(6)<<names[i]<<resetiosflags(ios::left)<<setw(10)<<values[i]<<endl;}輸出結(jié)果:Zoot1.23Jimmy35.36Al653.7Stan4358.2420設(shè)置科學(xué)記數(shù)法和定點符號——scientific和fixed

#include<iostream>usingnamespacestd;intmain(){doublex=0.0001234567;doubley=1.846e8;//按照默認格式顯示cout<<“Indefaultformat:\n"<<x<<'\t'<<y<<endl;//按科學(xué)計數(shù)法顯示cout<<“Inscientificformat:\n"<<scientific<<x<<'\t'<<y<<endl;//按定點格式顯示cout<<“Infixedformat:\n"<<fixed<<x<<'\t'<<y<<endl;

return0;}輸出結(jié)果:Indefaultformat:0.00012345671.846e+008Inscientificformat:1.234567e-0041.846000e+008Infixedformat:0.000123184600000.00000021例11-4控制輸出精度#include<iostream>#include<iomanip>usingnamespacestd;intmain(){doublevalues[]={1.23,35.36,653.7,4358.24};char*names[]={"Zoot","Jimmy","Al","Stan"};cout<<setiosflags(ios::scientific);for(inti=0;i<4;i++)cout<<setiosflags(ios::left)<<setw(6)<<names[i]<<resetiosflags(ios::left)<<setw(10)<<setprecision(1)<<values[i]<<endl;}輸出結(jié)果:Zoot1Jimmy4e+001Al7e+002Stan4e+00322Setf與unsetf#include<iostream>usingnamespacestd;intmain(){doubletemperature=29.5;cout.setf(ios::showpos);cout.setf(ios::showpoint);cout<<temperature<<endl;

cout.unsetf(ios::showpos);cout.unsetf(ios::showpoint);

cout<<temperature<<endl;return0;}輸出結(jié)果:+29.500029.523文件操作ofstream類輸出到文件ifstream類從文件輸入fstream類進行文件輸入和輸出用戶需要自定義文件輸入流對象或輸出流對象在創(chuàng)建流對象時把流與文件關(guān)聯(lián)24輸出文件流對象ofstream類支持磁盤文件輸出如果在構(gòu)造函數(shù)中指定一個文件名,當(dāng)構(gòu)造這個文件時該文件是自動打開的ofstreammyFile("filename",iosmode);可以在調(diào)用默認構(gòu)造函數(shù)之后使用open成員函數(shù)打開文件ofstreammyFile;//聲明一個靜態(tài)輸出文件流對象myFile.open("filename",iosmode);

//打開文件,使流對象與文件建立聯(lián)系ofstream*pmyFile=newofstream;

//建立一個動態(tài)的輸出文件流對象pmyFile->open("filename",iosmode);

//打開文件,使流對象與文件建立聯(lián)系25文件打開模式ios::out以寫入方式打開ios::out|ios::binary以二進制寫入方式打開ios::out|ios:trunc覆蓋已有文件ios::out|ios:app追加文件ios::in以讀取方式打開ios::in|ios::binary以二進制讀取方式打開

26使用流運算符輸出文本文件#include<iostream>#include<fstream>usingnamespacestd;intmain(){ ofstreamofile("test");//以文本輸出方式打開 if(!ofile) { cout<<"Cannotopenfile.\n"; return1; }

ofile<<10<<""<<123.23<<"\n";//輸出到文件 ofile<<"Thisprogramisdesignedbyzrfandssh!.";

ofile.close(); //關(guān)閉文件 return0;}

27輸出文件流成員函數(shù)open函數(shù)把流與一個特定的磁盤文件關(guān)聯(lián)起來。需要指定打開模式。put函數(shù)把一個字符寫到輸出流中。write函數(shù)把內(nèi)存中的一塊內(nèi)容寫到一個輸出文件流中seekp函數(shù)將輸出指針移動到文件的指定位置,0表示文件頭tellp函數(shù)返回輸出指針的當(dāng)前位置(streampos)close函數(shù)關(guān)閉與一個輸出文件流關(guān)聯(lián)的磁盤文件28輸入文件流對象如果在構(gòu)造函數(shù)中指定一個文件名,在構(gòu)造該對象時該文件便自動打開。ifstreammyFile("filename",iosmode);在調(diào)用缺省構(gòu)造函數(shù)之后使用open函數(shù)來打開文件。ifstreammyFile;//建立一個文件流對象myFile.open("filename",iosmode);

//打開文件"filename"29使用流運算符讀入文本文件#include<iostream>#include<fstream>usingnamespacestd;intmain(){ charch;inti;floatf;charstr[80];

ifstreamifile("test");//以文本輸出方式打開文件

if(!ifile) { cout<<"Cannotopenfile.\n"; return1; } ifile>>i>>f>>ch>>str; //讀文件 cout<<i<<""<<f<<""<<ch<<"\n"<<str;

ifile.close();//關(guān)閉文件 return0;}30輸入流成員函數(shù)open()函數(shù)

把輸入流與一個磁盤文件相關(guān)聯(lián)get(),getline()函數(shù)

整行輸入字符串read()函數(shù)

從輸入文件流中讀給定字節(jié)數(shù)據(jù)到指定的內(nèi)存區(qū)域31輸入流成員函數(shù)seekg()函數(shù)

用來設(shè)置輸入文件流中讀取數(shù)據(jù)位置的指針tellg()函數(shù)

返回當(dāng)前文件讀指針的位置,streamposclose()函數(shù)

關(guān)閉與一個輸入文件流關(guān)聯(lián)的磁盤文件32例11-5向文件輸出#include<fstream>usingnamespacestd;structDate{intmo,da,yr;};intmain(){Datedt={6,10,92};

ofstreamtfile("date.dat",ios::binary);

tfile.write((char*)&dt,sizeofdt);tfile.close();}33使用read()和write()函數(shù)讀寫二進制文件

#include<iostream>#include<fstream>usingnamespacestd;intmain(){ intn[5]={1,2,3,4,5};inti;

ofstreamofile("test.bin",ios::out|ios::binary);//以二進制方式打開文件 if(!ofile) {cout<<"Cannotopenfile.\n";return1; }

ofile.write((char*)n,sizeofn);//向文件寫數(shù)據(jù)塊

ofile.close();

34for(i=0;i<5;i++) n[i]=0;

ifstreamifile("test.bin",ios::in|ios::binary);//以二進制方式打開文件 if(!ifile){cout<<"Cannotopenfile.\n";return1; }

ifile.read((char*)n,sizeof(n));

//從文件中讀數(shù)據(jù) for(i=0;i<5;i++) cout<<n[i]<<"";

ifile.close(); return0;}35classRMB{public:RMB(unsignedintd=0,unsignedintc=0); RMBoperator+(RMB&);RMB&operator++(); RMBoperator++(int);friendostream&operator<<(ostream&os,constRMB&r);friendistream&operator>>(istream&is,RMB&r);private:unsignedintyuan; unsignedint};36ostream&operator<<(ostream&os,constRMB&r) { os<<r.yuan<<''<<r.jf<<endl; returnos; }istream&operator>>(istream&is,RMB&r) { is>>r.yuan>>r.jf; returnis;}37intmain() {RMBd4,d5; cout<<"pleaseinput:yuanjf"<<endl;

cin>>d4>>d5; ofstreamofile("test"); if(!ofile) {cout<<"Cannotopenfile.\n"; return1; }

ofile<<d4<<d5<<endl;

ofile.close();

38

ifstreamifile("test"); if(!ifile) { cout<<"Cannotopenfile.\n"; return1; }

ifile>>d5>>d6; cout<<d5<<d6<<endl; ifile.close();39ofstreamofile1("test1.bin",ios::out|ios::binary); if(!ofile1) {cout<<"Cannotopenfile.\n"; return1; }ofile1.write((char*)&d4,sizeofd4);ofile1.write((char*)&d5,sizeofd5); ofile1.close();40ifstreamifile1("test1.bin",ios::in|ios::binary); if(!ifile1) {cout<<"Cannotopenfile.\n"; return1; }ifile1.read((char*)&d5,sizeofd5);ifile1.read((char*)&d6,sizeofd6);cout<<d5<<d6<<endl; ifile1.close();41設(shè)計文本文件的拷貝類CFileCopy

設(shè)計一個用于文本文件拷貝類CFileCopy,通過該類的使用,可以實現(xiàn)一個文件到另一個文件的拷貝功能。為了實現(xiàn)文件的拷貝需要使用get函數(shù)讀取字符,用put函數(shù)寫入字符,從而實現(xiàn)逐個字符進行復(fù)制。程序要求用戶輸入源文件名和目標(biāo)文件

溫馨提示

  • 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. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論