版權(quán)說(shuō)明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
項(xiàng)目六任務(wù)一
學(xué)習(xí)輸入/輸出的基礎(chǔ)知識(shí)任務(wù)二
學(xué)習(xí)文件流的相關(guān)知識(shí)輸入/輸出流
傳送數(shù)據(jù)的通道任務(wù)說(shuō)明預(yù)備知識(shí)任務(wù)一
學(xué)習(xí)輸入/輸出的基礎(chǔ)知識(shí)在本任務(wù)中,我們先來(lái)學(xué)習(xí)輸入/輸出的基礎(chǔ)知識(shí)。一、關(guān)于輸入/輸出的基本概念二、標(biāo)準(zhǔn)輸入/輸出流一、關(guān)于輸入/輸出的基本概念C++不僅完全支持C的輸入/輸出系統(tǒng),它還提供了自己的輸入/輸出系統(tǒng),C++的輸入/輸出系統(tǒng)是以流的形式實(shí)現(xiàn)的。(一)流與緩沖區(qū)所謂流是指一連串連續(xù)不斷的數(shù)據(jù)集合。C++的輸入/輸出流是由若干字節(jié)組成的字節(jié)序列,從輸入設(shè)備流向內(nèi)存的流為輸入流,從內(nèi)存流向輸出設(shè)備的流為輸出流。流中的內(nèi)容可以是ASCII字符、二進(jìn)制形式的數(shù)據(jù)、圖形圖像、數(shù)字音頻視頻或其他形式的信息。系統(tǒng)在內(nèi)存中為每一個(gè)數(shù)據(jù)信息流開辟一個(gè)內(nèi)存緩沖區(qū),用來(lái)存放流中的數(shù)據(jù)。在輸入時(shí),從鍵盤輸入的數(shù)據(jù)先存放在鍵盤緩沖區(qū)中,按回車鍵后,數(shù)據(jù)從鍵盤緩沖區(qū)傳送到程序的輸入緩沖區(qū),然后用提取運(yùn)算符“>>”從輸入緩沖區(qū)內(nèi)提取數(shù)據(jù)送給程序中的有關(guān)變量。在輸出時(shí),先將數(shù)據(jù)送到程序的輸出緩沖區(qū)保存,直到緩沖區(qū)滿或遇到endl,用插入運(yùn)算符“<<”將輸出緩沖區(qū)內(nèi)全部數(shù)據(jù)送到顯示器顯示出來(lái)。數(shù)據(jù)流輸入/輸出過(guò)程如圖所示。(二)輸入/輸出流類C++編譯系統(tǒng)提供了用于輸入/輸出的iostream類庫(kù),其中包含了許多用于輸入/輸出的類和流類,可以實(shí)現(xiàn)不同的功能。I/O類庫(kù)中的常用流類如表所示。ios是流類庫(kù)的虛基類,由它派生出istream類和ostream類,istream類和ostream類通過(guò)多重繼承又派生出iostream類。istream類提供輸入操作,ostream提供輸出操作,iostream類提供輸入和輸出操作。其繼承層次關(guān)系如圖所示。由于不同類的聲明被放在不同的頭文件中,因此,用戶在程序中使用這些類時(shí),需要用#include命令將有關(guān)的頭文件包含進(jìn)來(lái)。常用的頭文件有:iostream:包含對(duì)輸入/輸出流進(jìn)行操作所需的基本信息,定義的類有ios,istream,ostream,iostream,istream_withassign,ostream_withassign,iostream_witassgin等。fstream:用于文件流的I/O操作。strstream:用于字符串流的I/O操作。stdio:定義輸入/輸出函數(shù)。iomanip:用于對(duì)I/O流進(jìn)行格式控制。二、標(biāo)準(zhǔn)輸入/輸出流C++的輸入/輸出流庫(kù)中定義了4個(gè)標(biāo)準(zhǔn)流對(duì)象,如表所示。(一)標(biāo)準(zhǔn)輸入流對(duì)象cincin是istream的派生類istream_withassign的對(duì)象,它從標(biāo)準(zhǔn)輸入設(shè)備(鍵盤)獲取數(shù)據(jù),稱為標(biāo)準(zhǔn)輸入流。程序中的變量通過(guò)流提取運(yùn)算符“>>”從流中提取數(shù)據(jù)。對(duì)于cin,有以下幾點(diǎn)說(shuō)明:(1)只有在按回車鍵后,當(dāng)前行數(shù)據(jù)才會(huì)被送入鍵盤緩沖區(qū),形成輸入流,提取運(yùn)算符“>>”才會(huì)從中提取出數(shù)據(jù)。(2)使用“>>”提取數(shù)據(jù)時(shí),系統(tǒng)會(huì)跳過(guò)輸入流中的空格、制表符、換行符等空白字符,然后讀入后面的與變量類型相對(duì)應(yīng)的值。因此,給一組變量輸入值時(shí),可用空格或換行符將鍵入的數(shù)據(jù)間隔開。例如:intx1;floatx2;cin>>x1>>x2;輸入數(shù)據(jù)時(shí)可采用如下幾種方式:2356.9(使用空格分隔數(shù)據(jù))或23 56.9(使用制表符分隔數(shù)據(jù))或2356.9(通過(guò)按回車鍵換行分隔數(shù)據(jù))(3)輸入字符串(即類型為字符數(shù)組或字符指針變量)時(shí),提取運(yùn)算符“>>”將跳過(guò)空白符,然后讀入非空白字符,并且直到遇到另一空白符為止。讀取結(jié)束后,系統(tǒng)會(huì)在字符串的串尾放一個(gè)字符串結(jié)束標(biāo)志’\0’。例如:charstr[50];char*str1=str;cin>>str1;當(dāng)鍵入的字符串為:Areyouready?則str1中的字符串為“Are”,后面的內(nèi)容均被忽略。(4)輸入數(shù)據(jù)時(shí),系統(tǒng)除了會(huì)檢查空白符外,還會(huì)檢查輸入數(shù)據(jù)與變量的匹配情況。例如,對(duì)于語(yǔ)句:cin>>i>>x; //i為int型,x為float型若從鍵盤輸入:56.7832.8得到的結(jié)果為:i=56x=0.78(二)輸入流的成員函數(shù)在C++中,除了可以用cin流輸入標(biāo)準(zhǔn)類型的數(shù)據(jù)外,還可以用流的成員函數(shù)實(shí)現(xiàn)字符的輸入。下面簡(jiǎn)單介紹幾個(gè)常用的成員函數(shù)。1.get函數(shù)get函數(shù)有3種形式:①不帶參數(shù)的get函數(shù)調(diào)用形式為:cin.get();其作用是從輸入流中提取一個(gè)字符(包括空白字符),并返回讀入的字符。當(dāng)遇到輸入流中的文件結(jié)束符時(shí),返回文件結(jié)束標(biāo)志EOF(EOF是在iostream頭文件中定義的符號(hào)常量,一般用-1表示)?!纠?-1】
不帶參數(shù)的get函數(shù)的應(yīng)用示例。#include<iostream.h>voidmain(){charch;cout<<"EOF="<<EOF<<endl;cout<<"請(qǐng)輸入一串字符:";while((ch=cin.get())!=EOF) //循環(huán)讀取字符,直至換行后按【Ctrl+Z】組合鍵和回車鍵cout<<ch;}程序運(yùn)行結(jié)果如圖所示。②有一個(gè)參數(shù)的get函數(shù)調(diào)用形式為:cin.get(ch);其作用是從輸入流中讀取一個(gè)字符,并存入字符變量ch。若讀取成功則返回非0值,否則返回0(遇到文件結(jié)束符EOF)。通常將其作為循環(huán)語(yǔ)句的判斷條件,例如:#include<iostream.h>voidmain(){charch;cout<<"請(qǐng)輸入一串字符:";while(cin.get(ch))//get函數(shù)作循環(huán)條件,若讀取成功則執(zhí)行循環(huán)cout<<ch;}程序運(yùn)行結(jié)果如圖所示?!纠?-2】
有一個(gè)參數(shù)的get函數(shù)應(yīng)用示例。將【例6-1】作如下修改。③有3個(gè)參數(shù)的get函數(shù)調(diào)用形式為:cin.get(字符數(shù)組(或字符指針),字符個(gè)數(shù)n,終止字符);其作用是從輸入流中讀取字符直到終止字符或者讀取n-1個(gè)字符,賦給指定字符數(shù)組(或字符指針指向的數(shù)組)。若讀取成功則返回非0值,否則返回0。例如:charch[14];cin.get(ch,5,'\n');此時(shí)若輸入abcdefg,則輸出結(jié)果為abcd。【例6-3】
有3個(gè)參數(shù)的get函數(shù)應(yīng)用示例。#include<iostream.h>voidmain(){chararr[28];cout<<"請(qǐng)輸入一串字符:";cin.get(arr,18,'\n');//讀取輸入字符串的前17個(gè)字符,或者讀到結(jié)束標(biāo)志cout<<arr<<endl;}程序運(yùn)行結(jié)果如圖所示。2.getline函數(shù)調(diào)用getline函數(shù)的一般形式為:cin.getline(字符數(shù)組(或字符指針),字符個(gè)數(shù)n,終止標(biāo)志字符)其作用與帶3個(gè)參數(shù)的get函數(shù)類似,即從輸入流中讀取字符直到終止字符或者讀取n-1個(gè)字符,賦給指定字符數(shù)組(或字符指針指向的數(shù)組)。【例6-4】getline函數(shù)應(yīng)用示例。#include<iostream.h>voidmain(){charch0[30],ch1[30],ch2[40];cout<<"請(qǐng)輸入第一個(gè)字符串:";cin>>ch0; //第一個(gè)輸入語(yǔ)句cout<<"請(qǐng)輸入第二個(gè)字符串:";cin.getline(ch1,30); //第二個(gè)輸入語(yǔ)句cout<<"請(qǐng)輸入第三個(gè)字符串:";cin.getline(ch2,40,'*'); //第三個(gè)輸入語(yǔ)句cout<<"在屏幕上分別顯示輸入的三個(gè)字符串:"<<endl;cout<<"第一個(gè):"<<ch0<<endl;cout<<"第二個(gè):"<<ch1<<endl;cout<<"第三個(gè):"<<ch2<<endl;cout<<"程序結(jié)束"<<endl;}程序運(yùn)行結(jié)果如圖所示。(三)標(biāo)準(zhǔn)輸出流對(duì)象標(biāo)準(zhǔn)輸出流是從內(nèi)存流向標(biāo)準(zhǔn)輸出設(shè)備(顯示器)的數(shù)據(jù)流。預(yù)定義標(biāo)準(zhǔn)輸出流對(duì)象主要包括cout、cerr和clog。1.cout流cout是ostream的派生類ostream_withassign的對(duì)象,它向標(biāo)準(zhǔn)輸出設(shè)備(終端顯示器)輸出數(shù)據(jù),稱為標(biāo)準(zhǔn)輸出流。程序中的變量通過(guò)流插入運(yùn)算符“<<”向cout流中順序插入數(shù)據(jù)。cout流在內(nèi)存中開辟了一個(gè)輸出緩沖區(qū),用于存放cout流中的數(shù)據(jù)。當(dāng)向流中插入一個(gè)endl時(shí),不論緩沖區(qū)是否已滿,均立即輸出流中所有數(shù)據(jù),然后插入一個(gè)換行符,并清空緩沖區(qū)。如果插入一個(gè)換行符'\n',則只輸出并換行,不清空緩沖區(qū)。2.cerr流cerr向標(biāo)準(zhǔn)出錯(cuò)設(shè)備(顯示器)輸出有關(guān)出錯(cuò)信息,稱為標(biāo)準(zhǔn)出錯(cuò)流。cerr與cout的作用和用法類似,不同的是cout流可以傳送到顯示器輸出,也可以被重定向輸出到磁盤文件,而cerr流只能在顯示器輸出。3.clog流clog流也是標(biāo)準(zhǔn)出錯(cuò)流,其作用與cerr相同,都是向顯示器輸出出錯(cuò)信息。它們的區(qū)別在于cerr沒有緩沖區(qū),它直接向顯示器輸出信息,而clog先將信息放入緩沖區(qū)中,當(dāng)緩沖區(qū)滿或遇到endl時(shí)再向顯示器輸出信息?!纠?-5】cout、cerr和clog流應(yīng)用示例。#include<iostream.h>#include<math.h>voidmain(){charch[10];inta,b;cin>>ch; //標(biāo)準(zhǔn)輸入流cout<<ch<<endl; //標(biāo)準(zhǔn)輸出流cin>>a>>b;if(a<b){cerr<<"cerr"<<endl; //標(biāo)準(zhǔn)出錯(cuò)流cerrclog<<"clog"<<endl; //標(biāo)準(zhǔn)出錯(cuò)流clog}}程序運(yùn)行結(jié)果如圖所示。4.輸出流的成員函數(shù)在程序中通常使用cout和插入運(yùn)算符“<<”實(shí)現(xiàn)輸出,有時(shí)需要輸出單個(gè)字符也可以使用流成員函數(shù)put()。其調(diào)用形式為:cout.put(參數(shù));其中,參數(shù)可以是字符或字符的ASCII碼值。例如:cout.put('D');//在屏幕上輸出字母Dcout.put(68);//輸出ASCII碼為68的字符另外,也可以在一個(gè)語(yǔ)句中連續(xù)調(diào)用put函數(shù),實(shí)現(xiàn)字符串的輸出。例如:cout.put('D').put('a').put('n').put('c').put('e');輸出結(jié)果為Dance?!纠?-6】
輸出流的成員函數(shù)應(yīng)用示例。#include<iostream.h>voidmain(){charch[5];cin>>ch; //輸入一個(gè)字符數(shù)組for(inti=4;i>=0;i--) //從最后一個(gè)字符開始輸出cout.put(ch[i]);}程序運(yùn)行結(jié)果如圖所示。(四)輸入/輸出的格式控制在編寫程序時(shí),有時(shí)會(huì)要求按照指定的格式輸入數(shù)據(jù)或輸出結(jié)果,此時(shí)可以使用格式控制符或流對(duì)象的有關(guān)格式控制的成員函數(shù)來(lái)實(shí)現(xiàn)。1.使用格式控制符進(jìn)行格式控制C++中的格式控制符如表所示,它們可以被嵌入到輸入/輸出語(yǔ)句中控制輸入/輸出的格式?!纠?-7】
格式控制符應(yīng)用示例。#include<iostream>#include<iomanip>usingnamespacestd;voidmain(){inta;cout<<"請(qǐng)輸入一個(gè)整型數(shù)據(jù):";cin>>a;cout<<"十六進(jìn)制輸出:"<<hex<<a<<endl; //十六進(jìn)制輸出cout<<"八進(jìn)制輸出:"<<setbase(8)<<a<<endl; //八進(jìn)制輸出cout<<setfill('*')<<setw(10)<<dec<<a<<endl; /*十進(jìn)制輸出,寬度為10,不滿的填充字符**/cout<<setiosflags(ios::left)<<setw(10)<<a<<endl; //以后的數(shù)據(jù)輸出都會(huì)左對(duì)齊doubled;cout<<"請(qǐng)輸入一個(gè)浮點(diǎn)數(shù)據(jù):";cin>>d;cout<<d<<endl; //默認(rèn)輸出小數(shù)為6位cout<<setprecision(9); //設(shè)置浮點(diǎn)數(shù)位數(shù)為9位cout<<d<<endl; cout<<setiosflags(ios::scientific)<<d<<endl; //以科學(xué)計(jì)數(shù)法形式輸出cout<<resetiosflags(ios::scientific); //取消科學(xué)計(jì)數(shù)法格式設(shè)置cout<<d<<endl;char*str="WelcometoC++";cout<<setw(20)<<str<<endl;//輸出20位,左對(duì)齊,不滿的填充字符*}程序運(yùn)行結(jié)果如圖所示。2.使用成員函數(shù)進(jìn)行格式控制通過(guò)調(diào)用流對(duì)象cout中有關(guān)格式控制的成員函數(shù)也可以控制輸出格式,用于格式控制的常用成員函數(shù)如表所示。格式標(biāo)志在類ios中被定義為枚舉值,因此在引用它們時(shí)需要在前面加上類名ios和作用域限定符“::”。常用的格式標(biāo)志如下頁(yè)表所示?!纠?-8】
使用成員函數(shù)進(jìn)行格式控制的應(yīng)用示例。#include<iostream.h>voidmain(){cout.fill('*'); //設(shè)置填充字符為*cout.width(10); //設(shè)置顯示寬度為10cout<<255<<endl;cout.unsetf(ios::dec); //取消十進(jìn)制顯示cout.setf(ios::hex); //設(shè)置十六進(jìn)制顯示cout<<255<<endl;cout.unsetf(ios::hex); //取消十六進(jìn)制顯示cout.setf(ios::left); //左對(duì)齊顯示數(shù)據(jù)cout<<255<<endl;cout.unsetf(ios::left); //取消左對(duì)齊顯示cout.width(10); //設(shè)置顯示寬度為10cout.setf(ios::showpos); //輸出正數(shù)時(shí)顯示“+”號(hào)cout.setf(ios::internal); //左顯示符號(hào),中間填充字符,右顯示數(shù)據(jù)cout<<255<<endl;cout.unsetf(ios::showpos); //取消顯示“+”號(hào)cout<<123.456782<<endl; //默認(rèn)顯示精度為6cout.precision(8); //設(shè)置輸出精度為8cout<<123.456782<<endl;cout.setf(ios::scientific); //將數(shù)據(jù)按科學(xué)計(jì)數(shù)法輸出cout.precision(6); //表示小數(shù)點(diǎn)后數(shù)字位數(shù)為6cout<<123.456782<<endl;cout.unsetf(ios::scientific); //取消科學(xué)計(jì)數(shù)法輸出cout.setf(ios::fixed); //將數(shù)據(jù)按定點(diǎn)小數(shù)輸出cout<<123.4567<<endl;}程序運(yùn)行結(jié)果如圖所示。(五)流運(yùn)算符的重載流插入運(yùn)算符“<<”和流提取運(yùn)算符“>>”是C++在類庫(kù)中提供的,在頭文件“iostream.h”中已經(jīng)對(duì)其進(jìn)行了重載,使之能用來(lái)輸出和輸入C++標(biāo)準(zhǔn)類型的數(shù)據(jù)。而用戶自定義類型的數(shù)據(jù),是不能直接用“<<”和“>>”來(lái)輸出和輸入的。要想使用它們輸出和輸入自定義類型的數(shù)據(jù),必須對(duì)它們重載。流插入運(yùn)算符重載的一般形式為:ostream&operator<<(ostream&形參1,自定義類型&形參2)流提取運(yùn)算符重載的一般形式為:istream&operator>>(istream&形參1,自定義類型&形參2)【例6-9】
重載流運(yùn)算符“<<”和“>>”應(yīng)用示例。#include<iostream.h>classComplex{public:Complex();friendostream&operator<<(ostream&out,Complex&c);//聲明流插入運(yùn)算符“<<”重載函數(shù)friendistream&operator>>(istream&in,Complex&c);//聲明流提取運(yùn)算符“>>”重載函數(shù)private:doublereal; //實(shí)部doubleimag; //虛部};
Complex::Complex(){real=0;imag=0;}ostream&operator<<(ostream&out,Complex&c) //定義重載運(yùn)算符“<<”函數(shù){out<<c.real<<"+"<<c.imag<<"i";returnout;}istream&operator>>(istream&in,Complex&c) //定義重載運(yùn)算符“>>”函數(shù){cout<<"實(shí)部:";in>>c.real;cout<<"虛部:";in>>c.imag;returnin;}voidmain(){Complexm,n;cout<<"請(qǐng)分別輸入兩個(gè)復(fù)數(shù)"<<endl;cin>>m>>n;cout<<"復(fù)數(shù)1為:";cout<<m<<endl;cout<<"復(fù)數(shù)2為:"<<n<<endl;}程序運(yùn)行結(jié)果如圖所示。任務(wù)實(shí)施——求解一元二次方程案例說(shuō)明案例分析首先,根據(jù)a和b2-4ac的值判斷該一元二次方程是否有解,若有解,則根據(jù)通解公式求出兩個(gè)根并輸出;若無(wú)解,則輸出出錯(cuò)信息。實(shí)施步驟步驟1在VisualC++中新建一個(gè)C++源文件,根據(jù)分析編寫代碼如下:#include<iostream.h>#include<math.h>intmain(){floata,b,c,disc;for(inti=0;i<3;i++){cout<<"pleaseinputa,b,c:";cin>>a>>b>>c;if(a==0)cerr<<"acannotbezero!"<<endl; //將出錯(cuò)信息插入cerr流,在屏幕上輸出elseif((disc=b*b-4*a*c)<0)cerr<<"b*b-4*a*ccannotbesmallerthanzero,nosolution!"<<endl;else{cout<<"x1="<<(-b+sqrt(disc))/(2*a)<<endl;cout<<"x2="<<(-b-sqrt(disc))/(2*a)<<endl;}}return0;}步驟2程序運(yùn)行結(jié)果如圖所示。任務(wù)二
學(xué)習(xí)文件流的相關(guān)知識(shí)任務(wù)說(shuō)明文件是程序設(shè)計(jì)中的一個(gè)重要概念。所謂文件,通常是指存儲(chǔ)在外部介質(zhì)上的數(shù)據(jù)集合。例如,人們經(jīng)常使用的Word文檔、圖片、應(yīng)用程序等都是文件。預(yù)備知識(shí)一、文件的特點(diǎn)二、文件流類和流對(duì)象三、文件的打開與關(guān)閉四、文件的讀寫操作五、文件指針的使用一、文件的特點(diǎn)根據(jù)文件中數(shù)據(jù)的組織形式不同,文件可分為ASCII文件和二進(jìn)制文件。ASCII文件又稱文本文件或字符文件,它的每個(gè)字節(jié)放一個(gè)ASCII代碼,表示一個(gè)字符。二進(jìn)制文件又稱內(nèi)部格式文件或字節(jié)文件,它是將數(shù)據(jù)按照其在內(nèi)存中的存儲(chǔ)形式原樣輸出到磁盤上存放。對(duì)于字符數(shù)據(jù),由于它在內(nèi)存中是以ASCII碼形式存放的,因此無(wú)論是以ASCII文件輸出還是二進(jìn)制文件輸出,其數(shù)據(jù)形式是一樣的。但對(duì)于數(shù)值數(shù)據(jù),二者的輸出是不同的,如圖所示。二、文件流類和流對(duì)象文件流是以磁盤文件為輸入/輸出對(duì)象的數(shù)據(jù)流。輸入文件流是從磁盤文件流向內(nèi)存的數(shù)據(jù),輸出文件流是由內(nèi)存流向磁盤文件的數(shù)據(jù),每個(gè)文件流都有一個(gè)內(nèi)存緩沖區(qū)與之對(duì)應(yīng)。下圖形象地表示了文件流的輸入和輸出。C++中提供了ifstream、ofstream和fstream三個(gè)文件流類,用來(lái)處理磁盤文件的輸入/輸出操作,它們的功能如下:ifstream:輸入流類,由istream派生來(lái),用于從磁盤文件輸入數(shù)據(jù)。ofstream:輸出流類,由ostream派生來(lái),用于向磁盤文件輸出數(shù)據(jù)。fstream:輸入/輸出流類,由iostream派生來(lái),用于磁盤文件的輸入/輸出。三、文件的打開與關(guān)閉在進(jìn)行文件的讀寫操作之前,需要為文件流對(duì)象和目標(biāo)磁盤文件建立關(guān)聯(lián),使文件流流向指定的磁盤文件,并指定文件的工作方式,即打開文件。操作文件結(jié)束后,必須關(guān)閉文件,即將文件流與磁盤文件的關(guān)聯(lián)斷開,否則可能導(dǎo)致數(shù)據(jù)丟失。1.文件的打開方法在C++中,可以調(diào)用文件流的成員函數(shù)open()實(shí)現(xiàn)文件的打開,它定義在頭文件fstream中,原型為:voidopen(constchar*,intopen_mode,intaccess=filebuf::openprot);其中,第一個(gè)參數(shù)為將要打開的文件路徑和文件名;第二個(gè)參數(shù)指定文件打開的方式(輸入/輸出方式);第三個(gè)參數(shù)指定文件的訪問(wèn)方式,默認(rèn)為filebuf::openprot(以共享/保護(hù)打開文件)。其調(diào)用的一般形式為:文件流對(duì)象.open(文件名,輸入/輸出方式);例如:ofstreamout; //定義ofstream類對(duì)象outout.open("outfile.txt",ios::out);/*打開磁盤文件outfile.txt,并指定它為輸出文件,文件流對(duì)象out將向磁盤文件outfile.txt輸出數(shù)據(jù)*/輸入/輸出方式是在基類ios類中定義的枚舉常量。表中給出了文件輸入/輸出方式的設(shè)置值。在C++中,還可以用構(gòu)造函數(shù)打開文件,即在聲明文件流類時(shí)定義帶參數(shù)的構(gòu)造函數(shù)。例如:ostreamout("outfile.txt",ios::out);2.文件的關(guān)閉方法要關(guān)閉文件,可以調(diào)用文件流的成員函數(shù)close(),其調(diào)用形式為:文件流對(duì)象名.close();關(guān)閉了該磁盤文件之后,才可以將文件流與其他磁盤文件建立關(guān)聯(lián),對(duì)新的文件進(jìn)行輸入/輸出。例如:ofstreamout; //建立輸出流對(duì)象out.open("outfile.txt",ios::out); //輸出文件流與outfile.txt建立關(guān)聯(lián)out.close(); //將輸出文件流所關(guān)聯(lián)的磁盤文件關(guān)閉out.open("outfile_another.txt",ios::out); //輸出文件流與outfile_another.txt建立關(guān)聯(lián)【例6-10】
文件的打開與關(guān)閉應(yīng)用示例。假設(shè)當(dāng)前目錄下存在文件“aa.txt”,打開該文件并進(jìn)行讀寫操作,操作完后關(guān)閉該文件。#include<fstream.h>voidmain(){ofstreamout; //創(chuàng)建輸出流對(duì)象out.open("aa.txt",ios::nocreate); //打開文件if(!out) //打開失敗cout<<"文件不存在,打開失?。?<<endl;else //打開成功{cout<<"文件已打開,可以進(jìn)行讀寫操作!"<<endl;out<<"HelloWorld!“;}out.close(); //關(guān)閉文件cout<<"文件已關(guān)閉!"<<endl;}程序運(yùn)行結(jié)果如圖所示。四、文件的讀寫操作1.對(duì)ASCII文件的操作對(duì)于ASCII文件,可以通過(guò)文件流對(duì)象和流插入運(yùn)算符“<<”及流提取運(yùn)算符“>>”實(shí)現(xiàn)對(duì)磁盤文件的讀寫,與cin和cout的使用方法相同。另外,使用前面介紹的的文件流的get()、getline()、put()等成員函數(shù)也可以實(shí)現(xiàn)字符的輸入/輸出?!纠?-11】ASCII文件操作應(yīng)用示例。將當(dāng)前目錄下源文件“a.txt”中的內(nèi)容輸出到目標(biāo)文件“b.txt”中。#include<iostream.h>#include<fstream.h>voidmain(){fstreaminf,ouf; //定義流對(duì)象charffn[20]="a.txt",dfn[20]="b.txt",ch[10]; //定義字符串變量存放文件名cout<<"源文件名:";cout<<ffn<<endl;cout<<"目標(biāo)文件名:";cout<<dfn<<endl;inf.open(ffn,ios::in); //以輸入的方式打開源文件if(!inf) //打開源文件失敗{cerr<<"打開文件a.txt失敗!"<<endl;return; }else //打開源文件成功{cout<<"打開文件a.txt成功!"<<endl;cout<<"可以對(duì)文件a.txt進(jìn)行讀操作!"<<endl;}ouf.open(dfn,ios::out); //以輸出的方式打開目標(biāo)文件for(inti=0;i<10;i++) {inf>>ch[i];//從源文件讀入10個(gè)字符順序存放在字符數(shù)組ch中ouf<<ch[i];//將字符數(shù)組ch中的10個(gè)字符寫入目標(biāo)文件中}inf.close(); //關(guān)閉源文件cout<<"關(guān)閉文件a.txt!"<<endl;ouf.close(); //關(guān)閉目標(biāo)文件cout<<"關(guān)閉文件b.txt!"<<endl;}程序運(yùn)行結(jié)果如圖所示。2.對(duì)二進(jìn)制文件的操作二進(jìn)制文件與ASCII文件存儲(chǔ)數(shù)據(jù)的方式有所不同,它將內(nèi)存中數(shù)據(jù)直接保存到磁盤文件中。由于文件中的信息以二進(jìn)制形式存儲(chǔ),故這種文件又稱字節(jié)文件。對(duì)二進(jìn)制文件進(jìn)行讀寫操作時(shí),需要首先在打開文件時(shí)用ios::binary指定以二進(jìn)制形式操作文件,然后可通過(guò)使用istream類的成員函數(shù)read()和ostream類的成員函數(shù)write()具體實(shí)現(xiàn)讀寫操作。其函數(shù)原型為:istream&read(char*buffer,intlen);ostream&write(constchar*buffer,intlen);
其中,第一個(gè)參數(shù)buffer指向內(nèi)存中存放數(shù)據(jù)的緩沖區(qū),第二個(gè)參數(shù)說(shuō)明要讀出或?qū)懭霐?shù)據(jù)的字節(jié)數(shù)。兩個(gè)函數(shù)的作用分別是:從流中讀出長(zhǎng)度為len的數(shù)據(jù)存入buffer指向的緩沖區(qū),從buffer所指向的緩沖區(qū)把長(zhǎng)度為len的數(shù)據(jù)寫到相應(yīng)的流中。其調(diào)用的一般形式為:輸入流對(duì)象名.read(指針變量名,讀寫的字節(jié)數(shù));輸出流對(duì)象名.write(指針變量名,讀寫的字節(jié)數(shù));
例如:istreaminf;inf.read(p1,20);表示從inf所關(guān)聯(lián)的文件中讀入20個(gè)字節(jié),存放在起始地址為p1的一段內(nèi)存中。ostreamouf;ouf.write(p2,sizeof(int));表示從起始地址為p2的緩沖區(qū)中,將長(zhǎng)度為sizeof(int),即4個(gè)字節(jié)的數(shù)據(jù),寫入到與ouf所關(guān)聯(lián)的文件中。【例6-12】
二進(jìn)制文件操作示例。將內(nèi)存中的數(shù)據(jù)以二進(jìn)制形式存入文件,然后從文件中讀出該數(shù)據(jù)并將其顯示在屏幕上。#include<iostream.h>#include<fstream.h>voidmain(){shorti=50;ofstreamouf("f:\\tmp.txt",ios::binary);//用構(gòu)造函數(shù)以二進(jìn)制形式打開輸出文件if(!ouf) //打開文件失敗{cerr<<"openerror!"<<endl;return;}ouf.write((char*)(&i),sizeof(i)); //以二進(jìn)制形式寫入iouf.close(); //關(guān)閉文件cout<<i<<endl;ifstreaminf; //創(chuàng)建輸入流文件inf.open("f:\\tmp.txt",ios::binary);//用成員函數(shù)以二進(jìn)制形式打開輸入文件程序運(yùn)行結(jié)果如圖所示。if(!inf) //打開文件失敗{ cerr<<"openerror!"<<endl;return;}shortk;inf.read((char*)(&k),sizeof(k)); //將文件中內(nèi)容讀入kinf.close(); //關(guān)閉文件cout<<k<<endl;}五、文件指針的使用前面介紹的對(duì)文件的讀寫操作,都是按一定順序?qū)ξ募械臄?shù)據(jù)逐個(gè)進(jìn)行訪問(wèn),稱為順序讀寫。但對(duì)于二進(jìn)制文件,C++還提供了文件的隨機(jī)讀寫。磁盤文件中有一個(gè)用來(lái)指示當(dāng)前位置的文件指針,每讀入一個(gè)字節(jié),指針就后移一個(gè)字節(jié)。通過(guò)對(duì)文件指針的控制,使用戶可以隨機(jī)訪問(wèn)二進(jìn)制文件中任意位置上的數(shù)據(jù)。與文件指針有關(guān)的成員函數(shù)如表所示。“文件中的位置”和“位移量”、“參照位置”均以字節(jié)為單位。其中,“文件中的位置”表示指針在文件中的位置,“參照位置”表示文件指針的起始位置,“位移量”表示相對(duì)于起始位置的位移量,用“+”和“-”表示指針的前后移動(dòng),省略時(shí)為向前移動(dòng)?!皡⒄瘴恢谩钡娜≈涤幸韵氯N:ios::beg:文件開頭,為默認(rèn)值ios::cur:指針當(dāng)前位置ios::end:文件末尾例如:ouf.seekp(-278);//輸出文件中的指針向后移到278字節(jié)位置inf.seekg(30,ios::cur); //輸入文件中指針從當(dāng)前位置前移30個(gè)字節(jié)inf.seekp(45,ios::end); //輸出文件中指針從文件末尾前移45個(gè)字節(jié)【例6-13】
文件指針應(yīng)用示例。二進(jìn)制文件的隨機(jī)讀寫。#include<iostream.h>#include<fstream.h>#include<string.h>voidmain(){fstreamfile("a.txt",ios::in|ios::out); //以輸入/輸出方式打開文件charstr[]="GoodMorning!";charch;file.write(str,strlen(str)); //將字符串寫入文件file.seekg(5,ios::beg); //指針從文件開頭前移5個(gè)字節(jié)while(!file.eof()) //讀取數(shù)據(jù),直至文件末尾{file.get(ch);cout<<ch;}cout<<endl;file.seekg(8); //指針移到絕對(duì)位置8字節(jié)處cout<<file.rdbuf()<<endl; //輸出當(dāng)前位置開始的字符file.close(); //關(guān)閉文件}程序運(yùn)行結(jié)果如圖所示。任務(wù)實(shí)施——三角函數(shù)值的寫入與讀出案例說(shuō)明編寫一個(gè)程序,創(chuàng)建一個(gè)結(jié)構(gòu)體類型,其成員為x、sin(x)、cos(x)和tan(x),其中x的取值為10、20…100,以二進(jìn)制形式將其存入磁盤文件中,然后再將其讀出并輸出到屏幕上,輸出時(shí)數(shù)據(jù)的寬度為10,并保持左對(duì)齊。案例分析首先設(shè)計(jì)結(jié)構(gòu)體類型,將數(shù)據(jù)存入定義的結(jié)構(gòu)體數(shù)組中。然后,以二進(jìn)制形式打開想要寫入數(shù)據(jù)的文件,將結(jié)構(gòu)體數(shù)組的值寫入,關(guān)閉文件。再次打開想要讀取數(shù)據(jù)的文件,將文件中的數(shù)據(jù)存入一個(gè)臨時(shí)結(jié)構(gòu)體數(shù)組中,最后使用標(biāo)準(zhǔn)輸出流對(duì)象將該結(jié)構(gòu)體數(shù)組中的數(shù)據(jù)成員向顯示器輸出,同時(shí)要使用格式控制符設(shè)置輸出數(shù)據(jù)的格式。實(shí)施步驟步驟1在VisualC++中新建一個(gè)C++源文件,根據(jù)分析編寫代碼如下:#include<iostream.h>#include<math.h>#include<fstream.h>#include<iomanip.h>structelem //定義結(jié)構(gòu)體{doublex;doubles;doublec;doublet;}test[10];intmain(){inti,n;for(i=10;i<=100;i+=10){n=i/10-1;test[n].x=i; test[n].s=sin(i); test[n].c=cos(i); test[n].t=tan(i);}ofstreamouf("data.txt",ios::out|ios::binary); //以二進(jìn)制輸出形式打開文件ouf.write((char*)&test,10*sizeof(elem)); //將test的值寫入文件ouf.close(); //關(guān)閉文件ifstreaminf; //創(chuàng)建輸入文件流對(duì)象inf.open("data.txt",ios::in|ios::binary);//以二進(jìn)制輸入形式打開文件if(!inf.is_open()) //打開文件失敗{cerr<<"Can'topendata.txt!"<<endl;return0;}elemtemp[10];cout.setf(ios::left); //設(shè)置左對(duì)齊輸出for(i=0;i<10;i++){inf.read((char*)&temp[i],sizeof(elem)); //將文件中的數(shù)據(jù)讀入temp中cout<<"x="<<temp[i].x //向顯示器輸出從文件中讀出的內(nèi)容<<"sin("<<temp[i].x<<")="<<setw(10)<<temp[i].s<<"cos("<<temp[i].x<<")="<<setw(10)<<temp[i].c<<“tan("<<temp[i].x<<")="<<setw(10)<<temp[i].t<<endl;}inf.close(); //關(guān)閉文件return0;}步驟2程序運(yùn)行結(jié)果如圖所示。項(xiàng)目拓展二進(jìn)制文件的應(yīng)用實(shí)例【例6-14】
二進(jìn)制文件應(yīng)用示例(一)。/*****************************************************************將用戶信息(姓名和年齡)寫入到二進(jìn)制文件inout_bifile.txt中*****************************************************************/#include<iostream.h>#include<fstream.h>intmain(){charfilename[81]; //用來(lái)存放指定的文件名intn; //用來(lái)存放用戶記錄的記錄號(hào)charname[20]; //用來(lái)存放用戶的姓名intage; //用來(lái)存放用戶的年齡charyes;//計(jì)算記錄大小,以便決定一條記錄在文件中占用的空間大小intrecsize=sizeof(name)+sizeof(int);cout<<"請(qǐng)?jiān)诖溯斎胛募拿?";cin>>filename; //輸入文件名稱,最大80個(gè)字符fstreamfbin(filename,ios::binary|ios::in|ios::
溫馨提示
- 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ì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 鄉(xiāng)村振興可行性研究報(bào)告(5篇)
- 結(jié)算協(xié)議書范本(10篇)
- 關(guān)于禮儀廣播稿(18篇)
- 體育營(yíng)銷與社會(huì)責(zé)任-洞察分析
- 《客服新人培訓(xùn)》課件
- 網(wǎng)絡(luò)擁塞緩解策略-洞察分析
- 水泥生產(chǎn)線能耗監(jiān)測(cè)-洞察分析
- 微生物酶催化合成研究-洞察分析
- 同學(xué)聚會(huì)策劃方案范文
- 無(wú)人駕駛汽車在物流配送中的應(yīng)用-洞察分析
- GB/T 45076-2024再生資源交易平臺(tái)建設(shè)規(guī)范
- 10.2《師說(shuō)》課件 2024-2025學(xué)年統(tǒng)編版高中語(yǔ)文必修上冊(cè)
- 2024年度企業(yè)重組與債務(wù)重組協(xié)議3篇
- 2024年01月11032成本管理期末試題答案
- 年高考新課標(biāo)I卷語(yǔ)文試題講評(píng)課件
- 2024年高中班主任德育工作計(jì)劃(5篇)
- 《三 采用合理的論證方法》教學(xué)設(shè)計(jì)統(tǒng)編版高中語(yǔ)文選擇性必修上冊(cè)
- 2024-2025學(xué)年語(yǔ)文二年級(jí)上冊(cè) 部編版期末測(cè)試卷 (含答案)
- cecs31-2017鋼制電纜橋架工程設(shè)計(jì)規(guī)范
- 采礦學(xué)課程設(shè)計(jì)陳四樓煤礦1.8mta新井設(shè)計(jì)(全套圖紙)
- 普通發(fā)票銷售清單
評(píng)論
0/150
提交評(píng)論