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

下載本文檔

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

文檔簡介

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

名說

明需要包含的頭文件ios流基類,是抽象類iostreamistream輸入流類的基類iostreamifstream輸入文件流類fstreamostream輸出流類的基類iostreamofstream輸出文件流類fstreamiostreamI/O流類的基類iostreamfstreamI/O文件流類fstream6流類庫(3)預定義的流對象cin是istream流類的一個對象,用于處理標準輸入設備的輸入cout、cerr、clog都是ostream流類的對象cout用于處理標準輸出設備的輸出cerr和clog均可用于處理標準出錯信息,不同之處在于cerr輸出不帶緩沖功能,clog輸出具有緩沖功能在缺省情況下,指定的標準輸出設備是顯示屏,標準輸入設備是鍵盤。在任何情況下,指定的標準錯誤輸出設備總是顯示屏。7預定義類型的輸入輸出預定義類型的輸入輸出指預定義類型數(shù)據(jù)對于標準輸入輸出設備的輸入輸出。預定義類型的輸入輸出分為無格式輸入輸出格式化輸入輸出兩個相關(guān)運算(運算符重載)提取運算:從流中獲取數(shù)據(jù)的操作稱為提取運算(>>)——輸入流插入運算:向流中添加數(shù)據(jù)的操作稱為插入運算(<<)——輸出流8無格式輸入輸出無格式(默認格式)輸入輸出使用兩個流對象cin和cout,和與之相配套的兩個運算符“>>”和“<<”,即輸入流對象cin和輸出流對象cout對運算符“>>”和“<<”重載函數(shù)的調(diào)用。例如:cin>>變量;//輸入cout<<表達式;//輸出它們可分別被解釋為:cin.operator>>(變量);cout.operator<<(表達式);僅依靠默認的格式不能滿足實際需要,如設定輸出項的寬度、浮點數(shù)的精度以及對齊方式等等。9格式化輸入輸出C++提供了兩種格式的控制方法:使用ios類中有關(guān)格式控制的成員函數(shù)進行格式控制使用流操作算子(特殊函數(shù))進行格式控制10成員函數(shù)格式控制(1)使用ios類中有關(guān)格式控制的成員函數(shù)進行格式控制控制輸入輸出格式的成員函數(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);設置狀態(tài)標志flags清除狀態(tài)標志,并返回以前的狀態(tài)標志返回當前狀態(tài)標志設置標志flags,返回以前的狀態(tài)標志返回當前的寬度設置值設置域?qū)抴,返回以前的域?qū)捲O置小數(shù)精度p,返回以前的小數(shù)位數(shù)返回當前的填充字符設置填充字符ch,返回以前的填充字符狀態(tài)標志flags及其含義如書上表14-1所示設置多項狀態(tài)標志中間用“|”運算符分隔:狀態(tài)標志1|狀態(tài)標志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++流操作算子包括無參函數(shù)——定義在頭文件iostream.h有參函數(shù)——定義在頭文件iomanip.h流操作算子可以用在提取運算符“>>”或插入運算符“<<”后面來設定輸入輸出格式,是I/O表達式的一部分。流操作算子如書上表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例:定義一個最簡單的日期類,僅包含數(shù)據(jù)成員。#include<iostream>usingnamespacestd;classDate{public: intyear,month,day;//公有成員};intmain(){

Datedate1,date2; //聲明2個日期對象

cin>>date1>>date2;

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

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

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

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

Datedate1,date2;

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

date1.print_ymd();

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

date2.input(); date2.print_ymd(); return0;}對象的輸入與輸出(3)通過對象的成員函數(shù)調(diào)用實現(xiàn)對象的輸入輸出能通過輸入輸出運算符輸入輸出對象嗎?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個對象

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

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

out.open("grade1.txt");//通過打開函數(shù)將輸出流對象與文件相連 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)建一個名為“grade1”的文本文件,并寫入3門課程的名字和成績(帶格式寫)。#include<iostream>#include<fstream>#include<iomanip>usingnamespacestd;intmain(){

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

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");//定義輸入流對象與文件相連 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();//從輸入流中忽略一個字符

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

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

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

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

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

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

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

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責。
  • 6. 下載文件中如有侵權(quán)或不適當內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論