輸入輸出流類_第1頁
輸入輸出流類_第2頁
輸入輸出流類_第3頁
輸入輸出流類_第4頁
輸入輸出流類_第5頁
已閱讀5頁,還剩36頁未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

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

文檔簡介

1、第11章 輸入輸出流類1外部設(shè)備可分為人機(jī)交互設(shè)備和存儲(chǔ)設(shè)備兩個(gè)大類。人機(jī)交互設(shè)備主要指鍵盤、顯示器等終端控制臺(tái)設(shè)備和打印機(jī)。存儲(chǔ)設(shè)備指磁帶、磁(軟、硬)盤、光盤等以文件形式存儲(chǔ)持久數(shù)據(jù)的設(shè)備。2早期程序設(shè)計(jì)語言中通常以文件方式來統(tǒng)一人機(jī)交互設(shè)備和存儲(chǔ)設(shè)備的輸入輸出操作。即將人機(jī)交互設(shè)備當(dāng)作一種特殊文件對(duì)待。 以文件方式統(tǒng)一管理外部設(shè)備可以屏蔽實(shí)際物理設(shè)備的差異,有利于整體上簡化程序設(shè)計(jì)語言與外部設(shè)備交換信息的處理過程。3C+語言對(duì)輸入輸出的處理引入了“流”這個(gè)比文件抽象程度更高的概念。輸入輸出操作被看作數(shù)據(jù)在源設(shè)備對(duì)象與目標(biāo)設(shè)備對(duì)象之間的流動(dòng)。C+中完成輸入輸出操作的類稱為流類,并提供了可重

2、用的流類庫。411. 1 C+流庫結(jié)構(gòu)標(biāo)準(zhǔn)ANSI C程序中的絕大部分工作是由ANSI C標(biāo)準(zhǔn)庫中的printf,scanf完成的,I/O功能作為ANSI C標(biāo)準(zhǔn)庫功能的一部分被提供。在C+中iostream庫提供了printf、scanf功能的替代方法,輸入輸出功能的實(shí)現(xiàn)由一個(gè)iostream對(duì)象完成。51 流緩沖區(qū)類在C+I/O類庫定義文件iostream.h中有一個(gè)streambuf類,它用來提供物理設(shè)備的接口。緩沖區(qū)由一段預(yù)留的字符存儲(chǔ)空間和兩個(gè)指針組成,兩個(gè)指針分別指向字符要被插入或被取出的位置。 streambuf類定義了一組緩沖或處理流的通用方法,諸如設(shè)置緩沖區(qū),移動(dòng)指針,存、取

3、字符等。 conbufstrstreambufstreambuf圖11.1 流緩沖區(qū)類的派生關(guān)系C+ I/O流類的結(jié)構(gòu)(1)6streambuf類有三個(gè)派生類,其中: (1) conbuf在constream.h中定義,提供光標(biāo)控制、清屏,定義活動(dòng)窗口等控制臺(tái)操作接口和I/O緩沖區(qū)管理功能。 (2) 在fstream.h中定義,它用來維護(hù)文件緩沖區(qū)的打開,關(guān)閉,讀、寫,建立磁盤文件的內(nèi)存代理。 (3)strstreambuf在strstream.h中定義,提供在內(nèi)存進(jìn)行提取和插入操作的緩沖區(qū)管理。72 輸入輸出流類iostream.h中還有以ios類為基類的一組流類的定義。 ios類及其派生類

4、均含有一個(gè)指向streambuf類的指針。通過streambuf類代理物理設(shè)備的操作。從類ios開始,逐級(jí)派生,形成了較為復(fù)雜的結(jié)構(gòu),要很好地使用C+流類,必須逐級(jí)了解其父類的public、和protected類型的成員函數(shù)、成員變量。8istream_withassignostream_withassignstrstreambaseifstreamistrstreamofstreamostrstreamfstreamstrstreamiostreamiostream_ withassign istreamostreamfstreambaseios圖11.2 ios類的派生關(guān)系C+ I/O流類

