日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

流和流库[给初学者非常有用]

發(fā)布時間:2025/3/15 编程问答 14 豆豆
生活随笔 收集整理的這篇文章主要介紹了 流和流库[给初学者非常有用] 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

流和流庫

概 述?
????? 在C語言中,輸入/輸出系統(tǒng)的特點是缺乏類型檢查機制。如printf函數(shù),在格式控制字符串后的參數(shù),即使類型和個數(shù)與其不匹配,編譯是不會出錯,但運行時會得到錯誤的結(jié)果。C++提供了新的輸入/輸出方式。其主要目標(biāo)是建立一個類型安全,擴展性好的輸入/輸出系統(tǒng)。在一個類型安全的輸入/輸出系統(tǒng)中,類似上述printf的錯誤在編譯時就可發(fā)現(xiàn)。一個理想的可擴展的輸入/輸出系統(tǒng)必須能以兩種方式進(jìn)行擴展:
????? 1.能夠包含用戶定義的數(shù)據(jù)類型。
????? 2.能夠包含新的輸入/輸出方法。
???? 在C++中輸入/輸出流庫充分利用了C++的面向?qū)ο蟮奶匦詫崿F(xiàn)了上述目標(biāo)。


流的概念?
???????? 所謂是指數(shù)據(jù)從一個位置流向另一個位置。流是C++為輸入/輸出提供的一組類,都放在流庫中。流總是與某一設(shè)備相聯(lián)系(例如,鍵盤,屏幕或硬盤等),通過使用流類中定義的方法,就可以完成對這些設(shè)備的輸入/輸出操作。一般,若要在流中存儲數(shù)據(jù),這個流為輸出流;要從流中讀取數(shù)據(jù),這個流為輸入流。有的流既是輸入流,又是輸出流。流類形成的層次結(jié)構(gòu)就構(gòu)成流類庫,即流庫。與C 語言中的輸入/輸出流庫一樣,C++的輸入輸出流庫不是語言的一部分,而是作為一個獨立的函數(shù)庫提供的。因此,在使用時需要包含相應(yīng)的頭文件。
???? 輸入流和輸出流:在編寫程序時,常要輸入一些數(shù)據(jù),在處理完數(shù)據(jù)之后,有要把結(jié)果輸出. c++ 沒有專門的輸入輸出語句,輸入輸出都有流庫來處理.通過輸出流,擁護(hù)可以從這些設(shè)備中讀取數(shù)據(jù);通過輸出流則可以往設(shè)備中寫數(shù)據(jù).
???? 輸出流:我們用cout輸出過數(shù)據(jù).實質(zhì)上.cout 就是輸出流類ostream的派生類預(yù)定義的一個對象.它與標(biāo)準(zhǔn)輸出設(shè)備相聯(lián)系,以便把數(shù)據(jù)送往屏幕顯示.在ostream類中,重載了<<運算符,用來處理各種內(nèi)部類型的輸出
???? 輸入流:c++也為輸入定義了一個流類istream.這個類中重載了>>運算符,以便從先觀的設(shè)備中讀取數(shù)據(jù),對應(yīng)與插入運算.這里>>運算符內(nèi)稱為析取運算.

流運算符?????

重載插入運算符

??? 在ostream類中,重載了<<運算符,用來處理各種內(nèi)部類型的輸出,ostream的定義放在iostream.h頭文件中:
class ostream:public virtual ios{
??????????? //……
??????????? public:
??????????????? ostream&operator<<(const char*);
??????????????? ostream&operator<<(char);?
??????????????? ostream&operator<<(short i){
????????????????????? return *this<<int(i);
??????????????? }
??????????????? ostream&operator<<(int);
??????????????? ostream&operator<<(long);
??????????????? ostream&operator<<(double);
??????????????? ostream&operator<<(const void*);?
?????????? // ……
};
注:其中char*用于輸出字符串,void*用于輸出指針的地址值?


重載析取運算符?

