- 資訊首頁(yè) > 開(kāi)發(fā)技術(shù) >
- C++中輸入流和輸出流的示例分析
這篇文章主要介紹C++中輸入流和輸出流的示例分析,文中介紹的非常詳細,具有一定的參考價(jià)值,感興趣的小伙伴們一定要看完!
C++ 又可以稱(chēng)為“帶類(lèi)的 C”,即可以理解為 C++ 是 C 語(yǔ)言的基礎上增加了面向對象(類(lèi)和對象)。在此基礎上,學(xué)過(guò) C 語(yǔ)言的讀者應該知道,它有一整套完成數據讀寫(xiě)(I/O)的解決方案:
使用 scanf()
、gets()
等函數從鍵盤(pán)讀取數據,使用 printf()
、puts()
等函數向屏幕上輸出數據;
使用 fscanf()
、fgets()
等函數讀取文件中的數據,使用 fprintf()
、fputs()
等函數向文件中寫(xiě)入數據。
要知道,C 語(yǔ)言的這套 I/O 解決方案也適用于 C++ 程序,但 C++ 并沒(méi)有“偷懶”,它自己獨立開(kāi)發(fā)了一套全新的 I/O 解決方案,其中就包含大家一直使用的 cin 和 cout
。前面章節中,我們一直在用 cin
接收從鍵盤(pán)輸入的數據,用 cout
向屏幕上輸出數據(這 2 個(gè)過(guò)程又統稱(chēng)為“標準 I/O”)。除此之外,C++ 也對從文件中讀取數據和向文件中寫(xiě)入數據做了支持(統稱(chēng)為“文件 I/O”)。
本質(zhì)上來(lái)說(shuō),C++ 的這套 I/O 解決方案就是一個(gè)包含很多類(lèi)的類(lèi)庫(作為 C++ 標準庫的組成部分),這些類(lèi)常被稱(chēng)為“流類(lèi)”。
C++ 的開(kāi)發(fā)者認為數據輸入和輸出的過(guò)程也是數據傳輸的過(guò)程,數據像水一樣從一個(gè)地方流動(dòng)到另一個(gè)地方,所以 C++ 中將此過(guò)程稱(chēng)為“流”,實(shí)現此過(guò)程的類(lèi)稱(chēng)為“流類(lèi)”。
下圖展示了 C++ 中用于實(shí)現數據輸入和輸出的這些流類(lèi)以及它們之間的關(guān)系:
C++類(lèi)庫中的流類(lèi):
其中,圖中的箭頭代表各個(gè)類(lèi)之間的派生關(guān)系。比如,ios 是所有流類(lèi)的基類(lèi),它派生出
istream
和ostream
。特別需要指出的是,為了避免多繼承的二義性,從 ios 派生出istream
和ostream
時(shí),均使用了 virtual 關(guān)鍵字(虛繼承)。
上圖 中這些流類(lèi)各自的功能分別為:
istream
:常用于接收從鍵盤(pán)輸入的數據;
ostream
:常用于將數據輸出到屏幕上;
ifstream
:用于讀取文件中的數據;
ofstream
:用于向文件中寫(xiě)入數據;
iostream
:繼承自 istream
和 ostream
類(lèi),因為該類(lèi)的功能兼兩者于一身,既能用于輸入,也能用于輸出;
fstream
:兼 ifstream
和 ofstream
類(lèi)功能于一身,既能讀取文件中的數據,又能向文件中寫(xiě)入數據。
本章僅講解實(shí)現標準 I/O 操作的 istream
、ostream
和 iostream
類(lèi),有關(guān)實(shí)現文件 I/O 操作的流類(lèi)放到后續章節講解。
在前面章節的學(xué)習中,只要涉及輸入或者輸出數據,我們立馬想到的就是 cin
和 cout
。其實(shí),cin
就是 istream
類(lèi)的對象,cout
是 ostream
類(lèi)的對象,它們都聲明在 <iostream> 頭文件中,這也解釋了“為什么在 C++ 程序中引入 <iostream> 就可以使用 cin 和 cout”(當然使用 cin 和 cout
,還需要聲明 std 命名空間)。
除此之外,<iostream> 頭文件中還聲明有 2 個(gè) ostream
類(lèi)對象,分別為 cerr
和 clog
。它們的用法和 cout 完全一樣,但 cerr 常用來(lái)輸出警告和錯誤信息給程序的使用者,clog
常用來(lái)輸出程序執行過(guò)程中的日志信息(此部分信息只有程序開(kāi)發(fā)者看得到,不需要對普通用戶(hù)公開(kāi))。
cout、cerr 和 clog 之間的區別如下:
cout
除了可以將數據輸出到屏幕上,通過(guò)重定向(后續會(huì )講),還可以實(shí)現將數據輸出到指定文件中;而 cerr
和 clog
都不支持重定向,它們只能將數據輸出到屏幕上;
cout
和 clog
都設有緩沖區,即它們在輸出數據時(shí),會(huì )先將要數據放到緩沖區,等緩沖區滿(mǎn)或者手動(dòng)換行(使用換行符 '\n' 或者 endl)時(shí),才會(huì )將數據全部顯示到屏幕上;而 cerr 則不設緩沖區,它會(huì )直接將數據輸出到屏幕上。
除了以上 2 點(diǎn)特性上的不同之外,cerr
、clog
和 cout
沒(méi)有任何不同。之所以我們常用 cout,是因為 cerr 和 clog 有各自不同的適用場(chǎng)景。以 cerr 為例,一旦程序某處使用 cerr 輸出數據,我們自然而然地會(huì )認為此處輸出的是警告或者錯誤信息。
值得一提的是,類(lèi)似
cin
、cout
、cerr 和 clog 這樣,它們都是 C++ 標準庫的開(kāi)發(fā)者創(chuàng )建好的,可以直接拿來(lái)使用,這種在 C++ 中提前創(chuàng )建好的對象稱(chēng)為內置對象。實(shí)際上,<iostream> 頭文件中還聲明有處理寬字符的 4 個(gè)內置對象,分別為 wcin、wcout、wcerr 以及 wclog,由于不是本節重點(diǎn),這里不再對它們做詳細講解。
如下程序演示了 cin
、cout
、cerr
和 clog
的基本用法:
#include <iostream> #include <string> int main() { std::string url; std::cin >> url; std::cout << "cout:" << url << std::endl; std::cerr << "cerr:" << url << std::endl; std::clog << "clog:" << url << std::endl; return 0; }
程序執行結果為:
http://c.biancheng.net
cout:http://c.biancheng.net
cerr:http://c.biancheng.net
clog:http://c.biancheng.net
注意:此程序中并沒(méi)有考慮 cerr
和 clog
各自特有的含義,這里僅是為了演示 cerr
和 clog
的基礎用法,不建議讀者這樣使用。另外,如果程序中 std 命名空間提前聲明,則所有的 std::
可以省略。
它們的用法遠不止此,istream
和 ostream
類(lèi)提供了很多實(shí)用的函數,cin
、cout
、cerr
和 clog
作為類(lèi)對象,當然也能調用。
表 1 羅列了 cin 對象常用的一些成員方法以及它們的功能:
表 1 C++ cin 輸入流對象常用成員方法
表 2 羅列了 cout、cerr 和 clog 對象常用的一些成員方法以及它們的功能:
表 2 C++ cout 輸出流對象常用成員方法
舉個(gè)例子:
#include <iostream> using namespace std; int main() { char url[30] = {0}; //讀取一行字符串 cin.getline(url, 30); //輸出上一條語(yǔ)句讀取字符串的個(gè)數 cout << "讀取了 "<<cin.gcount()<<" 個(gè)字符" << endl; //輸出 url 數組存儲的字符串 cout.write(url, 30); return 0; }
程序執行結果為:
http://c.biancheng.net
讀取了 23 個(gè)字符
http://c.biancheng.net
注意:表 1 和表 2 中僅羅列了 istream
和 ostream
類(lèi)中常用的一些成員方法,關(guān)于這些方法的具體用法,后續章節會(huì )做詳細介紹。
免責聲明:本站發(fā)布的內容(圖片、視頻和文字)以原創(chuàng )、來(lái)自互聯(lián)網(wǎng)轉載和分享為主,文章觀(guān)點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權請聯(lián)系QQ:712375056 進(jìn)行舉報,并提供相關(guān)證據,一經(jīng)查實(shí),將立刻刪除涉嫌侵權內容。
Copyright ? 2009-2021 56dr.com. All Rights Reserved. 特網(wǎng)科技 特網(wǎng)云 版權所有 珠海市特網(wǎng)科技有限公司 粵ICP備16109289號
域名注冊服務(wù)機構:阿里云計算有限公司(萬(wàn)網(wǎng)) 域名服務(wù)機構:煙臺帝思普網(wǎng)絡(luò )科技有限公司(DNSPod) CDN服務(wù):阿里云計算有限公司 中國互聯(lián)網(wǎng)舉報中心 增值電信業(yè)務(wù)經(jīng)營(yíng)許可證B2
建議您使用Chrome、Firefox、Edge、IE10及以上版本和360等主流瀏覽器瀏覽本網(wǎng)站