程序設(shè)計(jì)與問題求解Ⅱ8_第1頁(yè)
程序設(shè)計(jì)與問題求解Ⅱ8_第2頁(yè)
程序設(shè)計(jì)與問題求解Ⅱ8_第3頁(yè)
程序設(shè)計(jì)與問題求解Ⅱ8_第4頁(yè)
程序設(shè)計(jì)與問題求解Ⅱ8_第5頁(yè)
已閱讀5頁(yè),還剩29頁(yè)未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

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

文檔簡(jiǎn)介

第8章輸入輸出流與文件繆裕青1本章主要內(nèi)容輸入/輸出流(I/O流)預(yù)定義類型的輸入/輸出對(duì)象的輸入/輸出文件的讀/寫文本文件二進(jìn)制文件隨機(jī)文件2輸入輸出流(1)在程序設(shè)計(jì)中,數(shù)據(jù)輸入/輸出(I/O)操作是必不可少的輸入(Input):輸出(Output):在C++程序中可以繼續(xù)使用C的標(biāo)準(zhǔn)I/O庫(kù)函數(shù)printf和scanf實(shí)現(xiàn)輸入輸出功能。也可以使用C++語(yǔ)言給用戶提供的可擴(kuò)展的輸入輸出流類。通過使用I/O流庫(kù),不僅能夠處理基本類型數(shù)據(jù),還能處理用戶自定義的數(shù)據(jù)類型。計(jì)算機(jī)內(nèi)存數(shù)據(jù)外部輸出設(shè)備計(jì)算機(jī)內(nèi)存數(shù)據(jù)外部輸入設(shè)備3輸入輸出流(2)I/O流的概念I(lǐng)/O是一種基本的數(shù)據(jù)傳送操作,它可以理解為字符序列在計(jì)算機(jī)內(nèi)存與外設(shè)之間的流動(dòng)。將數(shù)據(jù)從一個(gè)對(duì)象到另一個(gè)對(duì)象的流動(dòng)稱為流。流具有方向性:輸入流:與輸入設(shè)備相聯(lián)系的流稱為輸入流。輸出流:與輸出設(shè)備相聯(lián)系的流稱為輸出流。輸入輸出流:與輸入/輸出設(shè)備相聯(lián)系的流稱為輸入輸出流。外部設(shè)備計(jì)算機(jī)內(nèi)存數(shù)據(jù)4流類庫(kù)(1)I/O流類庫(kù)在C++中,輸入輸出流被定義為類,稱為流類。按照面向?qū)ο蠓椒ńM織的多個(gè)流類及其層次集合稱為流類庫(kù)。5流類庫(kù)(2)常用的流類庫(kù),以及在編程中需要包含到程序中的頭文件類

名說(shuō)