class istream:public virtual ios{
???????????????? //……
??????????????? public:
??????????????????? istream&operator>>(char *);//字符串
??????????????????? istream&operator>>(char &);//字符?
??????????????????? istream&operator>>(shirt &);
??????????????????? istream&operator>>(int &);
??????????????????? istream&operator>>(long &);
??????????????????? istream&operator>>(float &);
??????????????????? istream&operator>>(double &);
???????????????? //...
};
istream將ios作為基類.他也為所有內(nèi)部類型定義了析取運算.在iostream.h頭文件總預(yù)定義了一個istream派生類的對象cin,cin與標(biāo)準(zhǔn)輸入相聯(lián)系,用語從鍵盤輸入數(shù)據(jù).
例如:
?? //...
?? int i;
?? cin >>i;
?? //...
cin>>i將調(diào)用cin.operator.(i),把鍵盤中輸入的整數(shù)存放到變量i中.

格式控制

???????? 在前面,輸入/輸出的數(shù)據(jù)沒有指定格式,它們都按缺省的格式輸入/輸出。然而,有時需要對數(shù)據(jù)格式進(jìn)行控制。這時需利用ios類中定義的格式控制成員函數(shù),通過調(diào)用它們來完成格式的設(shè)置。ios類的格式控制函數(shù)如下所示:
1.寬度控制
?????? ios的成員函數(shù)width()是指定在輸入/輸出一個數(shù)字或串時,緩沖去可存儲的最大字符數(shù),在輸入流總,長用他來防止緩沖區(qū)溢出,
例如:
???? char buffer[20];
???? cin.width(20);
???? cin>>buffer;
width()調(diào)用告訴cin插入操作一次最多能讀入20個字符,從而可以保證buffer中的數(shù)不會因為超過20而溢出.

2.格式狀態(tài)
??? 在ios類中,定義了一個表示流狀態(tài)的枚舉,枚舉中有各種標(biāo)志,用它們進(jìn)一步控制輸入輸出,
在ios類中定義了幾個成員函數(shù),用來設(shè)置,讀取和取消標(biāo)志位:
long flags( ) const 返回當(dāng)前的格式標(biāo)志。?
long flays(long newflag) 設(shè)置格式標(biāo)志為newflag,返回舊的格式標(biāo)志。?
long setf(long bits) 設(shè)置指定的格式標(biāo)志位,返回舊的格式標(biāo)志。?
long setf(long bits,long field)將field指定的格式標(biāo)志位置為bits,返回舊的格式標(biāo)志??
long unsetf(long bits) 清除bits指定的格式標(biāo)志位,返回舊的格式標(biāo)志。?
long fill(char c) 設(shè)置填充字符,缺省條件下是空格。?
char fill( ) 返回當(dāng)前填充字符。?
int precision(int val) 設(shè)置精確度為val,控制輸出浮點數(shù)的有效位,返回舊值。?
int precision( ) 返回舊的精確度值。?
int width(int val) 設(shè)置顯示數(shù)據(jù)的寬度(域?qū)?,返回舊的域?qū)挕?
int width( )只返回當(dāng)前域?qū)?#xff0c;缺省寬度為0。這時插入操作能按表示數(shù)據(jù)的最小寬度顯示數(shù)據(jù)?

3.控制符
?? 在前面.控制輸入/輸出采用的是函數(shù)的形式,但他們使用起來并不方便.為此,c++提供了控制符,他可以直接插入或析取運算中.
??? 預(yù)定義的操縱算子
??? 使用成員函數(shù)控制格式化輸入輸出時,每個函數(shù)調(diào)用需要寫一條語句,尤其是它不能用在插入或提取運算符的表達(dá)式中,而使用操縱算子,則可以在插入和提取運算符的表達(dá)式中控制格式化輸入和輸出。在程序中使用操縱算字必須嵌入頭文件iomanip.h

??? 一般,預(yù)定義的控制符有以下幾種:
dec 十進(jìn)制的輸入輸出?
hex 十六進(jìn)制的輸入輸出?
oct 八進(jìn)制的輸入輸出?
ws 提取空白字符?
ends 輸出一個nul字符?
endl 輸出一個換行字符,同時刷新流?
flush 刷新流?
resetiosflags(long) 請除特定的格式標(biāo)志位?
setiosflags(long) 設(shè)置特定的格式標(biāo)志位?
setfill(char) 設(shè)置填充字符?
setprecision(int) 設(shè)置輸出浮點數(shù)的精確度?
setw(int) 設(shè)置域?qū)捀袷阶兞?


