C的輸入和輸出與標準輸出流

2021-03-03 21:35:45 字數 4718 閱讀 5312

* 掌握:輸入輸出的含意;檔案流以及輸入/輸出的格式控制;標準輸出在c++程式中的應用。

* 理解:c++類庫中的常用流類。

* 了解:c++的i/o對c的發展。

重點、難點

◆輸入輸出的含意;檔案流以及輸入/輸出的格式控制;標準輸出在c++程式中的應用。

一、 c++ 輸入輸出的含義

以前所用到的輸入和輸出,都是以終端為物件的,即從鍵盤輸入資料,執行結果輸出到顯示器螢幕上。從作業系統的角度看,每乙個與主機相連的輸入輸出裝置都被看作乙個檔案。程式的輸入指的是從輸入檔案將資料傳送給程式,程式的輸出指的是從程式將資料傳送給輸出檔案。

c++的輸入與輸出包括以下3方面的內容:

1、對系統指定的標準裝置的輸入和輸出。簡稱標準i/o。(裝置)

2、以外存磁碟(或光碟)檔案為物件進行輸入和輸出。簡稱檔案i/0。(檔案)

3、對記憶體中指定的空間進行輸入和輸出。簡稱串i/o。(記憶體)

c++採取不同的方法來實現以上3種輸人輸出。 為了實現資料的有效流動,c++系統提供了龐大的i/o類庫,呼叫不同的類去實現不同的功能。

二、 c++的i/o對c的發展—型別安全和可擴充套件性

c語言中i/o存在問題:

1、在c語言中,用prinff和scanf進行輸入輸出,往往不能保證所輸入輸出的資料是可靠的、安全的。學過c語言的讀者可以分析下面的用法:想用格式符%d輸出乙個整數,但不小心錯用了它輸出單精度變數和字串,會出現什麼情況?

假定所用的系統int型佔兩個位元組。

printf("%d",i);//i為整型變數,正確,輸出i的值

printf("%d",f);//f為單精度變數,輸出變數中前兩個位元組的內容

printf("%d","c++");//輸出字串"c++」的起始位址

編譯系統認為以上語句都是合法的,而不對資料型別的合法性進行檢查,顯然所得到的結果不是人們所期望的。

2、在用scanf輸入時,有時出現的問題是很隱蔽的。如

scanf("%d",&i);//正確,輸入乙個整數,賦給整型變數i

scanf("%d",i);//漏寫&

假如已有宣告語句"int i=1",定義i為整型變數,其初值為1。編譯系統不認為上面的scanf語句出錯,而是將輸入的值存放到位址為000001的記憶體單元中,這個錯誤可能產生嚴重的後果。

注意:c++為了與c相容,保留了用printf和scanf進行輸出和輸入的方法,以便使過去所編寫的大量的c程式仍然可以在c++的環境下執行,但是希望讀者在編寫新的c++程式時不要用c的輸入輸出機制,而要用c++自己特有的輸入輸出方法。在c++的輸入輸出中,編譯系統對資料型別進行嚴格的檢查,凡是型別不正確的資料都不可能通過編譯。

因此c++的i/0操作是型別安全(typesafe)的。

3、用printf和scanf可以輸出和輸入標準型別(如:int,float,double,char)的資料,但無法輸出使用者自己宣告的型別(如陣列、結構體、類)的資料。在c++中,會經常遇到對類物件的輸入輸出,顯然無法使用printf和scanf來處理。

c++的i/o操作是可擴充套件的,不僅可以用來輸入輸出標準型別的資料,也可以用於使用者自定義型別的資料。c++對標準型別的資料和對使用者宣告型別資料的輸入輸出,採用同樣的方法處理。顯然,在使用者宣告了乙個新類後,是無法用printf和scanf函式直接輸出和輸入這個類的物件的。

解決辦法:

可擴充套件性是c++輸入輸出的重要特點之一,它能提高軟體的重用性,加快軟體的開發過程。