明需要包含的頭文件ios流基類,是抽象類iostreamistream輸入流類的基類iostreamifstream輸入文件流類fstreamostream輸出流類的基類iostreamofstream輸出文件流類fstreamiostreamI/O流類的基類iostreamfstreamI/O文件流類fstream6流類庫(kù)(3)預(yù)定義的流對(duì)象cin是istream流類的一個(gè)對(duì)象,用于處理標(biāo)準(zhǔn)輸入設(shè)備的輸入cout、cerr、clog都是ostream流類的對(duì)象cout用于處理標(biāo)準(zhǔn)輸出設(shè)備的輸出cerr和clog均可用于處理標(biāo)準(zhǔn)出錯(cuò)信息,不同之處在于cerr輸出不帶緩沖功能,clog輸出具有緩沖功能在缺省情況下,指定的標(biāo)準(zhǔn)輸出設(shè)備是顯示屏,標(biāo)準(zhǔn)輸入設(shè)備是鍵盤。在任何情況下,指定的標(biāo)準(zhǔn)錯(cuò)誤輸出設(shè)備總是顯示屏。7預(yù)定義類型的輸入輸出預(yù)定義類型的輸入輸出指預(yù)定義類型數(shù)據(jù)對(duì)于標(biāo)準(zhǔn)輸入輸出設(shè)備的輸入輸出。預(yù)定義類型的輸入輸出分為無(wú)格式輸入輸出格式化輸入輸出兩個(gè)相關(guān)運(yùn)算(運(yùn)算符重載)提取運(yùn)算:從流中獲取數(shù)據(jù)的操作稱為提取運(yùn)算(>>)——輸入流插入運(yùn)算:向流中添加數(shù)據(jù)的操作稱為插入運(yùn)算(<<)——輸出流8無(wú)格式輸入輸出無(wú)格式(默認(rèn)格式)輸入輸出使用兩個(gè)流對(duì)象cin和cout,和與之相配套的兩個(gè)運(yùn)算符“>>”和“<<”,即輸入流對(duì)象cin和輸出流對(duì)象cout對(duì)運(yùn)算符“>>”和“<<”重載函數(shù)的調(diào)用。例如:cin>>變量;//輸入cout<<表達(dá)式;//輸出它們可分別被解釋為:cin.operator>>(變量);cout.operator<<(表達(dá)式);僅依靠默認(rèn)的格式不能滿足實(shí)際需要,如設(shè)定輸出項(xiàng)的寬度、浮點(diǎn)數(shù)的精度以及對(duì)齊方式等等。9格式化輸入輸出C++提供了兩種格式的控制方法:使用ios類中有關(guān)格式控制的成員函數(shù)進(jìn)行格式控制使用流操作算子(特殊函數(shù))進(jìn)行格式控制10成員函數(shù)格式控制(1)使用ios類中有關(guān)格式控制的成員函數(shù)進(jìn)行格式控制控制輸入輸出格式的成員函數(shù)函數(shù)原型功能longios::setf(longflags);Longios::unsetf(longflags);longios::flags();longios::flags(longflags);intios::width();intios::width(intw);intios::precision(intp);charios::fill();charios::fill(charch);設(shè)置狀態(tài)標(biāo)志flags清除狀態(tài)標(biāo)志,并返回以前的狀態(tài)標(biāo)志返回當(dāng)前狀態(tài)標(biāo)志設(shè)置標(biāo)志flags,返回以前的狀態(tài)標(biāo)志返回當(dāng)前的寬度設(shè)置值設(shè)置域?qū)抴,返回以前的域?qū)捲O(shè)置小數(shù)精度p,返回以前的小數(shù)位數(shù)返回當(dāng)前的填充字符設(shè)置填充字符ch,返回以前的填充字符狀態(tài)標(biāo)志flags及其含義如書上表14-1所示設(shè)置多項(xiàng)狀態(tài)標(biāo)志中間用“|”運(yùn)算符分隔:狀態(tài)標(biāo)志1|狀態(tài)標(biāo)志2|…11成員函數(shù)格式控制舉例#include<iostream.h>intmain(){ cout<<12.345678<<endl; cout<<cout.precision(4)<<endl; cout<<12.34<<""<<12.3456<<endl; cout<<cout.width()<<endl;

cout.width(10); cout<<12.3456<<endl;

cout.fill('*'); cout<<12.3456<<endl;

cout.width(10); cout<<12.3456<<endl; cout<<"Hi!"<<endl;

cout.width(10); cout<<"Hi!"<<endl;

cout.width(10);

cout.setf(ios::left); cout<<12.3456<<endl; return0;}12流操作算子格式控制C++流操作算子包括無(wú)參函數(shù)——定義在頭文件iostream.h有參函數(shù)——定義在頭文件iomanip.h流操作算子可以用在提取運(yùn)算符“>>”或插入運(yùn)算符“<<”后面來(lái)設(shè)定輸入輸出格式,是I/O表達(dá)式的一部分。流操作算子如書上表14-2所示13流操作算子格式控制舉例#include<iostream.h>#include<iomanip.h>intmain(){cout<<123456789<<endl;cout<<setw(10)<<123456789<<endl;cout<<setiosflags(ios::scientific) <<setw(20)<<123.456789<<endl;cout<<resetiosflags(ios::scientific)<<setprecision(4)<<123.456789<<endl;cout<<setiosflags(ios::left)<<setfill('*')<<setw(8)<<123<<endl;cout<<resetiosflags(ios::left)<<setfill('#')<<setw(8)<<123<<endl;return0;}14例:定義一個(gè)最簡(jiǎn)單的日期類,僅包含數(shù)據(jù)成員。#include<iostream>usingnamespacestd;classDate{public: intyear,month,day;//公有成員};intmain(){

Datedate1,date2; //聲明2個(gè)日期對(duì)象

cin>>date1>>date2;

cout<<date1<<","<<date2<<endl; return0;}對(duì)象的輸入與輸出(1)×如何輸入、輸出對(duì)象?15例:定義簡(jiǎn)單的完整意義上的日期類。#include<iostream>usingnamespacestd;classDate{ intyear,month,day;//私有數(shù)據(jù)成員public: voidinput(); //公有成員函數(shù) voidprint_ymd();};voidDate::input()//輸入數(shù)據(jù){

cin>>year>>month>>day;}對(duì)象的輸入與輸出(2)16例:定義簡(jiǎn)單的完整意義上的日期類。

voidDate::print_ymd() //輸出年月日格式{

