正文 第十一章 再論C++的輸入_輸出(一)(1 / 3)

本章將進一步討論Visual C++所提供的其他輸入/輸出功能,如格式化輸入/輸出,以及文件的輸入/輸出。

11.1輸入/輸出流類庫

一、流的概念

Visual C++沒有用於輸入/輸出的語句,輸入與輸出操作由函數來完成。

其中,com是C++中自定義的輸入/輸出類的對象,我們一般稱之為標準輸出流,左移運算符C是在該類中重載的成員函數(重載運算符函數)。因此我們可以說Visual C++的輸入與輸出操作,是由類的對象調用它的成員函數來完成的。

我們知道,可用於輸入/輸出的物理設備有許多,如終端(顯示器)、磁盤驅動器、鍵盤、打印機等。如果每一種物理設備都有自己的輸入/輸出口,那麼,我們編寫程序時,將變得十分困難,且缺少通用性。

在Visual C++的輸入/輸出係統中,則將這些不同的物理設備轉換為邏輯設備,我們稱之為“流”,並且提供了一套操作“流”的輸入/輸出接口。這樣,在執行輸入/輸出操作時,我們可以不用理會實際的物理設備,隻需要通過這個接口使用不同的“流”,卻執行相同的操作,就可以向不同的物理設備執行輸入/輸出操作。

雖然與上麵例子中的語句執行相同的操作,但結果卻是將字符串輸出到文件中。

我們在後麵的文件的輸入/輸出中將要講到文件流。注意,文件流是自己定義的,而標準輸出流是C++中已經定義的內部流。

二、流庫的基本結構

上麵例子中的cout和《運算符函數的定義都包含在頭文件iostream.h中。

在iortream.h中定義了一些用來執行輸入/輸出操作的類體係,稱之為流類,而實現這個流類中所有操作的係統庫可稱為流庫。流類、流庫這兩個概念有時不加區分,可以混用。在Visual C++中,流庫的層次結構比較複雜,但它的華本結構比較簡單。

三、VisualC++中預定義的流

在Visual C++中,提供了四個內部流:

1.cin是標準輸入流。在缺省的情況下,標準輸入設備是鍵盤。

例如,執行語句cini時,我們可以從鍵盤上輸入一個整數給。

2.cout是標準輸出流。在缺省的情況下,標準輸出設備是顯示終端。

例如,執行語句coutc“Hello”時,將Hello輸出到顯示終端。

3.cerr是標準錯誤輸出流。在缺省的情況下,輸出設備是顯示終端。

例如,執行語句cerrc“fileerror!”時,將fileerror!輸出到顯示終端,它和cout的作用是一樣的。

4.dog是標準錯誤輸出流。在缺省的情況下,輸出設備是顯示終端。它是cerr的緩衝方式。

例如,執行語句clog“fikenw!”時,由於它是緩衝方式,所以程序並不立即將fileeiror輸出到顯示終端,直到程序結束或遇到一個使用dog輸出一個回車換行符時,才執行輸出操作。

11.2格式化輸入/輸出

Visual C++支持格式化的輸入/輸出操作。例如,可以設置數據的域寬,指定數值的基數(十進製等),以及指定浮點數的顯示位數。

Visual C++提供了兩種用於格式化輸入/輸出的方法:

1.使用ios類的成員進行格式化輸入/輸出。

2.使用操縱算子進行格式化輸入/輸出。本節介紹使用ios類的成員進行格式化輸入/輸出的方法,下節再介紹操縱算子。

一、格式標誌

類ios是輸入/輸出流類中的最基類,Visual C++的輸入/輸出係統的繼承關係便是有類ios開始派生的,類ios可以說是整個C++輸入/輸出係統的靈魂。

類ios主要是用來控製與保存數據流的狀態,在類ios中定義了很多有關標誌、格式與模式的常數,以及操作這些常數的成員函數。在類ios中定義的用於格式化輸入/輸出的格式標誌。

由於這些格式標誌屬於枚舉類型,且又在類ios的共有區定義的,所以在程序中可以直接使M這些格式標誌,而不必通過類ios的對象,但必須加上作用域分辨符,以指明其所屬範圍。

利用類ios中的成員函數flags()和setf(),可以操作的格式標誌(類ios的數據成員),使得Visual C++的輸入與輸出具有格式化的效果。

我們經常通過emit和cin來使用類ios的成員函數。當它們和cout聯用時用來設置輸出格式,當和cin聯用時設置輸入格式。例如:cout.setf(ios::oct);該語句設置數值以八進製格式輸出。cin.setf(ios::hex);該語句把用戶輸入的數據當做是十六進製格式。