C++流对象
1、概念
在程序設計當中免不了要對數據進行輸入輸出,在C語言中我們經常使用scanf()、printf()進行輸入輸出操作,但是在C++中,我們使用流對象來對數據進行輸入輸出操作,數據流在輸入源和輸出目標之間充當了橋梁的作用。
根據操作的數據流對象的不同,C++流對象可以分為控制臺流(iostream)、文件流(fstream)以及字符串流(sstream),上述三種類的流均繼承基礎流類(ios_base、ios)。
具體關系如下圖所示:
2、控制臺流(iostream)
為了控制臺程序輸入輸出的方便,C++控制臺流以對象的形式提供了幾個常用的流對象方便在控制臺對數據流進行輸入輸出,分別是:cin(輸入流)、cout(輸出流)、cerr(不帶緩存的錯誤輸出流)、clog(帶緩存的錯誤輸出流)。
cin對象:當代碼執行到cin函數時,控制臺會彈出輸入框,讓你輸入,此時當你輸入完數據,敲下回車鍵,cin對象會從緩沖區讀取數據流直到遇到第一個空白符為止。所以,使用cin讀取數據會跳過空白符(例如,空格,tab、制表符等等),如果想讀取這些空白符的話需要使用getchar()函數。但是如果想要讀取一行帶有空白符的數據怎么辦呢?cin對象有一個getline函數:
cin.getline(char s[], int nLength)注意該函數雖然能夠讀取空白符,但是不能讀取換行符(回車符)。其實每個輸入流對象都有其對應的getline()函數,如文件流和字符串流,都有其對應的getline()函數。
在std命名空間下,有一個單獨的getline()函數,但是該函數時使用string對象作為參數的,即:
但是該函數也是不能夠讀取換行符的,可以讀取空白符。
如果實現有讀取換行符的需求,只能使用GCC進行讀取了。
cout對象:使用cout進行輸出時,可以使用控制符進行格式化輸出,比如使用十進制或者十六進制進行輸出,但是有一點需要注意,進行格式化輸出時,在程序單位的開頭除了要加iostream頭文件外,還要加iomanip頭文件。
int nInput = 15 cout<<hex<<nInput; 輸出結果為fcout<<setiosflags(ios∷showpos)<<nInput; 輸出: +153、文件流(fstream)
C++在文件流中提供三個派生類以方便對文件數據流進行操作(注意提供的是類,而不像控制臺流直接提供對象),分別是ifstream,ofstream,iofstream。
ifstream:該類主要是處理從外存流向內存的數據流。
ofstream:該類主要是處理從內存流向磁盤的數據流。
fstream:該類主要用來處理磁盤和內存之間數據流的輸入和輸出。
要想處理磁盤文件,首先必須先定義一個文件流對象,然后將要處理的文件與相應的文件流對象進行綁定,即該文件流對象專門用來處理該文件的數據流。
每一個文件流類都定義了一個成員函數 open 來定位給定的文件,并視情況打開為讀或寫模式。如果在創建文件流對象時,提供了文件名,則open會被自動調用。沒有提供文件名,將會創建空文件流對象,可以隨后調用 open 將它與文件關聯起來。同時每一個文件流類型都定義了一個文件模式,用于指出如何使用該文件是只讀模式還是讀寫模式等等。
ifstream input(ifile); // 構造一個ifstream 對象input并綁定文件ifile打開該文件; ofstream output; // 輸出文件流,未關聯任何文件 output.open(ofile); // 打開指定文件在此要對open函數進行檢查,因為調用open函數可能會失敗。因此寫代碼時應該加上判斷:
if(out)一旦一個文件打開,那么該文件流對象就和該文件綁定在一起,如果文件流想要綁定另外的文件,則必須先要關閉與之前文件的綁定
out.close() out.open(otherFile)當一個文件流離開其作用域時,與之關聯的文件也會失效。
4、字符串輸入輸出流(sstream)
將字符串作為流進行處理,使得操作字符串像操作流一樣,其相應的派生類有istringstream、ostringstream、iostringstream。這些類可以從string讀取數據也可以將數據寫入string中,它們操作的對象是內存中的string,所以嚴格意義上來講,它們不能稱之為輸入輸出流,但是為了方便講述,我們在此使用輸入輸出流。字符串流也定義了一些函數來方便管理和操作字符串,比如:
總結
- 上一篇: C++ 字符串(string类)
- 下一篇: C++ 关联容器