5、的結(jié)構(gòu)(2)9流類分類流類名稱流類作用流基礎(chǔ)類ios所有流類的父類、保存流的狀態(tài)并處理錯(cuò)誤輸入流類istream輸入流基礎(chǔ)類、將流緩沖區(qū)中的字符作格式化和非格式化之間的轉(zhuǎn)換,并輸入。ifstream文件輸入流類istream_withassign為cin輸入流類即操作符輸入流istrstream串輸入流類輸出流類ostream輸出流的基礎(chǔ)類、將流緩沖區(qū)中的數(shù)據(jù)格式化或非格式化轉(zhuǎn)換,并輸出。ofstream文件輸出流類ostream_withassigncout,cerr,clog輸出的流類即操作符” “”進(jìn)行了重載,用于完成對(duì)各種簡單數(shù)據(jù)類型的輸入和輸出。 1311.2.2格式化的輸入輸出C+

6、提供了兩種格式控制函數(shù)用來控制輸入輸出的格式:ios類中定義的格式控制成員函數(shù)基于流對(duì)象的操縱函數(shù)。相比之下操縱函數(shù)使用更為方便。下面重點(diǎn)介紹操縱函數(shù)的概念和用法。141ios 類中定義的格式控制標(biāo)志ios 類中定義了一個(gè)數(shù)據(jù)成員:格式控制標(biāo)志字long x_flags。x_flags每一位的狀態(tài)值用枚舉符號(hào)常量定義。enum skipws =0 x0001, /跳過輸入空格 left =0 x0002, /輸出左對(duì)齊調(diào)整 right =0 x0004, /輸出右對(duì)齊調(diào)整 internal =0 x0008, /輸出符號(hào)和基指示符后的填補(bǔ) dec =0 x0010, /轉(zhuǎn)換為十進(jìn)制 (in/o

7、ut) oct =0 x0020, /轉(zhuǎn)換為八進(jìn)制 (in/out) hex =0 x0040, /轉(zhuǎn)換為十六進(jìn)制 (in/out) showbase=0 x0080, /輸出顯示基指示符 showpoint=0 x0100, /輸出顯示小數(shù)點(diǎn) uppercase=0 x0200, /大寫十六進(jìn)制輸出 showpos =0 x0400, /正整數(shù)顯示前加上”+” scientific=0 x0800, /輸出用科學(xué)表示法表示浮點(diǎn)數(shù) fixed =0 x1000, /輸出用固定小數(shù)點(diǎn)表示浮點(diǎn)數(shù) unitbuf =0 x2000, /在輸出操作后刷新所有流 stdio =0 x4000 /在輸出后

8、刷新stdout和stderr;15long x_flags = 0 x0080 = 0000 0000 1000 0000輸出顯示基指示符long x_flags = 0 x0003 = 0000 0000 0000 0011跳過輸入空格 & 輸出左對(duì)齊調(diào)整long x_flags = 0 x0083 = 0000 0000 1000 0011跳過輸入空格 & 輸出左對(duì)齊調(diào)整 & 輸出顯示基指示符long x_flags標(biāo)志可以由ios類的成員函數(shù) flags(), setf()和unsetf()訪問,也可以用操縱函數(shù)操作。 162操縱函數(shù)和操縱符操縱函數(shù)分為帶參數(shù)和不帶參數(shù)兩種。不帶參數(shù)的

9、操縱函數(shù)又叫操縱符。操縱符定義在頭文件iostream.h中,操縱函數(shù)定義在頭文件iomanip.h中.17表 11.2 iostream.h中的操縱符 操作符用法舉例結(jié)果說明deccoutdecdecintvar;將整數(shù)轉(zhuǎn)化為十進(jìn)制格式輸出將整數(shù)轉(zhuǎn)化為十進(jìn)制格式輸入hexcouthexhexintvar;將整數(shù)轉(zhuǎn)化為十六進(jìn)制格式輸出將整數(shù)轉(zhuǎn)化為十六進(jìn)制格式輸入octcoutoctoctintvar;將整數(shù)轉(zhuǎn)化為八進(jìn)制格式輸出將整數(shù)轉(zhuǎn)化為八進(jìn)制格式輸入wscinws;忽略輸入流中的空格endlcoutendl;插入換行符,刷新流endscoutends;插入串最后的串結(jié)束符flushcoutf

