版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
《面向?qū)ο蟪绦蛟O(shè)計(jì)》七、輸入/輸出流對(duì)象1/4/20231第7章輸入/輸出流對(duì)象《面向?qū)ο蟪绦蛟O(shè)計(jì)》七、輸入/輸出流對(duì)象12/30/2022內(nèi)容提要螺旋矩陣的輸入/輸出問題流無格式輸入/輸出輸入/輸出的格式控制自定義類型對(duì)象的輸入輸出文件的輸入/輸出問題1/4/20232第7章輸入/輸出流對(duì)象內(nèi)容提要螺旋矩陣的輸入/輸出問題12/30/20222提出問題編程輸出M*M的螺旋矩陣,要求數(shù)據(jù)間距與M相同。例如,4*4的螺旋矩陣,其間距為4:
123412131451116156109871/4/20233第7章輸入/輸出流對(duì)象提出問題編程輸出M*M的螺旋矩陣,要求數(shù)據(jù)間距與M相同。例如分析問題C++沒有定義任何用于執(zhí)行輸入或輸出的語句,但可以使用C語言中的標(biāo)準(zhǔn)I/O函數(shù)printf()和scanf()來解決此問題。1/4/20234第7章輸入/輸出流對(duì)象分析問題C++沒有定義任何用于執(zhí)行輸入或輸出的語句,但可以使【例】有如下程序:#include<stdio.h>intb=20;floata=5.6;intmain(){printf("%d\n",a);scanf("%d",&a);scanf("%d",&b);printf("%d\n","abc");return0;}該程序的運(yùn)行結(jié)果為:161061273623↙45↙43499801/4/20235第7章輸入/輸出流對(duì)象【例】有如下程序:該程序的運(yùn)行結(jié)果為:12/30/20225printf()與scanf()存在以下兩個(gè)缺點(diǎn):1.非類型安全2.不可擴(kuò)充性classA{…}Aa;…printf("%?",a);//不知用什么格式符來識(shí)別A的對(duì)象1/4/20236第7章輸入/輸出流對(duì)象printf()與scanf()存在以下兩個(gè)缺點(diǎn):12/30C++用I/O流來解決這個(gè)問題。下面先介紹流的概念。1/4/20237第7章輸入/輸出流對(duì)象C++用I/O流來解決這個(gè)問題。12/30/20227第7章流的概念在C++程序中,數(shù)據(jù)可以從外部設(shè)備(鍵盤等)流入到計(jì)算機(jī)內(nèi)存中,也可以從計(jì)算機(jī)內(nèi)存流向外部設(shè)備(屏幕或磁盤文件等),這種數(shù)據(jù)傳遞被稱作輸入輸出。C++將數(shù)據(jù)從一個(gè)位置到另一個(gè)位置的傳遞抽象為流。所謂流(stream)就是指數(shù)據(jù)從一個(gè)位置流向另一個(gè)位置。流是字節(jié)的序列。C++的輸入輸出操作是基于流來處理的。1/4/20238第7章輸入/輸出流對(duì)象流的概念在C++程序中,數(shù)據(jù)可以從外部設(shè)備(鍵盤等)流入到I/O流操作C++基于流的概念處理數(shù)據(jù)的輸入輸出,因此也稱之為輸入輸出流,即I/O流。I/O流具有兩個(gè)基本的行為特征,一是從流中獲取數(shù)據(jù)的操作稱為提取操作,二是向流中添加數(shù)據(jù)的操作稱為插入操作。1/4/20239第7章輸入/輸出流對(duì)象I/O流操作C++基于流的概念處理數(shù)據(jù)的輸入輸出,因此也稱之I/O流類C++標(biāo)準(zhǔn)庫圍繞流的概念,提供了一整套I/O流類簇,既可用于標(biāo)準(zhǔn)類型數(shù)據(jù)的I/O,也能用于自定義類型對(duì)象的I/O,這種擴(kuò)展性是C++最有價(jià)值的特點(diǎn)之一。C++標(biāo)準(zhǔn)庫提供的I/O流類的各種操作都是類型安全(typesafe)的。不同類型的I/O流操作都是重載的,沒有定義過I/O功能的類型不具備I/O操作的能力。1/4/202310第7章輸入/輸出流對(duì)象I/O流類C++標(biāo)準(zhǔn)庫圍繞流的概念,提供了一整套I/O流類簇I/O流類簇的層次結(jié)構(gòu)C++標(biāo)準(zhǔn)庫提供的I/O流類簇有兩個(gè)平行基類:streambuf(filebuf,stringbuf,strstreambuf)ios(istream,ostream)ios類有下面直接派生類:輸入流類istream (ifstream,istringstream,istrstream)輸出流類ostream (ofstream,ostringstream,ostrstream)(iostream->fstream,stringstream,strstream)1/4/202311第7章輸入/輸出流對(duì)象I/O流類簇的層次結(jié)構(gòu)C++標(biāo)準(zhǔn)庫提供的I/O流類簇有兩個(gè)I/O流分類C++標(biāo)準(zhǔn)庫提供的I/O流按功能可分為如下3類:標(biāo)準(zhǔn)I/O流:內(nèi)存與標(biāo)準(zhǔn)輸入輸出設(shè)備(鍵盤、屏幕)之間數(shù)據(jù)的傳遞;文件I/O流:內(nèi)存與外部磁盤文件之間數(shù)據(jù)的傳遞;字符串I/O流:內(nèi)存變量與表示字符串流的字符數(shù)組之間數(shù)據(jù)的傳遞。1/4/202312第7章輸入/輸出流對(duì)象I/O流分類C++標(biāo)準(zhǔn)庫提供的I/O流按功能可分為如下3類:標(biāo)準(zhǔn)I/O流對(duì)象標(biāo)準(zhǔn)I/O流預(yù)定義了4個(gè)流類對(duì)象:cin、cout、cerr、clog。操作系統(tǒng)給把外設(shè)用文件名的方式進(jìn)行管理,因此程序設(shè)計(jì)要訪問外設(shè)就跟訪問文件一樣方便。
1/4/202313第7章輸入/輸出流對(duì)象標(biāo)準(zhǔn)I/O流對(duì)象標(biāo)準(zhǔn)I/O流預(yù)定義了4個(gè)流類對(duì)象:cin、cI/O分為無格式支持的低級(jí)I/O和具有格式支持的高級(jí)I/O。無格式支持的低級(jí)I/O以基本字節(jié)為操作對(duì)象,有格式支持的高級(jí)I/O把若干字節(jié)組合成有意義的單位,如整數(shù)、浮點(diǎn)數(shù)、字符、字符串及用戶自定義類型等等。1/4/202314第7章輸入/輸出流對(duì)象I/O分為無格式支持的低級(jí)I/O和具有格式支持的高級(jí)I/O。無格式輸入/輸出無格式輸入/輸出就是按系統(tǒng)預(yù)定義的格式進(jìn)行的輸入/輸出。按默認(rèn)約定,每個(gè)C++程序都能使用標(biāo)準(zhǔn)I/O流,如標(biāo)準(zhǔn)輸入、標(biāo)準(zhǔn)輸出。cin用來處理標(biāo)準(zhǔn)輸入,即鍵盤輸入;cout用來處理標(biāo)準(zhǔn)輸出,即屏幕輸出。它們被定義在iostream頭文件中。在使用cout和cin前,要用編譯預(yù)處理命令將所使用的頭文件包含到源程序中,其格式如下:
#include<iostream>1/4/202315第7章輸入/輸出流對(duì)象無格式輸入/輸出無格式輸入/輸出就是按系統(tǒng)預(yù)定義的格式進(jìn)行無格式輸出“<<”是預(yù)定義的插入運(yùn)算符,作用在流類對(duì)象cout上,實(shí)現(xiàn)默認(rèn)格式的屏幕輸出。使用cout輸出表達(dá)式值到屏幕上的格式如下:
cout<<E1<<E2<<…<<Em; 其中,E1、E2、…、Em為均為表達(dá)式。功能是計(jì)算各表達(dá)式的值,并將結(jié)果輸出到屏幕當(dāng)前光標(biāo)位置處。1/4/202316第7章輸入/輸出流對(duì)象無格式輸出“<<”是預(yù)定義的插入運(yùn)算符,作用在流類對(duì)象co無格式輸出cout是ostream流類的對(duì)象,它在iostream頭文件中作為全局對(duì)象定義,其格式如下: ostreamcout(stdout); 其中,stdout表示標(biāo)準(zhǔn)輸出設(shè)備名(屏幕)。在ostream流類中,對(duì)應(yīng)每個(gè)基本數(shù)據(jù)類型定義運(yùn)算符“<<”重載函數(shù)為友元,它們?cè)趏stream中聲明:ostream&operator<<(ostream&dest,char*pSource);ostream&operator<<(ostream&dest,intsource);ostream&operator<<(ostream&dest,charsource);1/4/202317第7章輸入/輸出流對(duì)象無格式輸出cout是ostream流類的對(duì)象,它在iost無格式輸入“>>”是預(yù)定義的提取運(yùn)算符,作用在流類對(duì)象cin上,實(shí)現(xiàn)默認(rèn)格式的鍵盤輸入。使用cin將數(shù)據(jù)輸入到變量的格式如下:
cin>>V1>>V2>>…>>Vn;
其中,V1、V2、…、Vn都是變量。功能是暫停執(zhí)行程序,等待用戶從鍵盤輸入數(shù)據(jù),各數(shù)據(jù)間用空格或Tab鍵分隔,輸入數(shù)據(jù)類型要與接受變量類型一致,輸完后,按回車鍵結(jié)束。1/4/202318第7章輸入/輸出流對(duì)象無格式輸入“>>”是預(yù)定義的提取運(yùn)算符,作用在流類對(duì)象ci無格式輸入cin是istream流類的對(duì)象,它在iostream頭文件中作為全局對(duì)象定義,其格式如下: istreamcin(stdin);在istream流類中,對(duì)應(yīng)每個(gè)基本數(shù)據(jù)類型定義運(yùn)算符“>>”重載函數(shù)為友元,它們?cè)趇stream中聲明: istream&operator>>(istream&sour,char*pDes); istream&operator>>(istream&sour,intdes); istream&operator>>(istream&sour,chardes);1/4/202319第7章輸入/輸出流對(duì)象無格式輸入cin是istream流類的對(duì)象,它在iostr輸入輸出的格式控制C++提供了兩種格式化輸入/輸出方式:一種是用ios類成員函數(shù)進(jìn)行格式化輸入輸出另一種是用專門的操作符函數(shù)進(jìn)行格式化輸入輸出1/4/202320第7章輸入/輸出流對(duì)象輸入輸出的格式控制C++提供了兩種格式化輸入/輸出方式:1用ios類成員函數(shù)格式化ios類成員函數(shù)主要是通過對(duì)狀態(tài)標(biāo)志、輸出寬度、填充字符以及輸出精度的操作來完成輸入/輸出格式化。輸入輸出格式由各種狀態(tài)標(biāo)志來確定,這些狀態(tài)標(biāo)志在ios類中定義為枚舉量。由于該枚舉量定義在ios類中,因此引用時(shí)必須包含ios::前綴。使用時(shí)應(yīng)該全部用符號(hào)名,絕不要用數(shù)值。1/4/202321第7章輸入/輸出流對(duì)象用ios類成員函數(shù)格式化ios類成員函數(shù)主要是通過對(duì)狀態(tài)enum{ skipws=0x0001, //跳過輸入空格 left=0x0002, //按左對(duì)齊格式輸出 right=0x0004, //按右對(duì)齊格式輸出 internal=0x0008, //輸出符號(hào)和基指示符后的填補(bǔ) dec=0x0010, //轉(zhuǎn)換為十進(jìn)制(In/Out) oct=0x0020, //轉(zhuǎn)換為八進(jìn)制(In/Out) hex=0x0040, //轉(zhuǎn)換為十六進(jìn)制(In/Out) showbase=0x0080, //輸出顯示基指示符 showpoint=0x0100, //輸出顯示小數(shù)點(diǎn) uppercase=0x0200, //大寫十六進(jìn)制輸出 showpos=0x0400, //正整數(shù)顯示前加上“+” scientific=0x0800, //輸出用科學(xué)表示法表示的浮點(diǎn)數(shù) fixed=0x1000, //輸出用固定小數(shù)點(diǎn)表示的浮點(diǎn)數(shù) unitbuf=0x2000, //在輸出操作后刷新所有流 stdio=0x4000 //在輸出操作后刷新stdout和stderr}這些標(biāo)志可以由ios類成員函數(shù)訪問,也可以用操作符函數(shù)訪問。1/4/202322第7章輸入/輸出流對(duì)象enum12/30/202222第7章輸入/輸出流對(duì)象用ios成員函數(shù)對(duì)狀態(tài)標(biāo)志進(jìn)行操作ios類有3個(gè)成員函數(shù)可以對(duì)狀態(tài)標(biāo)志進(jìn)行操作,分別為flags()、setf()和unsetf(),并且ios類還定義了一個(gè)long型數(shù)據(jù)成員記錄當(dāng)前狀態(tài)標(biāo)志。這些狀態(tài)標(biāo)志可用位或運(yùn)算符“|”進(jìn)行組合。用setf函數(shù)設(shè)置狀態(tài)標(biāo)志,其一般格式如下:
longios::setf(longflags)1/4/202323第7章輸入/輸出流對(duì)象用ios成員函數(shù)對(duì)狀態(tài)標(biāo)志進(jìn)行操作ios類有3個(gè)成員函數(shù)可用ios成員函數(shù)對(duì)狀態(tài)標(biāo)志進(jìn)行操作用unsetf函數(shù)清除狀態(tài)標(biāo)志,其一般格式如下:
longios::unsetf(longflags)用函數(shù)flags取狀態(tài)標(biāo)志有兩種形式,其一般格式分別如下: longios::flags() longios::flags(longflag)
第一種形式返回與流相關(guān)的當(dāng)前狀態(tài)標(biāo)志值;第二種形式將流的狀態(tài)標(biāo)志值設(shè)置為flag,并返回設(shè)置前的狀態(tài)標(biāo)志值。1/4/202324第7章輸入/輸出流對(duì)象用ios成員函數(shù)對(duì)狀態(tài)標(biāo)志進(jìn)行操作用unsetf函數(shù)清除狀態(tài)例使用ios成員函數(shù)操作狀態(tài)字voidshowflags(longf);voidmain(){ longf; f=cout.flags();//取當(dāng)前狀態(tài)標(biāo)志 showflags(f);//顯示狀態(tài)值 cout.setf(ios::showpos|ios::scientific|ios::fixed); //追加狀態(tài)標(biāo)志 f=cout.flags();//取當(dāng)前狀態(tài)標(biāo)志 showflags(f);//顯示狀態(tài)值 cout.unsetf(ios::scientific);//從狀態(tài)標(biāo)志中去掉標(biāo)志 f=cout.flags();//取當(dāng)前狀態(tài)標(biāo)志 showflags(f);//顯示狀態(tài)值 f=cout.flags(ios::hex);//重新設(shè)置狀態(tài)標(biāo)志 showflags(f); f=cout.flags();//取當(dāng)前狀態(tài)標(biāo)志 showflags(f);}1/4/202325第7章輸入/輸出流對(duì)象例使用ios成員函數(shù)操作狀態(tài)字12/30/202225第7用ios成員函數(shù)設(shè)置輸出寬度設(shè)置輸出寬度函數(shù)有兩種形式,其一般格式分別如下:
intios::width(intlen) intios::width() 第一種形式是設(shè)置輸出寬度,并返回原來的輸出寬度;第二種形式是返回當(dāng)前輸出寬度,輸出寬度為0。1/4/202326第7章輸入/輸出流對(duì)象用ios成員函數(shù)設(shè)置輸出寬度設(shè)置輸出寬度函數(shù)有兩種形式,其一例使用width控制輸出寬度#include<iostream>usingnamesoacestd;intmain(){ doublevalues[]={1.23,35.36,653.7,4358.24};for(inti=0;i<4;i++){cout.width(10);cout<<values[i]<<'\n';}}輸出結(jié)果:1.2335.36653.74358.241/4/202327第7章輸入/輸出流對(duì)象例使用width控制輸出寬度輸出結(jié)果:12/30/2022用ios成員函數(shù)設(shè)置填充字符填充字符的作用是當(dāng)輸出值不滿輸出寬度時(shí)用填充字符來填充,默認(rèn)填充字符為空格。它與width()函數(shù)配合使用,否則沒有意義。設(shè)置填充字符函數(shù)有兩種形式,其格式分別如下:
charios::fill(charch)
charios::fill() 第一種形式是重新設(shè)置填充字符,并返回設(shè)置前的填充字符;第二種形式是返回當(dāng)前的填充字符。1/4/202328第7章輸入/輸出流對(duì)象用ios成員函數(shù)設(shè)置填充字符填充字符的作用是當(dāng)輸出值不滿輸出例使用fill設(shè)置填充字符#include<iostream>usingnamesoacestd;intmain(){ doublevalues[]={1.23,35.36,653.7,4358.24};for(inti=0;i<4;i++){cout.width(10);cout.fill('*');cout<<values[i]<<'\n';}}輸出結(jié)果:******1.23*****35.36*****653.7***4358.241/4/202329第7章輸入/輸出流對(duì)象例使用fill設(shè)置填充字符輸出結(jié)果:12/30/20222用ios成員函數(shù)設(shè)置輸出精度設(shè)置浮點(diǎn)數(shù)輸出精度有兩種形式,其格式分別如下:
intios::precision(intp) intios::precision() 第一種形式是重新設(shè)置輸出精度,并返回設(shè)置前的輸出精度;第二種形式是返回當(dāng)前的輸出精度。1/4/202330第7章輸入/輸出流對(duì)象用ios成員函數(shù)設(shè)置輸出精度設(shè)置浮點(diǎn)數(shù)輸出精度有兩種形式,例使用precision設(shè)置填充字符#include<iostream>usingnamesoacestd;intmain(){ intj; j=cout.precision(); cout<<"presicion:"<<j<<endl; cout.precision(8); cout<<123.456789<<endl; cout<<"presicion:"<<cout.precision()<<endl;}輸出結(jié)果:precision:6123.45679precision:81/4/202331第7章輸入/輸出流對(duì)象例使用precision設(shè)置填充字符輸出結(jié)果:12/30/用操作符函數(shù)格式化輸入輸出除了專門的ios類成員函數(shù),c++標(biāo)準(zhǔn)庫還提供了標(biāo)準(zhǔn)的操作符函數(shù)專門操控這些狀態(tài)。這組函數(shù)不屬于任何類成員,定義在iomanip.h頭文件中。將它們用在提取運(yùn)算符“>>”或插入運(yùn)算符“<<”后面來設(shè)定輸入/輸出格式,即在讀寫對(duì)象之間插入一個(gè)修改狀態(tài)的操作。其中有些函數(shù)沒有參數(shù),所以又叫操作符。
1/4/202332第7章輸入/輸出流對(duì)象用操作符函數(shù)格式化輸入輸出除了專門的ios類成員函數(shù),c+設(shè)置輸入/輸出寬度函數(shù)setw(int)設(shè)置輸出填充字符函數(shù)setfill(int)設(shè)置輸出精度函數(shù)setprecision(int)設(shè)置輸入/輸出整型數(shù)數(shù)制函數(shù)dec、hex和oct
取消輸入結(jié)束符函數(shù)ws
控制換行操作符endl代表輸出單字符“\0”的操作符ends1/4/202333第7章輸入/輸出流對(duì)象設(shè)置輸入/輸出寬度函數(shù)setw(int)12/30/2022例使用setw設(shè)置輸入/輸出寬度#include<iostream>#include<iomanip.h>usingnamesoacestd;intmain(){ char*p="12345",*q="678"; charf[4],g[4];//最后一位為'\0' inti=10; cout<<p<<setw(6)<<q<<setw(4)<<p<<q<<endl;//設(shè)置輸出寬度 cin>>setw(4)>>f>>g;//設(shè)置輸入寬度 cout<<f<<endl<<g<<endl<<"i:"<<i<<endl; return0;}運(yùn)行結(jié)果:123456781234567812345↙12345i:101/4/202334第7章輸入/輸出流對(duì)象例使用setw設(shè)置輸入/輸出寬度運(yùn)行結(jié)果:12/30/20例分別用浮點(diǎn)、定點(diǎn)的方式表示一個(gè)實(shí)數(shù)#include<iostream>#include<iomanip.h>usingnamesoacestd;intmain(){ doublef=22.0/7; //在用浮點(diǎn)表示的輸出中,setprecision(n)表示實(shí)數(shù)有效位數(shù) cout<<f<<endl;//默認(rèn)有效位數(shù)為6 cout<<setprecision(3)<<f<<endl;//最小的有效位數(shù)為3 //在用定點(diǎn)表示的輸出中,setprecision(n)表示小數(shù)有效位數(shù) cout<<setiosflags(ios::fixed); cout<<setprecision(8)<<f<<endl;//小數(shù)位數(shù)為8 return0;}運(yùn)行結(jié)果:3.142863.143.142857141/4/202335第7章輸入/輸出流對(duì)象例分別用浮點(diǎn)、定點(diǎn)的方式表示一個(gè)實(shí)數(shù)運(yùn)行結(jié)果:12/30/例使用dec、hex、oct設(shè)置輸出整型數(shù)制#include<iostream>#include<iomanip.h>usingnamesoacestd;intmain(){ intnumber=1001; cout<<"Decimal:"<<dec<<number<<endl<<"Hexadecimal:"<<hex<<number<<endl<<"Octal:"<<oct<<number<<endl; return0;}運(yùn)行結(jié)果:Decimal:1001Hexadecimal:3E9Ocatl:17511/4/202336第7章輸入/輸出流對(duì)象例使用dec、hex、oct設(shè)置輸出整型數(shù)制運(yùn)行結(jié)果:12用戶自定義操作符函數(shù)c++提供了標(biāo)準(zhǔn)的操作符函數(shù),也提供了建立自定義操作符函數(shù)的方法。建立輸出操作符函數(shù)的格式如下: ostream&manip_name(ostream&stream) { <自定義語句序列> returnstream; }其中manip_name是自定義操作符函數(shù)的名字。1/4/202337第7章輸入/輸出流對(duì)象用戶自定義操作符函數(shù)c++提供了標(biāo)準(zhǔn)的操作符函數(shù),也提供了例用戶自定義輸出操作符函數(shù)#include<iostream>#include<iomanip.h>usingnamesoacestd;ostream&setup(ostream&stream){ stream.setf(ios::left); stream<<setw(10)<<setfill('$'); returnstream;}intmain(){ cout<<10<<""<<setup<<10<<endl; return0;}運(yùn)行結(jié)果:1010&&&&&&&&1/4/202338第7章輸入/輸出流對(duì)象例用戶自定義輸出操作符函數(shù)運(yùn)行結(jié)果:12/30/20223用戶自定義操作符函數(shù)建立輸入操作符函數(shù)的格式如下: istream&manip_name(istream&stream) { <自定義語句序列> returnstream; }其中manip_name是自定義操作符函數(shù)的名字。1/4/202339第7章輸入/輸出流對(duì)象用戶自定義操作符函數(shù)建立輸入操作符函數(shù)的格式如下:12/3例用戶自定義輸出操作符函數(shù)#include<iostream>#include<iomanip.h>usingnamesoacestd;istream&prompt(istream&stream){cin>>hex;cout<<"Enternumberusinghexformat:";returnstream;}intmain(){ inti; cin>>prompt>>i; cout<<i<<endl; return0;}運(yùn)行結(jié)果:Enternumberusinghexformat:ff↙2551/4/202340第7章輸入/輸出流對(duì)象例用戶自定義輸出操作符函數(shù)運(yùn)行結(jié)果:12/30/20224自定義類型對(duì)象的輸入/輸出上面都是對(duì)基本類型數(shù)據(jù)進(jìn)行輸入/輸出操作,實(shí)際上,C++允許對(duì)自定義類型對(duì)象進(jìn)行同樣簡(jiǎn)單語法的輸入/輸出。示例自定義類型對(duì)象的輸入/輸出 1/4/202341第7章輸入/輸出流對(duì)象自定義類型對(duì)象的輸入/輸出上面都是對(duì)基本類型數(shù)據(jù)進(jìn)行輸入/classDate{public: Date(inty,intm,intd){Year=y;Month=m;Day=d;} friendostream&operator<<(ostream&stream,Date&date); friendistream&operator>>(istream&stream,Date&date);private: intYear,Month,Day;};ostream&operator<<(ostream&stream,Date&date){stream<<date.Year<<"/"<<date.Month<<"/"<<date.Day<<endl; returnstream;}istream&operator>>(istream&stream,Date&date){ stream>>date.Year>>date.Month>>date.Day; returnstream;}1/4/202342第7章輸入/輸出流對(duì)象classDate12/30/202242第7章輸入/輸出intmain(){ Datedate(2005,11,28); cout<<"Currentdate:"<<date<<endl; cout<<"Enternewdate:"; cin>>date; cout<<"Newdate:"<<date<<endl; return0;}輸出結(jié)果為:Currentdate:2005/11/28Enternewdate:2007129↙Newdate:2007/12/91/4/202343第7章輸入/輸出流對(duì)象intmain()12/30/202243第7章輸入/輸出文件的輸入/輸出如何對(duì)文本文件和二進(jìn)制文件進(jìn)行輸入和輸出操作?1/4/202344第7章輸入/輸出流對(duì)象文件的輸入/輸出如何對(duì)文本文件和二進(jìn)制文件進(jìn)行輸入和輸出操文件的概念
文件一般指的是磁盤文件,它是存儲(chǔ)在磁盤上的相關(guān)數(shù)據(jù)集合。每個(gè)文件都有確定的名字。需要長(zhǎng)久保存并能夠被重新讀寫的信息,將它保存在外存文件上。C++常用的文件有程序文件,數(shù)據(jù)文件以及設(shè)備文件。鍵盤作為標(biāo)準(zhǔn)輸入文件,顯示器作為標(biāo)準(zhǔn)輸出文件。C++標(biāo)準(zhǔn)庫提供了相關(guān)的文件操作。對(duì)需要輸入的大批量數(shù)據(jù),可以事先以文件的形式存放在磁盤上,在程序中,從指定的文件中讀取數(shù)據(jù);程序的運(yùn)行結(jié)果也可以寫入磁盤上指定的文件,使用時(shí)再將文件中的數(shù)據(jù)讀入。1/4/202345第7章輸入/輸出流對(duì)象文件的概念文件一般指的是磁盤文件,它是存儲(chǔ)在磁盤上的相關(guān)C++把文件看作是一個(gè)字符(字節(jié))的序列,即由一個(gè)個(gè)字符(字節(jié))數(shù)據(jù)順序組成。文件按存儲(chǔ)格式分二類:一種為字符格式文件,簡(jiǎn)稱字符文件(ASCII碼文件或文本文件),另一種為內(nèi)部格式文件,簡(jiǎn)稱字節(jié)文件(二進(jìn)制文件)字符文件中,每一個(gè)字節(jié)單元的內(nèi)容存放一個(gè)字符的ASCII碼,能夠直接被顯示和打印。字節(jié)文件中,是把內(nèi)存中的數(shù)據(jù)按其在內(nèi)存中的存儲(chǔ)形式原樣輸出到磁盤文件存放。1/4/202346第7章輸入/輸出流對(duì)象C++把文件看作是一個(gè)字符(字節(jié))的序列,即由一個(gè)個(gè)字符(字兩種文件的比較ASCII碼文件占用字節(jié)多,把內(nèi)存中的數(shù)據(jù)寫入ASCII碼文件或從ASCII碼文件讀數(shù)據(jù)存放在內(nèi)存中,需要轉(zhuǎn)換。二進(jìn)制文件占用字節(jié)少,把內(nèi)存中的數(shù)據(jù)寫入二進(jìn)制文件或從二進(jìn)制文件讀數(shù)據(jù)存放在內(nèi)存中,不需要轉(zhuǎn)換。 例如:10000是整型數(shù)據(jù),用二進(jìn)制表示占兩或四個(gè)字節(jié),如用ASCII碼表示,則占五個(gè)字節(jié)。對(duì)于字符信息,在字符文件和字節(jié)文件中保存的信息是相同的。對(duì)于數(shù)值信息,在字符文件和字節(jié)文件中保存的信息是不同的。1/4/202347第7章輸入/輸出流對(duì)象兩種文件的比較ASCII碼文件占用字節(jié)多,把內(nèi)存中的數(shù)據(jù)寫入文件操作要在程序中使用文件,首先應(yīng)在文件開始包含頭文件:
#include<fstream>在訪問文件之前,用頭文件fstream中提供的輸入文件流類ifstream、輸出文件流類ofstream或輸入輸出文件流類fstream定義一個(gè)文件流類的對(duì)象,然后用該對(duì)象調(diào)用相應(yīng)類中的open成員函數(shù),按照一定的打開方式打開一個(gè)文件。文件被打開后,就可以通過文件流對(duì)象訪問它。文件訪問結(jié)束后,再通過流對(duì)象關(guān)閉它,釋放緩沖區(qū)。1/4/202348第7章輸入/輸出流對(duì)象文件操作要在程序中使用文件,首先應(yīng)在文件開始包含頭文件:12文件操作的一般步驟
為文件定義一個(gè)流類對(duì)象;使用open()函數(shù)建立(或打開)文件。如果文件不存在,則建立該文件;如果磁盤上已存在該文件,則打開該文件;進(jìn)行讀寫操作。在建立(或打開)的文件上執(zhí)行所要求的輸入/輸出操作。一般來說,在內(nèi)存與外設(shè)的數(shù)據(jù)傳輸中,由內(nèi)存到外設(shè)稱為輸出或?qū)?,反之則稱為輸入或讀;使用close()函數(shù)關(guān)閉文件。當(dāng)完成操作后,應(yīng)把打開的文件關(guān)閉,避免誤操作。1/4/202349第7章輸入/輸出流對(duì)象文件操作的一般步驟為文件定義一個(gè)流類對(duì)象;12/30/20文件的打開每個(gè)文件流類都有一個(gè)open成員函數(shù),并且具有完全相同的聲明格式,具體聲明格式為:
voidopen(constchar*fname,intmode,intaccess); 其中,fname指向要打開文件的文件名字符串,mode指定打開文件的方式,對(duì)應(yīng)的實(shí)參是ios類中定義的open_mode枚舉類型中的枚舉常量,或由這些枚舉常量構(gòu)成的按位或表達(dá)式,access指定文件的訪問方式。在C++中,打開一個(gè)文件就是將這個(gè)文件與對(duì)應(yīng)流對(duì)象建立關(guān)聯(lián);1/4/202350第7章輸入/輸出流對(duì)象文件的打開每個(gè)文件流類都有一個(gè)open成員函數(shù),并且具有完全1/4/202351第7章輸入/輸出流對(duì)象12/30/202251第7章輸入/輸出流對(duì)象定義文件流對(duì)象和打開文件舉例:1)ofstreamfout; fout.open(“a:\\data1.dat”);2)ifstreamfin;fin.open(“a:\\data1.dat”,ios::in|ios::nocreat);3)ofstreamofs;ofs.open(“a:\\data1.dat”,ios::app);4)fstreamfio;fio.open(“a:\\data1.dat”,ios::out|ios::binary);1/4/202352第7章輸入/輸出流對(duì)象定義文件流對(duì)象和打開文件舉例:12/30/202252第7章文件的關(guān)閉每個(gè)文件流類中都提供有一個(gè)關(guān)閉文件的成員函數(shù)close,當(dāng)打開的文件操作結(jié)束后,就需要關(guān)閉它,使文件流與對(duì)應(yīng)的物理文件斷開聯(lián)系。關(guān)閉任何一個(gè)流對(duì)象所對(duì)應(yīng)的文件,就是用這個(gè)流對(duì)象調(diào)用close成員函數(shù)。文件流對(duì)應(yīng)的文件被關(guān)閉后,還可以利用該文件流調(diào)用open成員函數(shù)打開其他的文件。
ofstreamfout; fout.open(“a:\\data1.dat”); …… fout.close();1/4/202353第7章輸入/輸出流對(duì)象文件的關(guān)閉每個(gè)文件流類中都提供有一個(gè)關(guān)閉文件的成員函數(shù)clo文件指針
對(duì)于每個(gè)打開的文件,都存在著一個(gè)文件指針,初始指向一個(gè)隱含的位置,該位置由具體打開方式?jīng)Q定。 對(duì)文件的讀寫都是從當(dāng)前文件指針?biāo)傅奈恢瞄_始,在讀寫過程中,文件指針順序后移。文件的結(jié)束標(biāo)志 每個(gè)文件都有一個(gè)結(jié)束標(biāo)志。當(dāng)文件指針移到文件的結(jié)束標(biāo)志處時(shí),表示文件結(jié)束。1/4/202354第7章輸入/輸出流對(duì)象文件指針12/30/202254第7章輸入/輸出流對(duì)象測(cè)試文件是否結(jié)束,常用的方法有兩種:
1.ASCII碼文件的結(jié)束標(biāo)志用“-1”表示。C++在ios類中用符號(hào)常量“EOF”表示-1,當(dāng)讀取到的字符等于文件結(jié)束符EOF時(shí)表示文件訪問結(jié)束。 2.C++還提供了使用流對(duì)象調(diào)用eof()成員函數(shù)來測(cè)試文件當(dāng)前狀態(tài)是否“文件結(jié)束”。如果eof()的值是非0值,表示文件結(jié)束;如果eof()的值是0,則表示文件沒有結(jié)束。用該方法測(cè)試的文件既可以是ASCII碼文件又可以是二進(jìn)制文件。1/4/202355第7章輸入/輸出流對(duì)象測(cè)試文件是否結(jié)束,常用的方法有兩種:12/30/202255字符文件的訪問操作向字符文件輸出數(shù)據(jù) 指依次把數(shù)據(jù)寫入到文件的末尾(文件結(jié)束符也隨之后移,它始終占據(jù)整個(gè)文件空間的最后一個(gè)字節(jié)位置)。從字符文件輸入數(shù)據(jù) 指從文件開始位置起依次向后提取數(shù)據(jù),直到碰到文件結(jié)束符為止。1/4/202356第7章輸入/輸出流對(duì)象字符文件的訪問操作向字符文件輸出數(shù)據(jù)12/30/202256字符文件的訪問操作向字符文件輸出數(shù)據(jù) 調(diào)用從ostream流類中繼承來的插入操作符重載函數(shù)。 調(diào)用從ostream流類中繼承來的put成員函數(shù)。 聲明格式如下:
ostream&operator<<(簡(jiǎn)單類型); ostream&put(char);1/4/202357第7章輸入/輸出流對(duì)象字符文件的訪問操作向字符文件輸出數(shù)據(jù)12/30/202257字符文件的訪問操作從字符文件輸入數(shù)據(jù) 調(diào)用提取操作符重載成員函數(shù),每次從文件流中提取用空白符隔開的一個(gè)數(shù)據(jù)。 調(diào)用get成員函數(shù),每次從文件流中提取一個(gè)字符并作為返回值返回。 調(diào)用getline成員函數(shù),每次從文件流中提取一行字符到字符指針?biāo)赶虻拇鎯?chǔ)空間中。 可以在istream文件中找到上述成員函數(shù)聲明。1/4/202358第7章輸入/輸出流對(duì)象字符文件的訪問操作從字符文件輸入數(shù)據(jù)12/30/202258例字符文件的讀寫#include<iostream>#include<fstream>usingnamespacestd;intmain(){ chars1[8],s2[8]; fstreamoutfile; cin>>s1; outfile.open(“exam.txt”,ios::out); if(!outfile) { cout<<“exam.txtcan’topen”<<endl; } outfile<<s1; outfile.close(); outfile.open(“exam.txt”,ios::in); outfile>>s2; cout<<s2<<endl; outfile.close(); return0;}運(yùn)行結(jié)果:abcd↙abcd1/4/202359第7章輸入/輸出流對(duì)象例字符文件的讀寫運(yùn)行結(jié)果:12/30/202259第7章輸字節(jié)文件的訪問操作字節(jié)文件是指在打開方式中帶有ios::binary選項(xiàng)的文件。向字節(jié)文件輸出數(shù)據(jù) 把內(nèi)存中由指定字符指針?biāo)赶虻木哂幸欢ㄗ止?jié)數(shù)的內(nèi)容原原本本地寫入到文件中,文件指針后移。從字節(jié)文件輸入數(shù)據(jù) 把具有一定字節(jié)數(shù)的內(nèi)容原原本本地拷貝到內(nèi)存中由指定字符指針?biāo)赶虻拇鎯?chǔ)空間中,文件指針后移。1/4/202360第7章輸入/輸出流對(duì)象字節(jié)文件的訪問操作字節(jié)文件是指在打開方式中帶有ios::bi字節(jié)文件的訪問操作通過文件流對(duì)象調(diào)用在istream流類中定義的read成員函數(shù)能夠從文件流對(duì)象所對(duì)應(yīng)的文件中讀出信息。通過文件流對(duì)象調(diào)用在ostream流類中定義的write成員函數(shù)能夠向文件流對(duì)象所對(duì)應(yīng)的文件中寫入信息。這兩個(gè)成員函數(shù)的聲明格式如下:
istream&read(char*buffer,intlen); ostream&write(constchar*buffer,intlen);1/4/202361第7章輸入/輸出流對(duì)象字節(jié)文件的訪問操作通過文件流對(duì)象調(diào)用在istream流類中定例字節(jié)文件的讀寫#include<iostream>#include<fstream>usingnamespacestd;structperson{ charname[20]; doubleheight; unsignedshortage;}people[4]={“wang”,1.65,25,“zhang”,1.78,24,“l(fā)i”,1.85,21,}intmain(){ fstreaminfile,outfile; outfile.open(“exam.dat”,ios::out|ios::binary); if(!outfile) { cout<<“exam.datcan’topen”<<endl; abort(); }1/4/202362第7章輸入/輸出流對(duì)象例字節(jié)文件的讀寫12/30/202262第7章輸入/輸出流 for(inti=0;i<4;i++) outfile.write((char*)&people[i],sizeof(people[i])); outfile.close(); infile.open(“exam.dat”,ios::in|ios::binary); if(!infile) { cout<<“exam.datcan’topen”<<endl; abort(); } for(intj=0;j<4;j++){ infile.read((char*)&people[j],sizeof(people[j])); cout<<people[j].name<<“\t”<<people[j].height <<“\t”<<people[j].age<<endl; } infile.close(); return0;}運(yùn)行結(jié)果:wang 1.65 25zhang 1.78 24Li 1.85 21 0 01/4/202363第7章輸入/輸出流對(duì)象 for(inti=0;i<4;i++)運(yùn)行結(jié)果:12/3文件的隨機(jī)讀寫C++文件都是流文件,隨機(jī)文件的讀寫與文件指針相關(guān),文件指針記錄著文件流的當(dāng)前位置。有3個(gè)成員函數(shù)能對(duì)文件指針進(jìn)行操作:
istream&istream::seekg(<流文件中位置>);
istream&istream::seekp(<偏移量>,<參照位置>); streamposistream::tellg(); 其中,streampos被定義為long型量,<流文件中位置><偏移量>都是long型量,并以字節(jié)為單位。<參照位置>具有如下含義: ios:cur,相對(duì)于當(dāng)前讀指針?biāo)付ǖ奈恢茫?ios:beg,相對(duì)于流的開始位置; ios:end,相對(duì)于流的結(jié)尾處;1/4/202364第7章輸入/輸出流對(duì)象文件的隨機(jī)讀寫C++文件都是流文件,隨機(jī)文件的讀寫與文件指針例文件的隨機(jī)讀寫#include<iostream>#include<fstream>usingnamespacestd;intmain(){ fstreamfile(“exam.dat”,ios::in|ios::out|ios::binary); if(!file) { cout<<“exam.datcan’topen”<<endl; abort(); } for(inti=0;i<15;i++) file.write((char*)&i,sizeof(int)); streampospos=file.tellp(); cout<<“currentbytenumber:”<<pos<<endl; for(i=15;i<45;i++) file.write((char*)&i,sizeof(int));
1/4/202365第7章輸入/輸出流對(duì)象例文件的隨機(jī)讀寫12/30/202265第7章輸入/輸出流 file.seekg(pos); file.read((char*)&i,sizeof(int)); cout<<“thedatastoredis”<<i<<endl; file.seekp(0,ios::beg); for(i=80;i<100;i++) file.write((char*)&i,sizeof(int)); file.seekg(pos); file.read((char*)&i,sizeof(int)); cout<<“thedatastoredis”<<i<<endl; file.seekg(20,ios::cur); file.read((char*)&i,sizeof(int)); cout<<“thedatastoredis”<<i<<endl; cout<<“currentbytenumber:”<<file.tellg()<<endl; return0;}seekg就是seekget,seekp是seekput,前者用于ifstream對(duì)象,后者用于ofstream對(duì)象,但是在ftream對(duì)象里,兩者沒有區(qū)別。運(yùn)行結(jié)果:currentbytenumber:60thedatastoredis15thedatastoredis95thedatastoredis21currentbytenumber:881/4/202366第7章輸入/輸出流對(duì)象 file.seekg(pos);運(yùn)行結(jié)果:12/30/20下面程序用istream和ostream類的操作符對(duì)點(diǎn)數(shù)據(jù)進(jìn)行文件操作,從鍵盤上輸入兩個(gè)點(diǎn)的坐標(biāo),把它保存到磁盤文件上,并從磁盤上讀出數(shù)據(jù),輸出到顯示器上。#include<iostream>#include<fstream>usingnamesoacestd;classPoint{public: Point(intx,inty){X=x;Y=y;} friendostream&operator<<(ostream&os,Point&aPoint); friendistream&operator>>(istream&is,Point&aPoint);protected: intX; intY;};1/4/202367第7章輸入/輸出流對(duì)象下面程序用istream和ostream類的操作符對(duì)點(diǎn)數(shù)據(jù)進(jìn)ostream&operator<<(ostream&os,Point&aPoint){ os<<"("<<aPoint.X<<","<<aPoint.Y<<")"; returnos;}istream&operator>>(istream&is,Point&aPoint){ is>>“(">>aPoint.X>>",">>aPoint.Y>>")"; returnis;}intmain(){ intx,y; ofstreamwritefile("crest.sav"); if(!writefile) { cout<<"Can'topenfile"; exit(-1); }1/4/202368第7章輸入/輸出流對(duì)象ostream&operator<<(ostream&o cout<<"inputthex,ywithblankseperated:"; cin>>x>>y; PointPoint1(x,y); cout<<"inputx,yofanotherpoint"; cin>>x>>y; PointPoint2(x,y); writefile<<Point1; writefile<<Point2; writefile.close(); ifstreamreadfile("ctest.sav"); if(!readfile) {cout<<"Cannotopenfile";exit(-1); } readfile>>Point1>>Point2; cout<<Point1<<endl; cout<<Point2<<endl; return0;}1/4/202369第7章輸入/輸出流對(duì)象 cout<<"inputthex,ywithbla字符串流C++支持內(nèi)存中的輸入輸出,只要將流對(duì)象與存儲(chǔ)在內(nèi)存中的char*或string捆綁起來即可。針對(duì)char*和string兩種類型的對(duì)象,C++提供了兩種字符串流,一種在<sstream>中定義,另一種在<strstream>中定義,兩者功能基本相同。<strstream>包含istrstream,ostrstream和strstream,是基于C風(fēng)格字符串char*編寫的。<sstream>包含istringstream,ostringstream和stringstream等類,是基于C++中std::string編寫的。1/4/202370第7章輸入/輸出流對(duì)象字符串流C++支持內(nèi)存中的輸入輸出,只要將流對(duì)象與存儲(chǔ)在內(nèi)存字符串流一個(gè)字符串流被定義后就可以調(diào)用相應(yīng)的成員函數(shù)進(jìn)行數(shù)據(jù)的輸入、輸出操作。對(duì)字符串流的操作方法通常與對(duì)字符文件流的操作方法相同。字符串流對(duì)應(yīng)的訪問空間是內(nèi)存中由用戶定義的字符數(shù)組,對(duì)字符串流的操作實(shí)質(zhì)上就是在該數(shù)組上進(jìn)行的。與文件流不同,字符串流對(duì)應(yīng)的字符數(shù)組中沒有相應(yīng)的結(jié)束符標(biāo)志,用戶可以規(guī)定一個(gè)特殊字符作為其結(jié)束符使用。1/4/202371第7章輸入/輸出流對(duì)象字符串流一個(gè)字符串流被定義后就可以調(diào)用相應(yīng)的成員函數(shù)進(jìn)行數(shù)據(jù)例字符串流對(duì)象的讀寫#include<iostream>#include<sstream>#include<string>usingnamespacestd;intmain(){ stringstreamostr("ccc"); ostr.put('d'); ostr.put('e'); ostr<<"fg"; stringgstr=ostr.str(); cout<<gstr<<endl; chara; ostr>>a; cout<<a<<endl; return0;}運(yùn)行結(jié)果:defgd1/4/202372第7章輸入/輸出流對(duì)象例字符串流對(duì)象的讀寫運(yùn)行結(jié)果:12/30/202272第7例字符串流對(duì)象用于類型轉(zhuǎn)換#include<iostream>#include<sstream>#include<string>usingnamespacestd;intmain(){ stringstreamsstr; inta=100; stringstr; sstr<<a; sstr>>str; cout<<str<<endl; sstr.clear();//每一次轉(zhuǎn)換后必須調(diào)用clear()成員函數(shù) stringname="colinguan"; charcname[200]; sstr<<name; sstr>>cname; cout<<cname<<endl; return0;}運(yùn)行結(jié)果:100colinguan1/4/202373第7章輸入/輸出流對(duì)象例字符串流對(duì)象用于類型轉(zhuǎn)換運(yùn)行結(jié)果:12/30/20227小結(jié)C++標(biāo)準(zhǔn)庫提供了一組類簇來處理輸入輸出: iostream類處理面向流的輸入輸出; fstream類處理面向文件的輸入輸出; stringstream類處理內(nèi)存中字符串的輸入輸出;所有這些類都是通過繼承相互關(guān)聯(lián)的,輸入類繼承了istream,輸出類繼承了ostream,輸入輸出類繼承了iostream,可在基類對(duì)象上執(zhí)行的操作同樣適用于派生類對(duì)象。1/4/202374第7章輸入/輸出流對(duì)象小結(jié)C++標(biāo)準(zhǔn)庫提供了一組類簇來處理輸入輸出:12/30/2《面向?qū)ο蟪绦蛟O(shè)計(jì)》七、輸入/輸出流對(duì)象1/4/202375第7章輸入/輸出流對(duì)象《面向?qū)ο蟪绦蛟O(shè)計(jì)》七、輸入/輸出流對(duì)象12/30/2022內(nèi)容提要螺旋矩陣的輸入/輸出問題流無格式輸入/輸出輸入/輸出的格式控制自定義類型對(duì)象的輸入輸出文件的輸入/輸出問題1/4/202376第7章輸入/輸出流對(duì)象內(nèi)容提要螺旋矩陣的輸入/輸出問題12/30/20222提出問題編程輸出M*M的螺旋矩陣,要求數(shù)據(jù)間距與M相同。例如,4*4的螺旋矩陣,其間距為4:
123412131451116156109871/4/202377第7章輸入/輸出流對(duì)象提出問題編程輸出M*M的螺旋矩陣,要求數(shù)據(jù)間距與M相同。例如分析問題C++沒有定義任何用于執(zhí)行輸入或輸出的語句,但可以使用C語言中的標(biāo)準(zhǔn)I/O函數(shù)printf()和scanf()來解決此問題。1/4/202378第7章輸入/輸出流對(duì)象分析問題C++沒有定義任何用于執(zhí)行輸入或輸出的語句,但可以使【例】有如下程序:#include<stdio.h>intb=20;floata=5.6;intmain(){printf("%d\n",a);scanf("%d",&a);scanf("%d",&b);printf("%d\n","abc");return0;}該程序的運(yùn)行結(jié)果為:161061273623↙45↙43499801/4/202379第7章輸入/輸出流對(duì)象【例】有如下程序:該程序的運(yùn)行結(jié)果為:12/30/20225printf()與scanf()存在以下兩個(gè)缺點(diǎn):1.非類型安全2.不可擴(kuò)充性classA{…}Aa;…printf("%?",a);//不知用什么格式符來識(shí)別A的對(duì)象1/4/202380第7章輸入/輸出流對(duì)象printf()與scanf()存在以下兩個(gè)缺點(diǎn):12/30C++用I/O流來解決這個(gè)問題。下面先介紹流的概念。1/4/202381第7章輸入/輸出流對(duì)象C++用I/O流來解決這個(gè)問題。12/30/20227第7章流的概念在C++程序中,數(shù)據(jù)可以從外部設(shè)備(鍵盤等)流入到計(jì)算機(jī)內(nèi)存中,也可以從計(jì)算機(jī)內(nèi)存流向外部設(shè)備(屏幕或磁盤文件等),這種數(shù)據(jù)傳遞被稱作輸入輸出。C++將數(shù)據(jù)從一個(gè)位置到另一個(gè)位置的傳遞抽象為流。所謂流(stream)就是指數(shù)據(jù)從一個(gè)位置流向另一個(gè)位置。流是字節(jié)的序列。C++的輸入輸出操作是基于流來處理的。1/4/202382第7章輸入/輸出流對(duì)象流的概念在C++程序中,數(shù)據(jù)可以從外部設(shè)備(鍵盤等)流入到I/O流操作C++基于流的概念處理數(shù)據(jù)的輸入輸出,因此也稱之為輸入輸出流,即I/O流。I/O流具有兩個(gè)基本的行為特征,一是從流中獲取數(shù)據(jù)的操作稱為提取操作,二是向流中添加數(shù)據(jù)的操作稱為插入操作。1/4/202383第7章輸入/輸出流對(duì)象I/O流操作C++基于流的概念處理數(shù)據(jù)的輸入輸出,因此也稱之I/O流類C++標(biāo)準(zhǔn)庫圍繞流的概念,提供了一整套I/O流類簇,既可用于標(biāo)準(zhǔn)類型數(shù)據(jù)的I/O,也能用于自定義類型對(duì)象的I/O,這種擴(kuò)展性是C++最有價(jià)值的特點(diǎn)之一。C++標(biāo)準(zhǔn)庫提供的I/O流類的各種操作都是類型安全(typesafe)的。不同類型的I/O流操作都是重載的,沒有定義過I/O功能的類型不具備I/O操作的能力。1/4/202384第7章輸入/輸出流對(duì)象I/O流類C++標(biāo)準(zhǔn)庫圍繞流的概念,提供了一整套I/O流類簇I/O流類簇的層次結(jié)構(gòu)C++標(biāo)準(zhǔn)庫提供的I/O流類簇有兩個(gè)平行基類:streambuf(filebuf,stringbuf,strstreambuf)ios(istream,ostream)ios類有下面直接派生類:輸入流類istream (ifstream,istringstream,istrstream)輸出流類ostream (ofstream,ostringstream,ostrstream)(iostream->fstream,stringstream,strstream)1/4/202385第7章輸入/輸出流對(duì)象I/O流類簇的層次結(jié)構(gòu)C++標(biāo)準(zhǔn)庫提供的I/O流類簇有兩個(gè)I/O流分類C++標(biāo)準(zhǔn)庫提供的I/O流按功能可分為如下3類:標(biāo)準(zhǔn)I/O流:內(nèi)存與標(biāo)準(zhǔn)輸入輸出設(shè)備(鍵盤、屏幕)之間數(shù)據(jù)的傳遞;文件I/O流:內(nèi)存與外部磁盤文件之間數(shù)據(jù)的傳遞;字符串I/O流:內(nèi)存變量與表示字符串流的字符數(shù)組之間數(shù)據(jù)的傳遞。1/4/202386第7章輸入/輸出流對(duì)象I/O流分類C++標(biāo)準(zhǔn)庫提供的I/O流按功能可分為如下3類:標(biāo)準(zhǔn)I/O流對(duì)象標(biāo)準(zhǔn)I/O流預(yù)定義了4個(gè)流類對(duì)象:cin、cout、cerr、clog。操作系統(tǒng)給把外設(shè)用文件名的方式進(jìn)行管理,因此程序設(shè)計(jì)要訪問外設(shè)就跟訪問文件一樣方便。
1/4/202387第7章輸入/輸出流對(duì)象標(biāo)準(zhǔn)I/O流對(duì)象標(biāo)準(zhǔn)I/O流預(yù)定義了4個(gè)流類對(duì)象:cin、cI/O分為無格式支持的低級(jí)I/O和具有格式支持的高級(jí)I/O。無格式支持的低級(jí)I/O以基本字節(jié)為操作對(duì)象,有格式支持的高級(jí)I/O把若干字節(jié)組合成有意義的單位,如整數(shù)、浮點(diǎn)數(shù)、字符、字符串及用戶自定義類型等等。1/4/202388第7章輸入/輸出流對(duì)象I/O分為無格式支持的低級(jí)I/O和具有格式支持的高級(jí)I/O。無格式輸入/輸出無格式輸入/輸出就是按系統(tǒng)預(yù)定義的格式進(jìn)行的輸入/輸出。按默認(rèn)約定,每個(gè)C++程序都能使用標(biāo)準(zhǔn)I/O流,如標(biāo)準(zhǔn)輸入、標(biāo)準(zhǔn)輸出。cin用來處理標(biāo)準(zhǔn)輸入,即鍵盤輸入;cout用來處理標(biāo)準(zhǔn)輸出,即屏幕輸出。它們被定義在iostream頭文件中。在使用cout和cin前,要用編譯預(yù)處理命令將所使用的頭文件包含到源程序中,其格式如下:
#include<iostream>1/4/202389第7章輸入/輸出流對(duì)象無格式輸入/輸出無格式輸入/輸出就是按系統(tǒng)預(yù)定義的格式進(jìn)行無格式輸出“<<”是預(yù)定義的插入運(yùn)算符,作用在流類對(duì)象cout上,實(shí)現(xiàn)默認(rèn)格式的屏幕輸出。使用cout輸出表達(dá)式值到屏幕上的格式如下:
cout<<E1<<E2<<…<<Em; 其中,E1、E2、…、Em為均為表達(dá)式。功能是計(jì)算各表達(dá)式的值,并將結(jié)果輸出到屏幕當(dāng)前光標(biāo)位置處。1/4/202390第7章輸入/輸出流對(duì)象無格式輸出“<<”是預(yù)定義的插入運(yùn)算符,作用在流類對(duì)象co無格式輸出cout是ostream流類的對(duì)象,它在iostream頭文件中作為全局對(duì)象定義,其格式如下: ostreamcout(stdout); 其中,stdout表示標(biāo)準(zhǔn)輸出設(shè)備名(屏幕)。在ostream流類中,對(duì)應(yīng)每個(gè)基本數(shù)據(jù)類型定義運(yùn)算符“<<”重載函數(shù)為友元,它們?cè)趏stream中聲明:ostream&operator<<(ostream&dest,char*pSource);ostream&operator<<(ostream&dest,intsource);ostream&operator<<(ostream&dest,charsource);1/4/202391第7章輸入/輸出流對(duì)象無格式輸出cout是ostream流類的對(duì)象,它在iost無格式輸入“>>”是預(yù)定義的提取運(yùn)算符,作用在流類對(duì)象cin上,實(shí)現(xiàn)默認(rèn)格式的鍵盤輸入。使用cin將數(shù)據(jù)輸入到變量的格式如下:
cin>>V1>>V2>>…>>Vn;
其中,V1、V2、…、Vn都是變量。功能是暫停執(zhí)行程序,等待用戶從鍵盤輸入數(shù)據(jù),各數(shù)據(jù)間用空格或Tab鍵分隔,輸入數(shù)據(jù)類型要與接受變量類型一致,輸完后,按回車鍵結(jié)束。1/4/202392第7章輸入/輸出流對(duì)象無格式輸入“>>”是預(yù)定義的提取運(yùn)算符,作用在流類對(duì)象ci無格式輸入cin是istream流類的對(duì)象,它在iostream頭文件中作為全局對(duì)象定義,其格式如下: istreamcin(stdin);在istream流類中,對(duì)應(yīng)每個(gè)基本數(shù)據(jù)類型定義運(yùn)算符“>>”重載函數(shù)為友元,它們?cè)趇stream中聲明: istream&operator>>(istream&sour,char*pDes); istream&operator>>(istream&sour,intdes); istream&operator>>(istream&sour,chardes);1/4/202393第7章輸入/輸出流對(duì)象無格式輸入cin是istream流類的對(duì)象,它在iostr輸入輸出的格式控制C++提供了兩種格式化輸入/輸出方式:一種是用ios類成員函數(shù)進(jìn)行格式化輸入輸出另一種是用專門的操作符函數(shù)進(jìn)行格式化輸入輸出1/4/202394第7章輸入/輸出流對(duì)象輸入輸出的格式控制C++提供了兩種格式化輸入/輸出方式:1用ios類成員函數(shù)格式化ios類成員函數(shù)主要是通過對(duì)狀態(tài)標(biāo)志、輸出寬度、填充字符以及輸出精度的操作來完成輸入/輸出格式化。輸入輸出格式由各種狀態(tài)標(biāo)志來確定,這些狀態(tài)標(biāo)志在ios類中定義為枚舉量。由于該枚舉量定義在ios類中,因此引用時(shí)必須包含ios::前綴。使用時(shí)應(yīng)該全部用符號(hào)名,絕不要用數(shù)值。1/4/202395第7章輸入/輸出流對(duì)象用ios類成員函數(shù)格式化ios類成員函數(shù)主要是通過對(duì)狀態(tài)enum{ skipws=0x0001, //跳過輸入空格 left=0x0002, //按左對(duì)齊格式輸出 right=0x0004, //按右對(duì)齊格式輸出 internal=0x0008, //輸出符號(hào)和基指示符后的填補(bǔ) dec=0x0010, //轉(zhuǎn)換為十進(jìn)制(In/Out) oct=0x0020, //轉(zhuǎn)換為八進(jìn)制(In/Out) hex=0x0040, //轉(zhuǎn)換為十六進(jìn)制(In/Out) showbase=0x0080, //輸出顯示基指示符 showpoint=0x0100, //輸出顯示小數(shù)點(diǎn) uppercase=0x0200, //大寫十六進(jìn)制輸出 showpos=0x0400, //正整數(shù)顯示前加上“+” scientific=0x0800, //輸出用科學(xué)表示法表示的浮點(diǎn)數(shù) fixed=0x1000, //輸出用固定小數(shù)點(diǎn)表示的浮點(diǎn)數(shù) unitbuf=0x2000, //在輸出操作后刷新所有流 stdio=0x4000 //在輸出操作后刷新stdout和stderr}這些標(biāo)志可以由ios類成員函數(shù)訪問,也可以用操作符函數(shù)訪問。1/4/202396第7章輸入/輸出流對(duì)象enum12/30/202222第7章輸入/輸出流對(duì)象用ios成員函數(shù)對(duì)狀態(tài)標(biāo)志進(jìn)行操作ios類有3個(gè)成員函數(shù)可以對(duì)狀態(tài)標(biāo)志進(jìn)行操作,分別為flags()、setf()和unsetf(),并且ios類還定義了一個(gè)long型數(shù)據(jù)成員記錄當(dāng)前狀態(tài)標(biāo)志。這些狀態(tài)標(biāo)志可用位或運(yùn)算符“|”進(jìn)行組合。用setf函數(shù)設(shè)置狀態(tài)標(biāo)志,其一般格式如下:
longios::setf(longflags)1/4/202397第7章輸入/輸出流對(duì)象用ios成員函數(shù)對(duì)狀態(tài)標(biāo)志進(jìn)行操作ios類有3個(gè)成員函數(shù)可用ios成員函數(shù)對(duì)狀態(tài)標(biāo)志進(jìn)行操作用unsetf函數(shù)清除狀態(tài)標(biāo)志,其一般格式如下:
longios::unsetf(longflags)用函數(shù)flags取狀態(tài)標(biāo)志有兩種形式,其一般格式分別如下: longios::flags() longios::flags(longflag)
第一種形式返回與流相關(guān)的當(dāng)前狀態(tài)標(biāo)志值;第二種形式將流的狀態(tài)標(biāo)志值設(shè)置為flag,并返回設(shè)置前的狀態(tài)標(biāo)志值。1/4/202398第7章輸入/輸出流對(duì)象用ios成員函數(shù)對(duì)狀態(tài)標(biāo)志進(jìn)行操作用unsetf函數(shù)清除狀態(tài)例使用ios成員函數(shù)操作狀態(tài)字voidshowflags(longf);voidmain(){ longf; f=cout.flags();//取當(dāng)前狀態(tài)標(biāo)志 showflags(f);//顯示狀態(tài)值 cout.setf(ios::showpos|ios::scientific|ios::fixed); //追加狀態(tài)標(biāo)志 f=cout.flags();//取當(dāng)前狀態(tài)標(biāo)志 showflags(f);//顯示狀態(tài)值 cout.unsetf(ios::scientific);//從狀態(tài)標(biāo)志中去掉標(biāo)志 f=cout.flags();//取當(dāng)前狀態(tài)標(biāo)志 showflags(f);//顯示狀態(tài)值 f=cout.flags(ios::hex);//重新設(shè)置狀態(tài)標(biāo)志 showflags(f); f=cout.flags();//取當(dāng)前狀態(tài)標(biāo)志 showflags(f);}1/4/202399第7章輸入/輸出流對(duì)象例使用ios成員函數(shù)操作狀態(tài)字12/30/202225第7用ios成員函數(shù)設(shè)置輸出寬度設(shè)置輸出寬度函數(shù)有兩種形式,其一般格式分別如下:
intios::width(intlen) intios::width() 第一種形式是設(shè)置輸出寬度,并返回原來的輸出寬度;第二種形式是返回當(dāng)前輸出寬度,輸出寬度為0。1/4/2023100第7章輸入/輸出流對(duì)象用ios成員函數(shù)設(shè)置輸出寬度設(shè)置輸出寬度函數(shù)有兩種形式,其一例使用width控制輸出寬度#include<iostream>usingnamesoacestd;intmain(){ doublevalues[]={1.23,35.36,653.7,4358.24};for(inti=0;i<4;i++){cout.width(10);cout<<values[i]<<'\n';}}輸出結(jié)果:1.2335.36653.74358.241/4/2023101第7章輸入/輸出流對(duì)
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(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ì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 二零二五版國(guó)際物流運(yùn)輸服務(wù)電子合同風(fēng)險(xiǎn)評(píng)估與管理3篇
- 西安歐亞學(xué)院《鉆井液工藝原理》2023-2024學(xué)年第一學(xué)期期末試卷
- 2025年度廚師團(tuán)隊(duì)培訓(xùn)與績(jī)效評(píng)估合同3篇
- 武漢大學(xué)《鋼琴與伴奏》2023-2024學(xué)年第一學(xué)期期末試卷
- 二零二五版人工智能教育合資協(xié)議范本3篇
- 二零二五版建筑行業(yè)工人薪資保障合同范本2篇
- 二零二五年度冷鏈物流車隊(duì)運(yùn)輸合作協(xié)議3篇
- 2024版砌體工程建筑承包合同細(xì)則版B版
- 二零二五年知識(shí)產(chǎn)權(quán)侵權(quán)糾紛調(diào)解與法律咨詢協(xié)議3篇
- 二零二五年房地產(chǎn)項(xiàng)目?jī)r(jià)值評(píng)估與增值服務(wù)合同3篇
- GB/T 45102-2024機(jī)采棉采收技術(shù)要求
- 2025年海南省鹽業(yè)集團(tuán)有限公司招聘筆試參考題庫含答案解析
- 2024-2025學(xué)年成都市高一上英語期末考試題(含答案和音頻)
- 2024年南通職業(yè)大學(xué)單招職業(yè)技能測(cè)試題庫有答案解析
- 2024股權(quán)融資計(jì)劃
- 西式面點(diǎn)師試題與答案
- 鋼結(jié)構(gòu)連廊專項(xiàng)吊裝方案(通過專家論證)
- 50MWp漁光互補(bǔ)光伏電站項(xiàng)目錘樁施工方案
- 2025免疫規(guī)劃工作計(jì)劃
- 初二家長(zhǎng)會(huì)課件下載
- 食品安全知識(shí)培訓(xùn)
評(píng)論
0/150
提交評(píng)論