其它流函數(shù)

??? 在ios,istream和ostream類中,還定義了若干輸入輸出函數(shù),它們主要用于錯誤處理,流的刷新以及流輸入輸出方式的控制.
??? 錯誤處理
??? 在對一個流對象進(jìn)行I/O操作時,可能會產(chǎn)生錯誤。當(dāng)錯誤發(fā)生時,錯誤的性質(zhì)被記錄在ios類的一個數(shù)據(jù)成員中。

??? ios類中定義的描述錯誤狀態(tài)的常量:
?????? goodbit-------------沒有錯誤,正常狀態(tài) 
?????? eofbit--------------到達(dá)流的結(jié)尾?
?????? failbit-------------I/O操作失敗,清除狀態(tài)字后,可以對流繼續(xù)進(jìn)行操作。?
?????? badbit--------------試圖進(jìn)行非法操作,清除狀態(tài)字后,流可能還可以使用。?
?????? hardfail------------致命錯誤,不可恢復(fù)的錯誤。?
??? 對應(yīng)于這些位,可用ios中定義的如下函數(shù)來檢查流的當(dāng)前狀態(tài)位:
?????? int good()---------如果正常,返回非0值
?????? int bad()----------如果badbit被設(shè)置,返回非0值
?????? int eof()----------如果eofbit被設(shè)置,返回非0值
?????? int fail()---------如果failbit被設(shè)置,返回非0值
?????? int rdstate()------返回當(dāng)前錯誤狀態(tài)位.

??? 流的其它成員函數(shù)可以從流中讀取字符或字符串,對流進(jìn)行無格式化的輸入 輸出操作,以及直接控制對流的I/O操作。

返回類型???????? ostream類的成員?????????????????? 描      述?
ostream&???????? put(char ch)???????????????? 向流中輸出一個字符ch,不進(jìn)行任何轉(zhuǎn)換?
ostream&??????? write(char*,int)???????? 向流中輸出指定長度的字符串,不進(jìn)行轉(zhuǎn)換?
ostream&???????? flush( )?????????????????????????? 刷新流,輸出所有緩沖的但還未輸出的數(shù)據(jù)?
ostream&??????? seekp(streampos)???????? 移動流的當(dāng)前指針到給定的絕對位置?
ostream&???? seekp(sereamoff,seek_dir)?? 流的當(dāng)前指針類似與文件的當(dāng)前指針?
streampos??????? teelp( )??????????????????????? 返回流的當(dāng)前指針的絕對位置?

istream類的成員函數(shù)

返回類型?????????? istream類的成員??????????????? 描       述?
?int????????????????????? get( )????????????????????????????? 讀取并返回一個字符?
istream&??????????? get(char&c)????????????????? 讀取字符并存入c中?
istream&???????????? putback( )???????????????? 將最近讀取的字符放回流中?
istream&?????????? read(char*,int)????????? 讀取規(guī)定長度的字符串到緩沖區(qū)中?
int????????????????????? peek( )?????????????????????????????? 返回流中下一個字符,但不移動文件指針?
istream&????????? seekg(streampos)?????????? 移動當(dāng)前指針到一絕對地址?
istream&??????? seekg(streampos,seek_dir)??? 移動當(dāng)前指針到一相對地址?
streampos????????????? tellg( )??????????????????? 返回當(dāng)前指針?

文件流