10、lush;刷新一個(gè)輸入流18表 11.3 iomanip.h中的操縱函數(shù) setprecision(int)coutsetprecision(15)輸出浮點(diǎn)數(shù)精度為6位小數(shù)輸入浮點(diǎn)數(shù)精度為15位小數(shù)setw(int)coutsetw(6)setw(24)buf;輸出數(shù)據(jù)寬度為6輸入數(shù)據(jù)寬度為24setiosflags(long)coutsetioflags(ios:oct| ios:skipws)指定數(shù)據(jù)輸出的格式為十六進(jìn)制格式且用大寫字母輸出指定數(shù)據(jù)輸入的格式為八進(jìn)制格式且跳過輸入中的空白resetiosflags(long)coutresetiosflags(ios:hex)取消數(shù)據(jù)輸出的

11、格式為十進(jìn)制格式取消數(shù)據(jù)輸入的格式為十進(jìn)制格式19例11. 1 操縱符的使用#include #include void main() double values = 1.23, 35.36, 653.7, 4358.24 ; char *names = Zoot, Jimmy, Al, Stan ; cout setiosflags( ios:fixed );/浮點(diǎn)數(shù)使用普通記數(shù)法表示 for ( int i = 0; i 4; i+ ) cout setiosflags( ios:left) /設(shè)置左對(duì)齊 setw(6) /設(shè)置數(shù)據(jù)寬度為6位 namesi resetiosflags( i

12、os:left ) /撤消左對(duì)齊 setw( 10 ) /設(shè)置數(shù)據(jù)寬度為10位 setprecision(1) /設(shè)置浮點(diǎn)數(shù)精度1位 valuesi ”又稱提取運(yùn)算符,流的輸出運(yùn)算符”又稱插入運(yùn)算符,它們都可以重載。21例:用戶定義的日期Date類的輸入輸出。為保持和簡單類型的輸入輸出同樣的形式,需要為Date類重載操作符。由于重載的函數(shù)需要訪問Date類的私有的和受保護(hù)的成員,應(yīng)該把這些重載的函數(shù)定義為Date類的友元。22#include class Dateint mo, da, yr;public: Date( int m, int d, int y ) mo = m; da = d;

13、 yr = y; friend ostream& operator ( istream& is, Date& dt ); ;ostream& operator( ostream& os, Date& dt ) os dt.mo / dt.da / (istream& is, Date& dt ) is dt.mo dt.dadt.yr; return is; /返回流的引用void main() int mo, da, yr; Date dt( 7,1, 1997 ); coutdtmodayr; Date otherdt( mo, da, yr ); cout otherdt dt_inpu

14、t; cout dt_input endl; 例11. 2 用戶定義Date數(shù)據(jù)類中對(duì)流類運(yùn)算符函數(shù)重載23重載操作符函數(shù)時(shí)應(yīng)該注意以下幾點(diǎn):重載的操作符函數(shù)有兩個(gè)參數(shù)。如果重載的是輸出操作符,第一個(gè)參數(shù)是對(duì)流istream類的引用。第二個(gè)參數(shù)是要定義輸入輸出類的引用,也可以是此類的指針。運(yùn)算符重載必須定義為類的友元,因?yàn)樽蟛僮鲾?shù)必須是流類對(duì)象而不是輸入/輸出類的對(duì)象,不能使用隱式左操作數(shù)。 24#查詢復(fù)雜程度復(fù)雜數(shù)據(jù)、有查詢對(duì)象-關(guān)系數(shù)據(jù)庫(ORDB) 簡單數(shù)據(jù)、無查詢文本文件簡單數(shù)據(jù)、無查詢面向?qū)ο髷?shù)據(jù)庫(OODB)簡單數(shù)據(jù)、有查詢關(guān)系式數(shù)據(jù)庫(RDB)2511. 4文件流與文件操作11.

