STL學習 11 輸入輸出流

2021-09-24 16:40:01 字數 3681 閱讀 9372

即標準輸入流cin、標準輸出流cout。前者指鍵盤,後者指顯示器。

1插入符與提取符

在輸入輸出流類庫中,過載了兩種運算子以簡化輸入輸出流的使用,運算子《常用做輸入輸出流的插入符,表明「輸出到」,例如cout << 「hello」是把字串「hello」輸出到螢幕上;運算子》常用做提取符,表明「賦值給」,例如 cin >> i 是把鍵盤輸入的資訊賦值給i。

標準輸入給不同型別變數賦值的不足示例。

#include using namespace std;

int main()

若在命令列上輸入1 how are you?,回車後執行結果為:

請輸入乙個整形數及乙個字串:1 how are you?

i=1str=how

實際上在互動過程中,經常需要一次輸入一行字串行,當這些字元安全地儲存到緩衝區後再進行掃瞄和轉換工作。在該示例中,並不能把輸入的串完全的放到記憶體中,下面講到的get系列函式很好的解決了這個問題。

2 get系列函式

常用的有3個函式。

(1)int get() ;    返回輸入流乙個字元的ascii值。

(2)istream& get(unsigned char* pszbuf, int nbuflen, char   delim=』\n』);     

pszbuf: 指向字元緩衝區的指標,用於儲存結果     nbuflen: 緩衝區長度     delim: 結束字元,根據結束字元判斷何時停止讀入操作

(3)istream& getline(unsigned char* pszbuf, int nbuflen, char delim=』\n』);     引數解釋同get

第2個get函式及getline函式都是讀一行記錄,那麼它們有什麼區別呢?細微而重要的區別在於:當遇到輸入流中的界定符(delim,即結束字元)時get()停止執行,但是並不從輸入流中提取界定符,直接在字串緩衝區尾部加結束標誌』\0』;函式getline()則相反,它將從輸入流中提取界定符,但仍然不會把它儲存到結果緩衝區中。 

#include using namespace std;

int main()

//輸出結果

請輸入乙個字串:abcde

97the received string is: bcde

3 處理流錯誤

獲取狀態資訊的函式如下:

//判斷是否輸入整形數。

int main()

in.close();

return 0;

}struct student //學生成績結構體

;int main() ;//用結構體產生兩名學生的成績資訊

student st2 =;

out << st1.strname << "\t" << st1.ngrade << endl;//把成績資訊存到文字檔案

out << st2.strname << "\t" << st2.ngrade << endl;

out.close();

return 0;

}

可以看出,通過「<<」完成寫文字檔案是乙個較好的方法,這是因為「<<」操作符可把不同型別的資料直接輸出。結構體中strname是字串,ngrade是整形數,但均可直接輸出到檔案上即可。此外strname與ngrade之間採用「\t」輸出是為了資料對齊,而「endl」保證輸出「\n」回車符,保證了文字檔案的換行,是必須的。

讀寫二進位制檔案

主要是通過read()、write()函式完成讀寫二進位制檔案功能的,原型如下所示

第1個引數表明讀寫緩衝區的頭指標,第二個引數表明讀寫緩衝區的大小

//寫二進位制檔案:把學生成績資訊儲存至文。

struct student //學生成績結構體

;int main() ;//用結構體產生兩名學生的成績資訊

student st2 =;

out.write((const char *)&st1, sizeof(student)); //把成績資訊存到二進位制 檔案

out.write((const char *)&st2, sizeof(student));

out.close();

return 0;

}//讀二進位制檔案,並把結果顯示在螢幕上。

int main()

輸入輸出流緩衝

c++標準庫封裝了乙個緩衝區類streambuf,以供輸入輸出流物件使用。每個標準c++輸入輸出流物件都包含乙個指向streambuf的指標,使用者可以通過呼叫rdbuf()成員函式獲得該指標,從而直接訪問底層streambuf物件,可以直接對底層緩衝區進行資料讀寫,從而跳過上層的格式化輸入輸出操作。但由於類似的功能均可由上層緩衝區類實現,所以就不再加以論述了。streambuf最精彩的部分在於它過載了operator 《及operator >>。對operator 《來說,它以streambuf指標為引數,實現把streambuf物件中的所有字元輸出到輸出流出中;對operator >>來說,可把輸入流物件中的所有字元輸入到streambuf物件中。

//開啟乙個檔案並把檔案中的內容送到標準輸出中。

int main()

標準庫定義了三種型別的字串流。

//反解字串給各變數賦值

#include #include using namespace std;

int main()

//合併不同型別的資料到字串

int main()

#include #include using namespace std;

class student

;istream& operator>> (istream& is, student& s)

ostream& operator << (ostream& os, student& s) //student是普通物件

ostream& operator << (ostream& os, const student& s)//student是常物件

void f(const student& s)

int main(int argc, char *ar**)

對該程式著重理解主程式中cin>>s, cout << s的用法,它們均是對物件的操作。當cin >> s時,其實真正呼叫的是過載的istream& operator>> (istream& is, student& s),如何輸入是由該函式體來完成的;同理當cout << s時,真正呼叫的是過載的ostream& operator << (ostream& os, student& s),如何輸出由該函式體來完成;當student是常物件時,例如函式void f(const student& s)中cout<
輸入輸出流

c 通過以下幾個類支援檔案的輸入和輸出 ofstream寫操作的檔案類由ostream引申而來 ifstream讀操作的檔案類由istream引申而來 fstream可同時讀寫操作的檔案類由iostream引申而來 ifstream in tian.txt 開啟乙個檔案 ifstream in in...

輸入輸出流

預定義流類的物件與通用的流運算子 1 cin 2 cout 3 cerr是ostream類物件,在標準輸出裝置上顯示錯誤資訊 不帶緩衝,立即顯示 輸入輸出流 ostream 和 ofstream istream 和 ifstream fstream 定義檔案輸出流物件 fstream outfile...

輸入輸出流

流 按照方向分為 輸入流和輸出流。以記憶體為參照物將資料從資料來源中讀取到記憶體,為輸入流,也叫讀取流。將資料從記憶體中寫入資料來源,為輸出流,也稱為寫入流 流按照型別分 分為位元組流,字元流和物件流。由於計算機採用二進位制,所有資料的傳輸都是以位元組為單位傳輸。所以無論是那種流,其本質都是位元組流...