????? C++系統(tǒng)通過對流類進(jìn)一步擴展,提供了支持文件I/O的能力,使得程序員在建立和使用文件時,就像使用cin和cout一樣方便。下圖新派生的五個類用于文件處理。fstreambase類提供了文件處理所需的全部成員函數(shù),在它的派生類中沒有提供新的成員函數(shù)。 ifstream類用于文件的輸入操作;ofstream類用于文件的輸出操作,fstream類允許對文件進(jìn)行輸入/輸出操作。這幾個類同時繼承了前面介紹的流類的基本類等級中定義的成員函數(shù)。使用這些類時,必須在程序中嵌入頭文件fstream.h通過打開一個文件,可將一個流與一個文件相聯(lián)結(jié)。
????? filedbuf是streambuf的派生類,提供對文件緩沖區(qū)的管理能力。我們一般不涉及這個類C++系統(tǒng)通過對流類進(jìn)一步擴展,提供了支持文件I/O的能力,這使得程序員在建立和使用文件時,就像使用cin和cout一樣方便。左圖新派生的五個類用于文件處理。fstreambase類提供了文件處理所需的全部成員函數(shù),在它的派生類中沒有提供新的成員函數(shù)。ifstream類用于文件的輸入操作;ofstream類用于文件的輸出操作,fstream類允許對文件進(jìn)行輸入/輸出操作。這幾個類同時繼承了前面介紹的流類的基本類等級中定義的成員函數(shù)。使用這些類時,必須在程序中嵌入頭文件fstream.h通過打開一個文件,可將一個流與一個文件相聯(lián)結(jié)。在ios類中定義的一組枚舉常量名給出了可允許的文件打開方式:

in----------------------- 打開一個文件進(jìn)行操作?
out---------------------- 打開一個文件進(jìn)行寫操作?
ate---------------------- 文件打開時將文件指針指向文件尾?
app---------------------- 添加,輸出的內(nèi)容添加到文件尾?
trunc-------------------- 若文件存在,清除原有內(nèi)容,將長度截為0?
nocreat------------------ 若文件不存在,打開操作失敗?


文件的打開與關(guān)閉

?????? 在C++中,打開一個文件就是將這個文件與一個流建立關(guān)聯(lián),關(guān)閉一個文件就是取消這種關(guān)聯(lián)。要執(zhí)行文件的輸入/輸出,必須做三件事:
1)在程序中包含頭文件ifstream.h
2)建立流。建立流的過程就是定義流類的對象,例如:

ifstream in;定義了輸入流對象in
ofstream out;定義了輸出流對象out
fstream io;定義了輸入/輸出流對象io

3)使用open( )函數(shù)打開文件,是某一文件與上面的某一流相聯(lián)系。
open( )函數(shù)的原形為void open(const unsigned char*,int mod,int file_attrb);文件屬性。取值為0代表普遍文件,1為隱藏文件等,缺省值為0。打開的文件使用完畢,必須將它關(guān)閉,關(guān)閉文件使用close( )函數(shù),close( )函數(shù)也是流類中的成員函數(shù)。 打開一輸入文件


ifstream input;
input.open("test1",ios::in,0);
打開一輸出文件
ofstream output;
output.open("test2",ios::out,0);
打開一輸入/輸出文件
fstream both;
both.open("test",ios::in,ios::out,0);
可簡化為:
fstream both("test",ios::in,ios::out,0);
關(guān)閉文件:both.close( );
文件流成員函數(shù)open()的格式如下所示:
  void open(char * name,int mode,int file_attrb);
在這里name表示文件名,mode是下列值之一:
ios::app--------------------所有數(shù)據(jù)以附加方式寫到流
ios::ate--------------------打開文件,并把文件指針移到文件尾
ios::in---------------------為讀打開文件
ios::out--------------------為寫打開文件
ios::trunc------------------如果文件存在,舍去文件內(nèi)容
ios::nocreate---------------如果文件不存在,則失敗
ios::noreplace--------------如果文件存在,則失敗


文件的讀寫????

??? C++把文件看作是字符序列,即所謂流式文件。根據(jù)數(shù)據(jù)的組織形式,文件又可分為ASCII碼文件和二進(jìn)制文件兩種。如果要進(jìn)行文件的輸入輸出,必須先建立一個流,然后將這個流與文件相關(guān)聯(lián),即打開文件,此時才能進(jìn)行讀寫操作,完成后再關(guān)閉這個文件。如果建立的文件是供人閱讀的,它必須以文本方式打開,如果是供其它程序使用,則可以使用二進(jìn)制文件或文本文件。?

總結(jié)

以上是生活随笔為你收集整理的流和流库[给初学者非常有用]的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。