C 輸入輸出流

2021-05-17 11:26:41 字數 4590 閱讀 8348

一、 c++流的概念

在c++語言中,資料的輸入和輸出(簡寫為i/o)包括對標準輸入裝置鍵盤和標準輸

出裝置顯示器、對在外存磁碟上的檔案和對記憶體中指定的字串儲存空間(當然可

用該空間儲存任何資訊)進行輸入輸出這三個方面。對標準輸入裝置和標準輸出設

備的輸入輸出簡稱為標準i/o,對在外存磁碟上檔案的輸入輸出簡稱為檔案i/o,對

記憶體中指定的字串儲存空間的輸入輸出簡稱為串i/o。

c++語言系統為實現資料的輸入和輸出定義了乙個龐大的類庫,它包括的類主要有ios,istream,ostream,iostream,ifstream,ofstream,fstream,istrstream,ostrs

tream,strstream等,其中ios為根基類,其餘都是它的直接或間接派生類。

ios為根基類,它直接派生四個類:輸入流類istream、輸出流類ostream、檔案流

基類fstreambase和字串流基類strstreambase,輸入檔案流類同時繼承了輸入流

類和檔案流基類(當然對於根基類是間接繼承),輸出檔案流類ofstream同時繼承了輸出流類和檔案流基類,輸入字串流類istrstream同時繼承了輸入流類和字串流基類,輸出字串流類ostrstream同時繼承了輸出流類和字串流基類,輸入輸出流類iostream同時繼承了輸入流類和輸出流類,輸入輸出檔案流類fstream同時繼承了輸入輸出流類和檔案流基類,輸入輸出字串流類strstream同時繼承了輸入輸出流類和字串流基類。

「流」就是「流動」,是物質從一處向另一處流動的過程。c++流是指資訊從外部輸入裝置(如鍵盤和磁碟)向計算機內部(即記憶體)輸入和從記憶體向外部輸出裝置(如顯示器和磁碟)輸出的過程,這種輸入輸出過程被形象地比喻為「流」。為了實現資訊的內外流動,c++系統定義了i/o類庫,其中的每乙個類都稱作相應的流或流類,用以完成某一方面的功能。根據乙個流類定義的物件也時常被稱為流。如根據檔案流類fstream定義的乙個物件fio,可稱作為fio流或fio檔案流,用它可以同磁碟上乙個檔案相聯絡,實現對該檔案的輸入和輸出,fio就等同於與之相聯絡的檔案。

c++系統中的i/o類庫,其所有類被包含在iostream.h,fstream.h和strstrea.h這三個系統標頭檔案中,各標頭檔案包含的類如下:

iostream.h包含有:ios, iostream, istream, ostream, iostream_withassign,

istream_withassign, ostream_withassign等。

fstream.h包含有:fstream, ifstream, ofstream和fstreambase,以及iostream.h

中的所有類。

strstrea.h包含有:strstream, istrstream, ostrstream和strstreambase,以及

iostream.h中的所有類。

在乙個程式或乙個編譯單元(即乙個程式檔案)中當需要進行標準i/o操作時,則必須包含標頭檔案iostream.h,當需要進行檔案i/o操作時,則必須包含標頭檔案fstream.h,同樣,當需要進行串i/o操作時,則必須包含標頭檔案strstrea.h。在乙個程式或編譯單元中包含乙個標頭檔案的命令格式為「#include《頭檔名》」,當然若標頭檔案是使用者建立的,則頭檔名的兩側不是使用尖括號,而是使用雙引號。當系統編譯乙個c++檔案對#include命令進行處理時,是把該命令中指定的檔案中的全部內容嵌入到該命令的位置,然後再編譯整個c++檔案生成相應的目標**檔案。

c++不僅定義有現成的i/o類庫供使用者使用,而且還為使用者進行標準i/o操作定義了四個類物件,它們分別是cin,cout,cerr和clog,其中cin為istream_withassign流類的物件,代表標準輸入裝置鍵盤,也稱為cin流或標準輸入流,後三個為ostream_withassign流類的物件,cout代表標準輸出裝置顯示器,也稱為cout流或標準輸出流,cerr和clog含義相同,均代表錯誤資訊輸出裝置顯示器。因此當進行鍵盤輸入時使用cin流,當進行顯示器輸出時使用cout流,當進行錯誤資訊輸出時使用cerr或clog。

在istream輸入流類中定義有對右移操作符》過載的一組公用成員函式,函式的具體宣告格式為:

istream& operator>>(簡單型別識別符號&);

簡單型別識別符號可以為char, signed char, unsigned char, short, unsigned short, int, unsigned int, long, unsigned long, float, double, long double, char*, signed char*, unsigned char*之中的任何一種,對於每一種型別都對應著乙個右移操作符過載函式。由於右移操作符過載用於給變數輸入資料的操作,所以又稱為提取操作符,即從流中提取出資料賦給變數。

當系統執行cin>>x操作時,將根據實參x的型別呼叫相應的提取操作符過載函式,把x引用傳送給對應的形參,接著從鍵盤的輸入中讀入乙個值並賦給x(因形參是x的別名)後,返回cin流,以便繼續使用提取操作符為下乙個變數輸入資料。