cout<<year<<"-"<<month<<"-"<<day<<endl;}intmain(){

Datedate1,date2;

date1.input(); //通過函數(shù)調(diào)用完成對(duì)象的輸入

date1.print_ymd();

//通過函數(shù)調(diào)用完成對(duì)象的輸出

date2.input(); date2.print_ymd(); return0;}對(duì)象的輸入與輸出(3)通過對(duì)象的成員函數(shù)調(diào)用實(shí)現(xiàn)對(duì)象的輸入輸出能通過輸入輸出運(yùn)算符輸入輸出對(duì)象嗎?17#include<iostream.h>classSample{ intx,y;public: Sample(intm=0,intn=0):x(m),y(n){} friendostream&operator<<(ostream&os,constSample&s); friendistream&operator>>(istream&is,Sample&s);};ostream&operator<<(ostream&os,constSample&s){ os<<"x="<<s.x<<",y="<<s.y<<endl; returnos;}istream&operator>>(istream&is,Sample&s){ cout<<"inputxy"<<endl; cout<<"x:";

is>>s.x; cout<<"y:";

is>>s.y; returnis;}voidmain(){ Samplea(1,2),b,c;//定義3個(gè)對(duì)象

cout<<"aobjectis:\n"; cout<<a; //相當(dāng)于:operator<<(cout,a); cin>>b>>c; //相當(dāng)于:operator(operator>>((cin,b),c) cout<<"bandcobjectsare:\n"; cout<<b<<c; //相當(dāng)于:operator(operator<<((cout,b),c)}對(duì)象的輸入與輸出(4)18文件的讀寫(1)數(shù)據(jù)在磁盤中是以文件的方式存放的,用文件名作為標(biāo)識(shí)。流式文件:無(wú)論文件的內(nèi)容是什么,一律把文件看成由字符(字節(jié))構(gòu)成的序列,即字符流。文件的讀(從文件讀到內(nèi)存)使用輸入流運(yùn)算符>>文件的寫(從內(nèi)存寫到文件)使用輸出流運(yùn)算符<<19文件的讀寫(2)文件中數(shù)據(jù)的存放形式:文本文件(ASCII文件):它的每一個(gè)字節(jié)存放一個(gè)ASCII碼,代表一個(gè)字符。二進(jìn)制文件:將數(shù)據(jù)用二進(jìn)制形式存放在文件中,并保持了數(shù)據(jù)在內(nèi)存中存放的原有格式。文件讀寫的操作方式順序文件操作從文件的第一個(gè)字符(字節(jié))開始順序地處理到文件的最后一個(gè)字符(字節(jié))。隨機(jī)文件操作在文件中通過C++相關(guān)的函數(shù)移動(dòng)文件指針,使其指向所要處理的字符(字節(jié))。20文件的讀寫(3)在C++中進(jìn)行文件操作(讀寫)的一般步驟:在程序中包含頭文件fstream.h創(chuàng)建一個(gè)I/O文件流(對(duì)象)將創(chuàng)建的流(對(duì)象)與文件相關(guān)聯(lián)(即打開文件)。如果文件不存在,則建立文件;如果文件已存在,則打開文件。進(jìn)行文件讀/寫操作關(guān)閉文件21文件的讀寫(4)C++有3種類型的文件流(類):輸入文件流ifstream輸出文件流ofstream輸入輸出文件流fstream 這些文件流都定義在fstream.h文件中或名字空間std的文件fstream中22文件的讀寫(5)打開文件使用open()函數(shù)可以打開文件,也就是使某一文件與上面的某一流對(duì)象相關(guān)聯(lián)。open()函數(shù)是3個(gè)流類的成員函數(shù),其原型定義在fstream.h中。open函數(shù)原型: voidopen(constchar*filename,intmode);關(guān)閉文件使用close()函數(shù)關(guān)閉文件,也就是斷開流與文件的鏈接。23文件的讀寫(7)例如: ofstreamout; out.open("test.txt");

out.close(); ifstreamin; in.open("test.txt"); in.close();ifstream、ofstream、fstream都有能夠自動(dòng)打開文件的構(gòu)造函數(shù) 最常見的文件打開方式: ofstreamout("test.txt");

out.close(); ifstreamin("test.txt"); in.close();//創(chuàng)建一個(gè)輸出流對(duì)象//打開文件test.txt,使其與上面輸出流關(guān)聯(lián)//關(guān)閉文件test.txt,斷開其與輸出流的聯(lián)系//創(chuàng)建一個(gè)輸出流,并使文件與其關(guān)聯(lián)24文件的讀寫(6)文件(位置)指針存放文件讀寫位置的變量。文件開始位置指針值為0,每次讀寫之后,自動(dòng)將文件指針的值加上本次讀寫的字節(jié)數(shù),作為下次讀寫的位置。只有在打開文件后,才能對(duì)文件進(jìn)行讀寫操作在使用文件之前,必須進(jìn)行檢測(cè),以確認(rèn)打開一個(gè)文件是否成功例如:if(!out){ cout<<"Cannotopenfile!\n"; //錯(cuò)誤處理代碼}25順序文件——文本文件的寫(1)例:創(chuàng)建一個(gè)名為“grade1”的文本文件,并寫入3門課程的名字和成績(jī)(無(wú)格式寫)。#include<iostream>#include<fstream>usingnamespacestd;intmain(){ ofstreamout;//定義輸出流對(duì)象

out.open("grade1.txt");//通過打開函數(shù)將輸出流對(duì)象與文件相連 if(!out) { cout<<"Cannotopenthefile."<<endl; return1; }

out<<"C++"<<""<<89.5<<endl;//依次寫數(shù)據(jù)到文件中

out<<"English"<<""<<93.5<<endl;

out<<"Maths"<<""<<87<<endl;

out.close();//關(guān)閉文件 return0;}26順序文件——文本文件的寫(2)例:創(chuàng)建一個(gè)名為“grade1”的文本文件,并寫入3門課程的名字和成績(jī)(帶格式寫)。#include<iostream>#include<fstream>#include<iomanip>usingnamespacestd;intmain(){

ofstreamout("grade1.txt");//定義輸出流對(duì)象與文件相連

if(!out) { cout<<"Cannotopenthefile."<<endl; return1; }

out<<setiosflags(ios::left);

out<<setw(10)<<"C++"<<89.5<<endl;//依次寫數(shù)據(jù)到文件中

out<<setw(10)<<"English"<<93.5<<endl;

out<<setw(10)<<"Maths"<<87<<endl;

out.close();//關(guān)閉文件

return0;}27順序文件——文本文件的讀(1)例:讀取上例創(chuàng)建的“grade1.txt”文件,并將文件內(nèi)容顯示在屏幕上。#include<iostream>#include<fstream>usingnamespacestd;intmain(){ ifstreamin("grade1.txt");//定義輸入流對(duì)象與文件相連 if(!in){ cout<<"Cannotopenthefile.\n"; return1; } charcourse[20]; floatgrade;

