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