c++通過i/o類庫來實現豐富的i/0功能。這樣使c++的輸入輸出明顯地優於c語言中的pfintf和scanf,但是也為之付出了代價,c++的i/o系統變得比較複雜,要掌握許多細節。在本章中只能介紹其基本的概念和基本的操作,有些具體的細節可在日後實際深入應用時再進一步掌握。

三、 c++的輸入輸出流

輸入和輸出是資料傳送的過程,資料如流水一樣從一處流向另一處。c++形象地將此過程稱為流(stream)。c++的輸入輸出流是指由若干位元組組成的位元組序列,這些位元組中的資料按順序從乙個物件傳送到另一物件。

流表示了資訊從源到目的端的流動。在輸入操作時,位元組流從輸入裝置(如鍵盤、磁碟)流向記憶體,在輸出操作時,位元組流從記憶體流向輸出裝置(如螢幕、印表機、磁碟等)。流中的內容可以是ascii字元、二進位制形式的資料、圖形影象、數字音訊**或其他形式的資訊。

實際上,在記憶體中為每乙個資料流開闢乙個記憶體緩衝區,用來存放流中的資料。當用cout和插入運算子「<<」向顯示器輸出資料時,先將這些資料送到程式中的輸出緩衝區儲存,直到緩衝區滿了或遇到endl,就將緩衝區中的全部資料送到顯示器顯示出來。在輸入時,從鍵盤輸入的資料先放在鍵盤緩衝區中,當按回車鍵時,鍵盤緩衝區中的資料輸入到程式中的輸入緩衝區,形成cin流,然後用提取運算子「>>」從輸入緩衝區中提取資料送給程式中的有關變數。

總之,流是與記憶體緩衝區相對應的,或者說,緩衝區中的資料就是流。

在c++中,輸入輸出流被定義為類。c++的i/0庫中的類稱為流類(streamclass)。用流類定義的物件稱為流物件。

前面曾多次說明,cout和cin並不是c++語言中提供的語句,它們是iostream類的物件,在未學習類和物件時,在不致引起誤解的前提下,為敘述方便,把它們稱為cout語句和cin語句。正如c++並未提供賦值語句,只提供賦值表示式,在賦值表示式後面加分號就成了c++的語句,為方便起見,我們習慣稱之為賦值語句。又如,在c語言中常用printf和scanf進行輸出和輸入,printf和scanf是c語言庫函式中的輸入輸出函式,一般也習慣地將由printf和scanf函式構成的語句稱為printf語句和scanf語句。

在使用它們時,對其本來的概念要有準確的理解。

1.iostream類庫中有關的類

c++編譯系統提供了用於輸人輸出的iostream類庫。iostream這個單詞是由3個部分組成的,即i-o-stream,意為輸入輸出流。在iostream類庫中包含許多用於輸入輸出的類。

常用的見表1。

表1ios是抽象基類,由它派生出istream類和ostream類,兩個類名中第1個字母i和。分別代表輸入(mput)和輸出(output)。istream類支援輸入操作,ostream類支援輸出操作, iostream類支援輸入輸出操作。

iostream類是從istream類和ostream類通過多重繼承而派生的類。其繼承層次見圖1表示。

圖1圖2

c++對檔案的輸人輸出需要用ifstream和ofstream類,兩個類名中第1個字母i和o分別代表輸入和輸出,第2個字母f代表檔案(file)。ifstream支援對檔案的輸入操作,ofstream支援對檔案的輸出操作。類ifstream繼承了類istream,類ofstream繼承了類ostream,類fstream繼承了類iostream。

見圖2。

圖3由圖3可以看到:由抽象基類ios直接派生出4個派生類,即istream,ostream,fstreambase和strstreambase。其中fstreambase是檔案流類基類,由它再派生出ifs~eam,ofstream和fstream。

strstreambase是字串流類基類,由它再派生出lstrstream,ostrsceam和swsweam類。