in>>course>>grade;//依次讀出數(shù)據(jù) cout<<course<<""<<grade<<"\n";

in>>course>>grade; cout<<course<<""<<grade<<"\n";

in>>course>>grade; cout<<course<<""<<grade<<"\n";

in.close();//關(guān)閉文件 return0;}28輸入輸出流的成員函數(shù)(1)輸入輸出流除了open(),close()這些成員函數(shù)外,還有其他成員函數(shù)get()put()ignore()putback()peek()read()write()…29輸入輸出流的成員函數(shù)(2)#include<iostream>usingnamespacestd;voidmain(){ constintSIZE=80; charch1,ch2,buffer1[SIZE],buffer2[SIZE]; cout<<"Enterasentence:\n"; cin>>buffer1; cout<<"Thestringreadwithcinis:\n"<<buffer1;

cin.ignore();//從輸入流中忽略一個(gè)字符

cin.read(buffer1,3);//從輸入流中讀入三個(gè)字符到buffer1中 cout<<"\nTheresultofcin.read()is:\n";

cout.write(buffer1,3);//將buffer1中的三個(gè)字符寫到輸出流中(屏幕上)

cin.ignore();//忽略一個(gè)字符 cout<<"\nTheresultofcin.get()is:\n"; ch1=cin.get();//從輸入流中讀入一個(gè)字符

cout.put(ch1);//寫出一個(gè)字符到輸出流中

cin.putback(ch1);//放回一個(gè)字符到輸入流中 cout<<"\nputbackandpeek():"<<cin.peek()<<""<<char(cin.peek());//從輸入流得到一個(gè)字符

cin.get(ch2);//從輸入流中讀入一個(gè)字符到ch2中 cout<<"\nTheresultofcin.get(ch2)is:\n"<<ch2;

cin.get(buffer2,SIZE);//從輸入流中讀入SIZE個(gè)字符到buffer2中 cout<<"\nThestringreadwithcin.get(buffer2,SIZE)is:\n"<<buffer2<<endl;}30綜合練習(xí)例:創(chuàng)建一個(gè)名為“grade1”的文本文件,完成:寫入3門課程的名字和成績(jī);將文件中成績(jī)大于90分的課程名和成績(jī)輸出在顯示屏上;輸入課程名在文件中查找,如果找到將查找到的課程名與成績(jī)顯示出來(lái),如果沒有找到給出相應(yīng)的信息。31綜合練習(xí)(續(xù))#include<iostream>#include<fstream>usingnamespacestd;intmain(){ ofstreamout("grade1.tx

溫馨提示

  • 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫(kù)網(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ì)自己和他人造成任何形式的傷害或損失。

評(píng)論

0/150

提交評(píng)論