15、4.1 C+ 標(biāo)準(zhǔn)庫文件輸入與輸出標(biāo)準(zhǔn)的C+庫提供了文件輸入輸出功能,它們是以函數(shù)的形式給出的。這里將對(duì)一些常用的函數(shù)如fopen 、fclose 、fwrite、fread等作簡要說明。 標(biāo)準(zhǔn)的C庫對(duì)文件輸入輸出功能函數(shù)定義在 stdio.h 頭文件中,并且定義了一個(gè)FILE型文件結(jié)構(gòu),在每一個(gè)文件被打開時(shí),都有一個(gè)FILE型文件指針與之關(guān)聯(lián),以便保存文件的相關(guān)信息,完成文件的讀寫操作。26對(duì)文件的操作一般分為三個(gè)步驟:(1)使用文件打開函數(shù)對(duì)文件進(jìn)行打開,并與文件指針建立關(guān)系;(2)利用文件指針和寫文件、讀文件函數(shù)對(duì)文件進(jìn)行操作。(3)使用文件關(guān)閉函數(shù),對(duì)文件關(guān)閉。 271 打開文件函數(shù)f

16、open完成文件操作第一步,可使用fopen函數(shù),該函數(shù)定義為: FILE *fopen( const char *, const char *mode );其中參數(shù) 是文件名字符串,mode為文件打開的模式。使用時(shí)注意:1).返回值是返回打開文件的指針,如果文件不存在或者不能找到文件,fopen調(diào)用返 回空指針(NULL)表示為文件打開失敗。 2).參數(shù)mode 可取以下值r 只讀方式打開文件。w 寫方式打開文件,如果文件已經(jīng)存在,其文件中的內(nèi)容被破壞。r+ 讀和寫的方式打開。(文件必須已經(jīng)存在,否則將導(dǎo)致異常) w+讀和寫方式打開一空文件,如果該文件已經(jīng)存在,其內(nèi)容將被破壞。 a+ 為了讀

17、文件和附加新內(nèi)容而打開文件。 t 以文本方式打開文件。 b 二進(jìn)制的方式打開文件。 282. 文件讀寫函數(shù)fread 和fwrite 完成第二步操作,就是要對(duì)文件進(jìn)行讀和寫數(shù)據(jù),一般常用fread 讀文件函數(shù)和fwrite函數(shù), 函數(shù)的使用格式為: size_t fread( void *buffer, size_t size, size_t count, FILE *stream ); size_t fwrite( const void *buffer, size_t size, size_t count, FILE *stream );使用時(shí)注意:(1)fread 函數(shù)讀文件返回文件數(shù)據(jù)記

18、錄的數(shù)目;(2)fwrite 函數(shù)返回實(shí)際寫入文件數(shù)據(jù)記錄的數(shù)目;(3)參數(shù)buffer指向數(shù)據(jù)緩沖區(qū)。fread函數(shù)將讀出的數(shù)據(jù)放在緩沖區(qū)中供程序使用; fwrite函數(shù)將寫入文件的數(shù)據(jù)放在沖區(qū)中以便寫入文件。(4)size為從文件讀出和寫入文件的字節(jié)數(shù)(5)count一次從文件讀出數(shù)據(jù)的最大記錄數(shù)和一次寫入文件的最大記錄數(shù)。(6)stream文件結(jié)構(gòu)指針。fread 函數(shù)為打開文件的針; fwrite 函數(shù)為把數(shù)據(jù)要寫入 文件的指針。293 關(guān)閉文件函數(shù)fclose 完成第三步操作可以使用fclose,其格式為: int fclose( FILE *stream );/ 關(guān)閉流文件(fcl

19、ose) int _fcloseall( void ); /關(guān)閉所有的流(_fcloseall) 使用時(shí)注意: (1)fclose函數(shù)返回值為0 時(shí)表示文件成功關(guān)閉,否則返回值為非0。 (2)fcloseall成功關(guān)閉所打開的文件時(shí),函數(shù)返回值為關(guān)閉文件的總數(shù)。 (3)fclose函數(shù)的參數(shù)為指向FILE結(jié)構(gòu)體的指針。30例11. 3 打開一個(gè)名為 FREAD.OUT 的文件并寫入25 個(gè)字符, 然后將從文件中讀出的字符#include void main() FILE *stream; char list30; int i, numread, numwritten; / 文本模式打開文件并寫