當從鍵盤上輸入資料時,只有當輸入完資料並按下回車鍵後,系統才把該行資料存入到鍵盤緩衝區,供cin流順序讀取給變數。還有,從鍵盤上輸入的每個資料之間必須用空格或回車符分開,因為cin為乙個變數讀入資料時是以空格或回車符作為其結束標誌的。

當cin>>x操作中的x為字元指標型別時,則要求從鍵盤的輸入中讀取乙個字串,並把它賦值給x所指向的儲存空間中,若x沒有事先指向乙個允許寫入資訊的儲存空間,則無法完成輸入操作。另外從鍵盤上輸入的字串,其兩邊不能帶有雙引號定界符,若帶有只作為雙引號字元看待。對於輸入的字元也是如此,不能帶有單引號定界符。

在ostream輸出流類中定義有對左移操作符《過載的一組公用成員函式,函式的具體宣告格式為:

ostream& operator<<(簡單型別識別符號);

簡單型別識別符號除了與在istream流類中宣告右移操作符過載函式給出的所有簡單型別識別符號相同以外,還增加乙個void* 型別,用於輸出任何指標(但不能是字元指標,因為它將被作為字串處理,即輸出所指向儲存空間中儲存的乙個字串)的值。由於左移操作符過載用於向流中輸出表示式的值,所以又稱為插入操作符。如當輸出流是cout時,則就把表示式的值插入到顯示器上,即輸出到顯示器顯示出來。

當系統執行cout《二、 輸入輸出格式控制

程式2:

#include

void main()

{int x=468;

double y=-3.425648;

cout<<"x=";

cout.width(10); //設定輸出下乙個資料的域寬為10

cout《程式3:

#include

void main()

{float x=25, y=-4.762;

cout<3. 格式控制操作符

資料輸入輸出的格式控制還有更簡便的形式,就是使用系統標頭檔案iomanip.h中提供的操縱符。使用這些操縱符不需要呼叫成員函式,只要把它們作為插入操作符<<(個別作為提取操作符》)的輸出物件即可。這些操縱符及功能如下:

dec //轉換為按十進位制輸出整數,它也是系統預置的進製。

oct //轉換為按八進位制輸出整數。

hex //轉換為按十六進製制輸出整數。

ws //從輸入流中讀取空白字元。

endl //輸出換行符』/n』並重新整理流。重新整理流是指把流緩衝區的內容立即寫入到對

//應的物理裝置上。

ends //輸出乙個空字元』/0』。

flush //只重新整理乙個輸出流。

setiosflags(long f) //設定f所對應的格式化標誌,功能與setf(long f)

//成員函式相同,當然輸出該操縱符後返回的是乙個

//輸出流。如採用標準輸出流cout輸出它時,則返回

//cout。對於輸出每個操縱符後也都是如此,即返回

//輸出它的流,以便向流中繼續插入下乙個資料。

resetiosflags(long f) //清除f所對應的格式化標誌,功能與unsetf(long f)

//成員函式相同。當然輸出後返回乙個流。

setfill(int c) //設定填充字元為ascii碼為c的字元。

setprecision(int n) //設定浮點數的輸出精度為n。

setw(int w) //設定下乙個資料的輸出域寬為w。

在上面的操縱符中,dec, oce, hex, endl, ends, flush和ws除了在iomanip.h中有定義外,在iostream.h中也有定義。所以當程式或編譯單元中只需要使用這些不帶引數的操縱符時,可以只包含iostream.h檔案,而不需要包含iomanip.h檔案。

下面以標準輸出流物件cout為例,說明使用操作符進行的輸出格式化控制。

程式4:

#include

//因iomanip.h中包含有iostream.h,所以該命令可省略

#include

void main()

{int x=30, y=300, z=1024;

cout《程式5:

#include

#include

void main()

{int x=468;

double y=-3.425648;

cout<<"x="《程式6:

#include

void main()

{float x=25, y=-4.762;

cout<

C 輸入 輸出流

低階i o功能 如無格式的i o 通常指大量的位元組在裝置到記憶體或記憶體到裝置的簡單傳輸。高階i o功能 格式化i o 它將位元組組合成有意義的單元,如資料型別。對於大容量檔案的處理,使用無格式的i o可獲得最佳的效能。不帶引數值成員函式get 從指定的流中讀取乙個字元 即使是空格 並返回該字元作...

C 輸入 輸出流

一 流低階i o功能 如無格式的i o 通常指大量的位元組在裝置到記憶體或記憶體到裝置的簡單傳輸。高階i o功能 格式化i o 它將位元組組合成有意義的單元,如資料型別。對於大容量檔案的處理,使用無格式的i o可獲得最佳的效能。二 成員函式get和getline 不帶引數值成員函式get 從指定的流...

C 輸入輸出流

在看c primer的時候,練習題7.31裡 std istream input std istream in std ostream output std ostream out const 分別是什麼意思啊,看的不是很懂能不能解釋一下 std istream sales item input s...