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

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

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

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

流和流庫

概 述?
????? 在C語言中,輸入/輸出系統的特點是缺乏類型檢查機制。如printf函數,在格式控制字符串后的參數,即使類型和個數與其不匹配,編譯是不會出錯,但運行時會得到錯誤的結果。C++提供了新的輸入/輸出方式。其主要目標是建立一個類型安全,擴展性好的輸入/輸出系統。在一個類型安全的輸入/輸出系統中,類似上述printf的錯誤在編譯時就可發現。一個理想的可擴展的輸入/輸出系統必須能以兩種方式進行擴展:
????? 1.能夠包含用戶定義的數據類型。
????? 2.能夠包含新的輸入/輸出方法。
???? 在C++中輸入/輸出流庫充分利用了C++的面向對象的特性實現了上述目標。


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

流運算符?????

重載插入運算符

??? 在ostream類中,重載了<<運算符,用來處理各種內部類型的輸出,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作為基類.他也為所有內部類型定義了析取運算.在iostream.h頭文件總預定義了一個istream派生類的對象cin,cin與標準輸入相聯系,用語從鍵盤輸入數據.
例如:
?? //...
?? int i;
?? cin >>i;
?? //...
cin>>i將調用cin.operator.(i),把鍵盤中輸入的整數存放到變量i中.

格式控制

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

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

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

??? 一般,預定義的控制符有以下幾種:
dec 十進制的輸入輸出?
hex 十六進制的輸入輸出?
oct 八進制的輸入輸出?
ws 提取空白字符?
ends 輸出一個nul字符?
endl 輸出一個換行字符,同時刷新流?
flush 刷新流?
resetiosflags(long) 請除特定的格式標志位?
setiosflags(long) 設置特定的格式標志位?
setfill(char) 設置填充字符?
setprecision(int) 設置輸出浮點數的精確度?
setw(int) 設置域寬格式變量?


其它流函數

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

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

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

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

istream類的成員函數

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

文件流

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

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


文件的打開與關閉

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

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

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


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);
關閉文件:both.close( );
文件流成員函數open()的格式如下所示:
  void open(char * name,int mode,int file_attrb);
在這里name表示文件名,mode是下列值之一:
ios::app--------------------所有數據以附加方式寫到流
ios::ate--------------------打開文件,并把文件指針移到文件尾
ios::in---------------------為讀打開文件
ios::out--------------------為寫打開文件
ios::trunc------------------如果文件存在,舍去文件內容
ios::nocreate---------------如果文件不存在,則失敗
ios::noreplace--------------如果文件存在,則失敗


文件的讀寫????

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

總結

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

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。