輸入輸出流類_第1頁
輸入輸出流類_第2頁
輸入輸出流類_第3頁
輸入輸出流類_第4頁
輸入輸出流類_第5頁
已閱讀5頁,還剩36頁未讀 繼續免費閱讀

下載本文檔

版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領

文檔簡介

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

2、用的流類庫。411. 1 C+流庫結構標準ANSI C程序中的絕大部分工作是由ANSI C標準庫中的printf,scanf完成的,I/O功能作為ANSI C標準庫功能的一部分被提供。在C+中iostream庫提供了printf、scanf功能的替代方法,輸入輸出功能的實現由一個iostream對象完成。51 流緩沖區類在C+I/O類庫定義文件iostream.h中有一個streambuf類,它用來提供物理設備的接口。緩沖區由一段預留的字符存儲空間和兩個指針組成,兩個指針分別指向字符要被插入或被取出的位置。 streambuf類定義了一組緩沖或處理流的通用方法,諸如設置緩沖區,移動指針,存、取

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

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

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

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

7、ut) oct =0 x0020, /轉換為八進制 (in/out) hex =0 x0040, /轉換為十六進制 (in/out) showbase=0 x0080, /輸出顯示基指示符 showpoint=0 x0100, /輸出顯示小數點 uppercase=0 x0200, /大寫十六進制輸出 showpos =0 x0400, /正整數顯示前加上”+” scientific=0 x0800, /輸出用科學表示法表示浮點數 fixed =0 x1000, /輸出用固定小數點表示浮點數 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跳過輸入空格 & 輸出左對齊調整long x_flags = 0 x0083 = 0000 0000 1000 0011跳過輸入空格 & 輸出左對齊調整 & 輸出顯示基指示符long x_flags標志可以由ios類的成員函數 flags(), setf()和unsetf()訪問,也可以用操縱函數操作。 162操縱函數和操縱符操縱函數分為帶參數和不帶參數兩種。不帶參數的

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

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

11、格式為十進制格式取消數據輸入的格式為十進制格式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 );/浮點數使用普通記數法表示 for ( int i = 0; i 4; i+ ) cout setiosflags( ios:left) /設置左對齊 setw(6) /設置數據寬度為6位 namesi resetiosflags( i

12、os:left ) /撤消左對齊 setw( 10 ) /設置數據寬度為10位 setprecision(1) /設置浮點數精度1位 valuesi ”又稱提取運算符,流的輸出運算符”又稱插入運算符,它們都可以重載。21例:用戶定義的日期Date類的輸入輸出。為保持和簡單類型的輸入輸出同樣的形式,需要為Date類重載操作符。由于重載的函數需要訪問Date類的私有的和受保護的成員,應該把這些重載的函數定義為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數據類中對流類運算符函數重載23重載操作符函數時應該注意以下幾點:重載的操作符函數有兩個參數。如果重載的是輸出操作符,第一個參數是對流istream類的引用。第二個參數是要定義輸入輸出類的引用,也可以是此類的指針。運算符重載必須定義為類的友元,因為左操作數必須是流類對象而不是輸入/輸出類的對象,不能使用隱式左操作數。 24#查詢復雜程度復雜數據、有查詢對象-關系數據庫(ORDB) 簡單數據、無查詢文本文件簡單數據、無查詢面向對象數據庫(OODB)簡單數據、有查詢關系式數據庫(RDB)2511. 4文件流與文件操作11.

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

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

17、文件和附加新內容而打開文件。 t 以文本方式打開文件。 b 二進制的方式打開文件。 282. 文件讀寫函數fread 和fwrite 完成第二步操作,就是要對文件進行讀和寫數據,一般常用fread 讀文件函數和fwrite函數, 函數的使用格式為: 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 );使用時注意:(1)fread 函數讀文件返回文件數據記

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

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

20、數據 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個字符*/ 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 +中,對文件的輸入輸出操作提供了另一種操作方式,即流類庫的文件操作,這些類是ofstream與ifstream文件輸入輸出流類。其對文件操作也需要上述的三個步驟。1. 文件的輸出 文件的輸出由ofstream完成,它由ostream類繼承而來(見圖11.2),并繼承了它的操作,因此可以利用ostream重載的操作符函數和文件打開,從文件中讀數據、關閉文件的函數。ifstream也提供了構造函數:ifstream();ifstream(const cahr_FAR *,int=ios:in,int=);371).文件的打開 第一個構造函數用于構造一個不帶參數的流,如果需

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

24、 get(unsigned char *,int,char =n); inline istream& get(signed char *,int,char =n); /讀取文件數據到字符內 istream& get(char &); inline istream& get(unsigned char &); inline istream& get( signed char &);istream& get(streambuf&,char =n); /讀取文件一行數據到字符串內 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); /讀取文件數據到字符串內 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(); /移動輸入文件指針位置 istream& seekg(streampos);istream& seekg(streamoff,ios:seek_dir);/讀取當前輸入文件指針位置的值streampos tellg(); 383). 文件的關閉函數ifstream類也是從fstreambase類繼承的,可以使用fstreambase類的close();來關閉文件。39例11. 4使用istream和ostream類的文件操作函數把一個文件的內容拷貝到另一個文件。#include #include #include void main() char ch;ifstream fin(“”); /創建一個輸入流,并和輸入文件聯系ofstream fout(“”);/創建一輸出流,并和輸出文件聯系if(!fin) cerr”Cannot open ”;exit(-1); /如果原文件出錯,顯示信息并退出 if (!fout)cerr”Cant open ”;exi

溫馨提示

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

評論

0/150

提交評論