i/0類庫中還有其他一些類,但是對於一般使用者來說,以上這些已能滿足需要了。如果想深入了解類庫的內容和使用,可參閱所用的c++系統的類庫手冊。在本章將陸續介紹有關的類。

2、與iostream類庫有關的標頭檔案

iostream類庫中不同的類的宣告被放在不同的標頭檔案中,使用者在自己的程式中用 #include命令包含了有關的標頭檔案就相當於在本程式中宣告了所需要用到的類。可以換一種說法:標頭檔案是程式與類庫的介面,iostream類庫的介面分別由不同的標頭檔案來實現。

常用的有

●iostream 包含了對(標準)輸入輸出流進行操作所需的基本資訊。

●fstream 用於使用者管理的檔案的i/0操作。

●sbsbeam 用於字串流i/0。

●stdiostream 用於混合使用c和c++的i/0機制時,例如想將c程式轉變為c++程式。

●iomamp 在使用格式化i/0時應包含此標頭檔案。

3、在iostream標頭檔案中定義的流物件

在iostream標頭檔案中定義的類有:ios,istream,ostream,iostream,istream_withassign,stream_withassign,iostream_withassign等。

iostream包含了對輸入輸出流進行操作所需的基本資訊。因此大多數c++程式都包括iostream。在iostream標頭檔案中不僅定義了有關的類,還定義了4種流物件,見表2。

表2cin是istream的派生類istream_withassign的物件,它是從標準輸入裝置(鍵盤)輸入到記憶體的資料流,稱為cin流或標準輸入流。cout是ostream的派生類ostream_withassign的物件,它是從記憶體輸入到標準輸出裝置(顯示器)的資料流,稱為cout流或標準輸出流。cerr和clog作用相似,均為向輸出裝置(顯示器)輸出出錯資訊。

因此用鍵盤輸入時用cin流,向顯示器輸出時用cout流。向顯示器輸出出錯資訊時用cerr和clog流。

在iostream標頭檔案中定義以上4個流物件用以下的形式(以cout為例):

osteeam cout(stdout);

在定義cout為ostream流類物件時,把標準輸出裝置stdout作為引數,這樣它就與標準輸出裝置(顯示器)聯絡起來,如果有

cout<<3;//就會在顯示器的螢幕上輸出3。

4.在iostream標頭檔案中過載運算子

「<<」和「>>」本來在c++中是被定義為左位移運算子和右位移運算子的,由於在iosreeam標頭檔案中對它們進行了過載,使它們能用作標準型別資料的輸入和輸出運算子。所以,在用它們的程式中必須用#include命令把ostream包含到程式中。

C流格式控制的輸入輸出

1.用ios類成員函式進行格式化 狀態標誌 ios類中定義的列舉 enum 狀態標誌是乙個long型別的長整數,這些列舉值可以作為x flags上的每一位的標誌,若定義了某一項,則x flags中的某一位為1,否則為0。用成員函式對狀態標誌進行操作 include using namespace s...

9 1輸入輸出流

第九章輸入輸出流 9.1 輸入輸出流的概念 一 c 的輸入輸出包含三方面內容 1.對系統指定的標準裝置的輸入輸出,例如鍵盤作為輸入裝置,螢幕作為輸出裝置,簡稱標準io。2.對磁碟檔案進行輸入輸出,簡稱檔案io。3.對記憶體空間進行輸入輸出,通常把乙個字元陣列作為儲存空間,稱為字串輸入輸出,簡稱串io...

C語言標準輸入輸出詳解

c輸入輸出函式 本節主要介紹turbo c2.0標準輸入輸出函式和檔案的輸入輸出函式。通過本 節的學習可以使讀者掌握turbo c2.0的螢幕輸出 鍵盤輸入輸出以及磁碟檔案的 讀寫函式,並能開始進行一些簡單的程式的編寫。控制流程語句主要包括 條件語句 迴圈語句和開關語句。1.1 標準輸入輸出函式 1...