20、數(shù)據(jù) if( (stream = fopen( fread.out, w+t ) != NULL ) for ( i = 0; i 25; i+ ) listi = (char)(z - i); numwritten = fwrite( list, sizeof( char ), 25, stream ); printf( Wrote %d itemsn, numwritten ); fclose( stream ); else printf( Problem opening the filen ); /*讀出25個(gè)字符*/ if( (stream = fopen( fread.out, r+

21、t ) != NULL ) numread = fread( list, sizeof( char ), 25, stream ); printf( Number of items read = %dn, numread ); printf( Contents of buffer = %.25sn, list ); fclose( stream ); else printf( not be openedn );輸出:Wrote 25 itemsNumber of items read = 25Contents of buffer = zyxwvutsrqponmlkjihgfedcb3111.

22、4.2文件輸入輸出流在C +中,對(duì)文件的輸入輸出操作提供了另一種操作方式,即流類庫的文件操作,這些類是ofstream與ifstream文件輸入輸出流類。其對(duì)文件操作也需要上述的三個(gè)步驟。1. 文件的輸出 文件的輸出由ofstream完成,它由ostream類繼承而來(見圖11.2),并繼承了它的操作,因此可以利用ostream重載的操作符函數(shù)和文件打開,從文件中讀數(shù)據(jù)、關(guān)閉文件的函數(shù)。ifstream也提供了構(gòu)造函數(shù):ifstream();ifstream(const cahr_FAR *,int=ios:in,int=);371).文件的打開 第一個(gè)構(gòu)造函數(shù)用于構(gòu)造一個(gè)不帶參數(shù)的流,如果需

23、要可以在用它的open函數(shù)打開一個(gè)文件,下面是open函數(shù)的定義: void open(const signed char_FAR *,int=ios:in,int=);它和第二構(gòu)造函數(shù)的使用同文件的輸入中的文件打開。 2). 文件的數(shù)據(jù)讀出函數(shù) 可以使用istream類的寫數(shù)據(jù)的函數(shù)和操作符把數(shù)據(jù)寫入文件,操作符函數(shù)在前面已經(jīng)介紹,這里實(shí)現(xiàn)寫數(shù)據(jù)的函數(shù)是:class _CRTIMP istream : virtual public ios public: /讀取文件數(shù)據(jù)到字符串內(nèi) inline istream& get(char *,int,char =n); inline istream&

24、 get(unsigned char *,int,char =n); inline istream& get(signed char *,int,char =n); /讀取文件數(shù)據(jù)到字符內(nèi) istream& get(char &); inline istream& get(unsigned char &); inline istream& get( signed char &);istream& get(streambuf&,char =n); /讀取文件一行數(shù)據(jù)到字符串內(nèi) inline istream& getline(char *,int,char =n); inline istream&

25、 getline(unsigned char *,int,char =n); inline istream& getline(signed char *,int,char =n); inline istream& ignore(int =1,int =EOF); /讀取文件數(shù)據(jù)到字符串內(nèi) istream& read(char *,int); inline istream& read(unsigned char *,int); inline istream& read(signed char *,int); int gcount() const return x_gcount; int peek

26、(); istream& putback(char); int sync(); /移動(dòng)輸入文件指針位置 istream& seekg(streampos);istream& seekg(streamoff,ios:seek_dir);/讀取當(dāng)前輸入文件指針位置的值streampos tellg(); 383). 文件的關(guān)閉函數(shù)ifstream類也是從fstreambase類繼承的,可以使用fstreambase類的close();來關(guān)閉文件。39例11. 4使用istream和ostream類的文件操作函數(shù)把一個(gè)文件的內(nèi)容拷貝到另一個(gè)文件。#include #include #include void main() char ch;ifstream fin(“”); /創(chuàng)建一個(gè)輸入流,并和輸入文件聯(lián)系ofstream fout(“”);/創(chuàng)建一輸出流,并和輸出文件聯(lián)系if(!fin) cerr”Cannot open ”;exit(-1); /如果原文件出錯(cuò),顯示信息并退出 if (!fout)cerr”Cant open ”;exi

溫馨提示

  • 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ì)自己和他人造成任何形式的傷害或損失。

最新文檔

評(píng)論

0/150

提交評(píng)論