版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡介
2023/1/311第7章輸入輸出流7.1C++的輸入和輸出7.2標(biāo)準(zhǔn)輸出流7.3標(biāo)準(zhǔn)輸入流7.4文件操作與文件流7.5字符串流2023/1/312【目的要求】1.理解I/O流的概念。2.
熟悉標(biāo)準(zhǔn)輸出流。3.
熟悉標(biāo)準(zhǔn)輸入流。4.使用流類庫進(jìn)行文件存取的方法?!局攸c(diǎn)】1.
流類庫的概念。2.
文件操作與文件流。【難點(diǎn)】文件流2023/1/3137.1C++的輸入和輸出7.1.1輸入輸出的含義程序的輸入:指的是從輸入文件將數(shù)據(jù)傳送給程序;程序的輸出:指的是從程序?qū)?shù)據(jù)傳送給輸出文件。C++的輸入與輸出包括:(1)標(biāo)準(zhǔn)的輸入輸出,簡稱標(biāo)準(zhǔn)I/O。即從鍵盤輸入數(shù)據(jù),輸出到顯示器。(2)文件的輸入輸出,簡稱文件I/O。以外存文件為對象的輸入輸出。(3)字符串輸入輸出,簡稱串I/O。對內(nèi)存中指定的空間進(jìn)行輸入和輸出。2023/1/3147.1.2C++的I/O對C的發(fā)展——類型安全和可擴(kuò)展性
在C++的輸入輸出中,編譯系統(tǒng)對數(shù)據(jù)類型進(jìn)行嚴(yán)格的檢查,凡是類型不正確的數(shù)據(jù)都不可能通過編譯,因此,C++的I/O操作是類型安全的。
C++的I/O操作是可擴(kuò)展的,不僅可以用來輸入輸出標(biāo)準(zhǔn)類型的數(shù)據(jù),也可以用于用戶自定義類型的數(shù)據(jù)??蓴U(kuò)展性是C++輸入輸出的重要特點(diǎn)之一,它能提高軟件的重要性,加快軟件的開發(fā)過程。2023/1/3157.1.3C++的輸入輸出流流是一種抽象,它負(fù)責(zé)在數(shù)據(jù)的生產(chǎn)者和數(shù)據(jù)的消費(fèi)者之間建立聯(lián)系,并管理數(shù)據(jù)的流動。
在輸入操作時(shí),字節(jié)流從輸入設(shè)備(如鍵盤、磁盤等)流向內(nèi)存;在輸出操作時(shí),字節(jié)流從內(nèi)存流向輸出設(shè)備(如屏幕、打印機(jī)、磁盤等)。在C++中,輸入輸出被定義為類。C++的I/O庫中的類稱為流類,用流定義的2023/1/316對象稱為流對象。1.iostream類庫中有關(guān)的類2023/1/317輸入輸出流及其文件流見如圖所示:輸入文件流類輸出文件流類通用輸入流通用輸出流通用輸入輸出流輸入輸出文件流類抽象基類2023/1/3182.與iostream類庫有關(guān)的頭文件頭文件是程序與類庫的接口,iostream類庫的接口分別由不同的頭文件來實(shí)現(xiàn),常見的有:iostream包含了對輸入輸出流進(jìn)行操作所需要的基本信息。fstream用于用戶管理的文件的I/O操作。strstream用于字符串流I/O。stdiostream用于混合使用C和C++的I/O機(jī)制時(shí),例如想將C程序轉(zhuǎn)變?yōu)镃++程序。iomanip在使用格式化I/O時(shí)應(yīng)包含此文件。2023/1/319
當(dāng)用戶在自己的程序中用#include命令包含了上述有關(guān)的頭文件就相當(dāng)于在本程序中聲明了所需要的用到的類。3.在iostream頭文件中定義的流對象2023/1/31104.在iostream頭文件中重載運(yùn)算符在iostream頭文件中對“<<”和“>>”(原意是:左位移位運(yùn)算符和右位移位運(yùn)算符)已經(jīng)進(jìn)行了重載,使它們能用作標(biāo)準(zhǔn)類型數(shù)據(jù)的輸入和輸出。所以,在用它們的程序中必須用#include命令把iostream包含到程序中:
#include<iostream>7.2標(biāo)準(zhǔn)輸出流標(biāo)準(zhǔn)輸出流是流向標(biāo)準(zhǔn)輸出設(shè)備(顯示器)的數(shù)據(jù)。ostream類定義了3個(gè)輸出流對象,即cout、cerr、clog。2023/1/31111.cout流對象consoleoutput:在控制臺(終端顯示器)的輸出2.cerr流對象consoleerror:在控制臺(顯示器)顯示出錯(cuò)信息3.clog流對象consolelog:在終端顯示器上顯示出錯(cuò)信息。上面的cerr和clog都是標(biāo)準(zhǔn)出錯(cuò)流,區(qū)別:cerr是不經(jīng)過緩沖區(qū),直接向顯示器上輸出有關(guān)錯(cuò)誤信息,而clog中的信息存放在緩沖區(qū)中,緩沖區(qū)滿后或遇到endl時(shí)向顯示器輸出。2023/1/31127.2.2格式輸出前面的所有程序在輸出數(shù)據(jù)時(shí),為簡單起見,都沒有指定輸出的格式,由系統(tǒng)根據(jù)數(shù)據(jù)的類型采取默認(rèn)的格式。如果要數(shù)據(jù)按指定的格式輸出,可以采用:使用格式控制符;使用流對象的有關(guān)成員函數(shù)。1.使用控制符控制輸出格式下表列出了輸出數(shù)據(jù)的控制符。2023/1/31132023/1/3114注意:上表所示的控制符是在頭文件iomanip中定義的,因而程序中要使用這些控制符時(shí)應(yīng)當(dāng)把此文件包含到程序中,即:
#include<iomanip>例7.2用控制符控制輸出格式#include<iostream>#include<iomanip>usingnamespacestd;intmain(){inta;
cout<<"inputa:";cin>>a;2023/1/3115cout<<"dec:"<<dec<<a<<endl;//以10進(jìn)制輸出
cout<<"hex:"<<hex<<a<<endl;//以16進(jìn)制輸出
cout<<"oct:"<<setbase(8)<<a<<endl;//以8進(jìn)制輸出
char*pt="China";cout<<setw(10)<<pt<<endl;cout<<setfill('*')<<setw(10)<<pt<<endl;doublepi=22.0/7.0;cout<<setiosflags(ios::scientific)<<setprecision(8);cout<<"pi="<<pi<<endl;cout<<"pi="<<setprecision(4)<<pi<<endl;cout<<"pi="<<setiosflags(ios::fixed)<<pi<<endl;return0;}2023/1/31162.用流對象的成員函數(shù)控制輸出格式通過流對象cout的成員函數(shù)來控制輸出格式2023/1/31172023/1/3118例7.3
用流控制成員函數(shù)輸出數(shù)據(jù)。#include<iostream>usingnamespacestd;intmain(){inta=21;cout.setf(ios::showbase);//設(shè)置輸出時(shí)的基數(shù)符號
cout<<“dec:”<<a<<endl;//默認(rèn)以10進(jìn)制輸出
cout.unsetf(ios::dec);//終止10進(jìn)制輸出
cout.setf(ios::hex);//設(shè)置以16進(jìn)制輸出
cout<<"hex:"<<a<<endl;cout.unsetf(ios::hex);//終止16進(jìn)制輸出2023/1/3119cout.setf(ios::oct);//設(shè)置以8進(jìn)制輸出
cout<<"oct:"<<a<<endl;char*pt="China";cout.width(10);//指定域?qū)挒?0cout<<pt<<endl;cout.width(10);//指定域?qū)挒?0
cout.fill(‘*’);//指定空白處以’*’填充
cout<<pt<<endl;doublepi=22.0/7.0;cout.setf(ios::scientific);//指定科學(xué)記數(shù)法輸出
cout<<"pi=";2023/1/3120cout.width(14);//指定域?qū)挒?4cout<<pi<<endl;cout.unsetf(ios::scientific);//終止科學(xué)記數(shù)法
cout.setf(ios::fixed);//指定用定點(diǎn)形式輸出
cout.width(12);//指定域?qū)挒?2cout.setf(ios::showpos);//在輸出時(shí)顯示+號
cout.setf(ios::internal);//數(shù)符出現(xiàn)在左側(cè)
cout.precision(6);//保留6位小數(shù)
cout<<pi<<endl;return0;}2023/1/31217.2.3用流成員函數(shù)put輸出字符(了解)7.3標(biāo)準(zhǔn)輸入流
7.3.1cin流
cin是istream類的對象,它從標(biāo)準(zhǔn)輸入設(shè)備(鍵盤)獲取數(shù)據(jù),程序中的變量通過流提取符“>>”從流中提取數(shù)據(jù)。流提取符“>>”從流中提取數(shù)據(jù)時(shí)通常跳過輸入流中的空格、tab鍵、換行符等空白字符。
注意:只有在輸入完數(shù)據(jù)再按回車鍵時(shí),該行數(shù)據(jù)才被送入鍵盤緩沖區(qū),形成輸入流,提取運(yùn)算符“>>”才能從中提取數(shù)據(jù)。當(dāng)輸入流cin處于出錯(cuò)狀態(tài)時(shí),其值為false2023/1/3122即cin為0值;如果輸入流在正常狀態(tài),cin的值為ture,即cin的值為一個(gè)非0值。例7.5
通過測試cin的值,判斷流對象是否處于正常狀態(tài)。#include<iostream>usingnamespacestd;intmain(){floatgrade;cout<<"entergrade:";2023/1/3123while(cin>>grade)//如果能從cin流讀取數(shù)據(jù),cin為真,
//執(zhí)行循環(huán)體
{if(grade>=85)cout<<grade<<"GOOD!"<<endl;if(grade<60)cout<<grade<<"fail!"<<endl;cout<<"entergrade:";}cout<<"Theend."<<endl;return0;}2023/1/3124
說明:變量grade從輸入流中提取實(shí)型數(shù)據(jù)時(shí),提取操作成功,此時(shí)cin流處于正常狀態(tài);但在變量grade準(zhǔn)備提取一個(gè)實(shí)型數(shù)據(jù)時(shí),遇到了字母等其它字符,顯然提取操作失敗,故程序結(jié)束。7.3.2用于字符輸入的流成員函數(shù)(了解)1.用get函數(shù)讀入一個(gè)字符P235
2.用成員函數(shù)getline函數(shù)讀入一行字符
P2377.3.3istream類的其他成員函數(shù)(了解)1.eof函數(shù)
P2392.peek函數(shù)P2393.putback函數(shù)
P2394.ignore函數(shù)P2412023/1/31257.4文件操作與文件流
7.4.1文件的概念
前面講座的輸入輸出是以系統(tǒng)指定的標(biāo)準(zhǔn)設(shè)備為對象的。在實(shí)際應(yīng)用中,常以磁盤文件為對象,即從磁盤讀取數(shù)據(jù),將數(shù)據(jù)寫入到磁盤文件。
所謂“文件”,指存儲在外部介質(zhì)上數(shù)據(jù)的集合。對用戶來說,常用到的文件分為兩大類,一類是程序文件;一類是數(shù)據(jù)文件。程序中的輸入和輸出的對象就是數(shù)據(jù)文件。
根據(jù)文件中數(shù)據(jù)的組織形式,文件又可分為ASCII文件和二進(jìn)制文件。2023/1/3126
ASCII文件又稱為文本文件,它的每一個(gè)字節(jié)放一個(gè)ASCII代碼,代表一個(gè)字符。二進(jìn)制文件又稱內(nèi)部格式文件或字節(jié)文件,是把內(nèi)存中的數(shù)據(jù)按其在內(nèi)存中的存儲形式原樣輸出到磁盤上存放。7.4.2文件流類與文件流對象文件流是以外存文件為輸入輸出對象的數(shù)據(jù)流。輸出文件流是從內(nèi)存流向外存文件的數(shù)據(jù);輸入文件流是從外存文件流向內(nèi)存的數(shù)據(jù)。每一個(gè)文件流都有一個(gè)內(nèi)存緩沖區(qū)與之對應(yīng)。2023/1/3127
在C++的I/O類庫中定義了幾種文件類,專門用于對磁盤文件的輸入輸出操作。除了前面已經(jīng)介紹過的標(biāo)準(zhǔn)輸入輸出流類istream,ostream和iostream類外,還有3個(gè)用于文件操作的文件類:(1)ifstream類,它是從istream類派生的,用來支持從磁盤文件的輸入。(2)ofstream類,它是從ostream類派生的,用來支持向磁盤文件的輸出。(3)fstream類,它是從iostream類派生的,用來支持對磁盤文件的輸入輸出。2023/1/3128
要以磁盤文件為對象進(jìn)行輸入輸出,必須定義一個(gè)文件流類的對象,通過文件流對象將數(shù)據(jù)從內(nèi)存輸出到磁盤文件,或者通過文件流對象從磁盤文件將數(shù)據(jù)輸入到內(nèi)存。文件流對象是用文件流類定義的,而不是用istream和ostream類來定義的??梢杂孟旅娴姆椒ń⒁粋€(gè)輸出文件流對象:
ofstreamoutfile;
也可以建立一個(gè)輸入文件流對象:
ifstreaminfile;
2023/1/3129
雖然上面定義了一個(gè)輸入或輸出流文件對象,但還未指定它向哪一個(gè)磁盤文件輸入或輸出。7.4.3文件的打開與關(guān)閉
1.打開磁盤文件打開文件是指在文件讀寫之前做必要的準(zhǔn)備工作,包括:
(1)為文件流對象和指定的磁盤文件建立關(guān)聯(lián),以便合文件流流向指定的磁盤文件。
(2)指定文件的工作方式,如:該文件是輸入文件還是輸出文件,是ASCII文件還是二進(jìn)制文件等2023/1/3130方法一:調(diào)用文件流的成員函數(shù)open,如:
ofstreamoutfile;
//定義ofstream類(輸出文件流類)對象outfile
outfile.open(“a1.dat”,ios::out);
//使文件流與a1.dat文件建立關(guān)聯(lián)調(diào)用成員函數(shù)open的一般形式為:文件流對象.open(磁盤文件名,輸入輸出方式);其中,磁盤文件名可以包括路徑,如缺省路徑,則默認(rèn)為當(dāng)前目錄下的文件。2023/1/3131方法二:在定義文件流對象時(shí)指定參數(shù)。
在聲明文件流類時(shí)定義了帶參數(shù)的構(gòu)造函數(shù),其中包含了打開磁盤文件的功能,因此,可以在定義文件流對象時(shí)指定參數(shù),調(diào)用文件流類的構(gòu)造函數(shù)來實(shí)現(xiàn)打開文件的功能。如:
ostreamoutfile(“a1.dat”,ios::out);
一般多用此方法,因?yàn)楸容^方便,其作用與open函數(shù)相同。上面兩種方法中的輸入輸出方式見下表所示:2023/1/31322023/1/3133說明:(1)每一個(gè)打開的文件都有一個(gè)文件指針,該指針的初始位置由I/O方式指定,每次讀寫都從文件指針的當(dāng)前位置開始。當(dāng)文件指針移到最后,就會遇到文件結(jié)束EOF(文件結(jié)束符也占一個(gè)字節(jié),其值為-1),此時(shí)流對象的成員函數(shù)eof的值為非0值(一般認(rèn)為1),表示文件結(jié)束了。(2)如果打開操作失敗,open函數(shù)的返回值為0(假),如果是用調(diào)用構(gòu)造函數(shù)的方式打開文件,則流對象的值為0。可以據(jù)此測試打開是否成功。如:2023/1/3134
if(outfile.open(“a1.dat”,ios::app)==0cout<<“open.error”;或
if(!outfile.open(“a1.dat”,ios::app)) cout<<“open.error”;2.關(guān)閉磁盤文件在對已打開的磁盤文件的讀寫操作完成后,應(yīng)關(guān)閉該文件。關(guān)閉文件用成員函數(shù)close。如:
outfile.close();
//將輸出文件流所關(guān)聯(lián)的磁盤文件關(guān)閉2023/1/31357.4.4對ASCII文件的操作對ASCII文件的讀寫操作可以用以下兩種方法:(1)用流插入運(yùn)算符“<<”和流提取運(yùn)算符“>>”輸入輸出標(biāo)準(zhǔn)類型的數(shù)據(jù)。對磁盤文件的操作,可以通過文件流對象和流插入運(yùn)算符“<<”和流提取運(yùn)算符“>>”實(shí)現(xiàn)對磁盤的讀寫,如同用cin,cout和<<,>>對標(biāo)準(zhǔn)設(shè)備進(jìn)行讀寫一樣。(2)用文件流的put,get,getline等成員函數(shù)進(jìn)行字符的輸入輸出。2023/1/3136例7.11
寫入磁盤文件#include<iostream>#include<fstream>usingnamespacestd;intmain(){inta[10];
ofstreamoutfile("f1.dat“,ios::out);//定義文件流對象,打開磁盤文件f1.datif(!outfile)//如果打開失敗,outfile返回0值
{cerr<<"openerror!"<<endl;exit(1);}2023/1/3137cout<<"enter10integernumbers:"<<endl;for(inti=0;i<10;i++){cin>>a[i];
outfile<<a[i]<<“”;//向磁盤文件f1.dat輸出數(shù)據(jù)
}outfile.close();//關(guān)閉磁盤文件f1.datreturn0;}說明:(1)在VC中調(diào)試時(shí)必須包含頭文件:fstream。2023/1/3138(2)
ofstreamoutfile(“f1.dat“,ios::out);語句中的參數(shù)ios::out可以省略,這是默認(rèn)形式。即下面兩種寫法等價(jià):
ofstreamoutfile("f1.dat“,ios::out);
ofstreamoutfile("f1.dat“);(3)如果打開成功,則文件流對象outfile的返回值為非0值;如果打開失敗,則返回值為0(假)(4)函數(shù)exit(1)為系統(tǒng)函數(shù),表示結(jié)束運(yùn)行。其中的參數(shù)為任意整數(shù),可用0,1或其他整數(shù)(5)
outfile<<a[i]<<“”;就是把標(biāo)準(zhǔn)輸出流對象cout換成文件輸出流對象outfile而已。2023/1/3139例7.12
讀出例7.11的磁盤文件并找出最大數(shù)#include<iostream>#include<fstream>usingnamespacestd;intmain(){inta[10],max,i,order;
ifstream
infile("f1.dat",ios::in);
2023/1/3140if(!infile){cerr<<"openerror!"<<endl;
exit(1);}for(i=0;i<10;i++){infile>>a[i];cout<<a[i]<<"";}cout<<endl;max=a[0];order=0;2023/1/3141for(i=1;i<10;i++)if(a[i]>max){max=a[i];order=i;}cout<<"max="<<max<<endl<<"order=“<<order<<endl;
infile.close();return0;}2023/1/31427.4.5對二進(jìn)制文件的操作二進(jìn)制文件不是以ASCII代碼存放數(shù)據(jù)的,它將內(nèi)存中數(shù)據(jù)存儲形式不加轉(zhuǎn)換地傳送到磁盤文件,因此它又稱為內(nèi)存數(shù)據(jù)的映像文件。對二進(jìn)制文件的操作在使用時(shí)需要先打開文件,用完后要關(guān)閉二進(jìn)制文件。在打開時(shí)要用ios::binary指定為以二進(jìn)制形式傳送和存儲。二進(jìn)制文件除了可以作為輸入文件或輸出文件外,還可以是既能輸入又能輸出的文件,這是和ASCII文件不同的地方。2023/1/31431.用成員函數(shù)read和write讀寫二進(jìn)制文件對二進(jìn)制文件的讀寫主要是用istream類的成員函數(shù)read和write來實(shí)現(xiàn)。這兩個(gè)成員函數(shù)的原型為:
istream&read(char*buffer,intlen);
ostream&write(constchar*buffer,intlen);
其中字符指針buffer指向內(nèi)存中的一段存儲空間,len是讀寫的字節(jié)數(shù)。調(diào)用的方式為:
a.write(p1,50);
b.read(p2,30);式中的a是輸出文件流對象,write函數(shù)將字符指針2023/1/3144p1所給出的地址開始的50個(gè)字節(jié)的內(nèi)容不加轉(zhuǎn)換地寫到磁盤文件中。b是輸入流對象,read函數(shù)從b所關(guān)聯(lián)的磁盤文件中,讀入30個(gè)字節(jié),存放在字符指針p2所指的一段空間內(nèi)。例7.14
將數(shù)據(jù)以二進(jìn)制形式存放在磁盤文件中
#include<iostream>#include<fstream>usingnamespacestd;2023/1/3145structstudent{charname[20];intnum;intage;charsex;};intmain(){studentstud[3]={"Li",1001,18,'f',"Fun",1002,19,'m',"Wang",1004,17,'f‘};
ofstream
outfile("stud.dat",ios::binary);2023/1/3146if(!outfile){cerr<<"openerror!"<<endl;
abort();//退出程序
}for(inti=0;i<3;i++)outfile.write((char*)&stud[i],sizeof(stud[i]));outfile.close();return0;}2023/1/3147
說明:程
溫馨提示
- 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)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 二零二五版?zhèn)€人二手房交易合同(含車位使用權(quán))2篇
- 銷售活動安全管理方案
- 老舊小區(qū)水管裝修方案
- 二零二五版新型土地廠房產(chǎn)權(quán)交易合同3篇
- 二零二五版協(xié)議離婚子女撫養(yǎng)權(quán)糾紛解決合同3篇
- 二零二五年度個(gè)人信托合同范本
- 透平機(jī)拆除施工方案
- 二零二五年度二手房全款買賣合同電子版范本
- 安徽防滑塑膠地板施工方案
- 二零二五版文化產(chǎn)業(yè)股權(quán)委托投資管理合同3篇
- 廣東省佛山市2025屆高三高中教學(xué)質(zhì)量檢測 (一)化學(xué)試題(含答案)
- 2025年福建新華發(fā)行(集團(tuán))限責(zé)任公司校園招聘高頻重點(diǎn)提升(共500題)附帶答案詳解
- 人教版【初中數(shù)學(xué)】知識點(diǎn)總結(jié)-全面+九年級上冊數(shù)學(xué)全冊教案
- 四川省成都市青羊區(qū)成都市石室聯(lián)合中學(xué)2023-2024學(xué)年七上期末數(shù)學(xué)試題(解析版)
- 咨詢公司績效工資分配實(shí)施方案
- 2024-2025學(xué)年人教版七年級英語上冊各單元重點(diǎn)句子
- 2025新人教版英語七年級下單詞表
- 公司結(jié)算資金管理制度
- 2024年小學(xué)語文教師基本功測試卷(有答案)
- 未成年入職免責(zé)協(xié)議書
- 項(xiàng)目可行性研究報(bào)告評估咨詢管理服務(wù)方案1
評論
0/150
提交評論