热门问题
时间线
聊天
视角
iostream
C++提供输入/输出的標準函示庫 来自维基百科,自由的百科全书
Remove ads
iostream是C++中用於數據的流式輸入與輸出的頭文件,屬於C++標準程式庫的一部分。[1][2]
iostream 為 Input/Output Stream 的縮寫,即是輸入/輸出流。「流」是一連串從I/O設備讀寫的字符。[3]
概述
流輸入輸出庫中的大部分類都是模板類,可以適用於不同的字符類型或操作函數(如字符比較)。常用的一些字符類型的流輸入輸出已經用typedef定義了相應的模板特化實例。
例如,basic_fstream<CharT,Traits>
是文件流輸入輸出的實現的模板類。它的一個特化實例:fstream
是basic_fstream<char,char_traits<char>>
的類型別名,換句話說,這是basic_fstream
的字符類型為char
使用默認字符操作集的特化實例。
流輸入輸出庫中的類可分為兩類。一是定義了界面的抽象,適用於任何流類型,無論是文件流、內存緩存區流或者網絡socket流。二是對具體數據源與數據匯(sink)的流的實現。C++標準庫僅實現了文件流與內存緩衝區流。
流輸入輸出庫中的類依據是否實現底層或高層操作可分為兩類。實現了底層操作的類稱作流緩衝區(stream buffer),處理沒有任何格式化功能的字符。這些類極少被編程者直接使用。實現高層操作的類稱作流,並提供了不同的格式化能力,是構建於流緩衝區之上的。
下表列出了流輸入輸出庫的所有類的分類:
Remove ads
<ios>
包含着ios_base
與basic_ios
的類的定義,負責信息格式化與關聯的流緩衝區。<istream>
包含了basic_istream
類模板定義,實現了格式化輸入<ostream>
包含了basic_ostream
類模板定義,實現了格式化輸出<iostream>
包含了basic_iostream
類模板定義,實現格式化輸入輸出<fstream>
包含了basic_ifstream
,basic_ofstream
與basic_fstream
類模板定義,實現格式化文件流的格式化輸入、輸出<sstream>
包含了basic_istringstream
,basic_ostringstream
與basic_stringstream
類模板定義,實現格式化字符串流的輸入輸出<iomanip>
包含了格式化manipulator<iosfwd>
包含了所有的流輸入輸出庫的前向聲明(forward declaration)
Remove ads
支持類
ios_base
與basic_ios
是兩個類處理底層比特流。ios_base
存儲格式化信息與流的狀態。basic_ios
管理關聯的流緩衝區。basic_ios
通常以特化實例ios
與wios
出現。basic_ios
與ios_base
很少被程序員直接使用。通常,它們的功能通過其它派生的類,如iostream
。[4][5]
Remove ads
輸入/輸出流
iostream
頭文件定義了輸入輸出流對象:cin
, cout
, cerr
, clog
分別為標準輸入、輸出、錯誤(無緩衝)、簿記(有緩衝)的流對象。都屬於std
名字空間。[6]
cout
屬於ostream
類型,重載了左移位算符。cout左移位算符的運算結果為cout自身,這使得連續的左位移操作輸出一串數據成為可能。cerr
與clog
對象是ostream
類型。
cin
是istream
類型,重載了右位移算符。
輸入設備是按照行來把數據移入流輸入緩衝區。也就是說,鍵盤輸入數據時,只有按了換行鍵,這一行數據才進入緩衝區,可以讀取。
表達式cin >> ival
從標準輸入讀入一個值。有兩種情況會使一個istream對象的bool轉型為false:讀到EOF(文件結束標誌)或遇到一個無效的值(輸入流進入fail狀態)。可以用該istream對象的成員函數good()來測試,或者直接(bool)cin來測試。
istream對象的bool轉型為false的情況下,此後的所有讀入動作都是無操作(nop)。直到調用istream對象的成員函數clear()來清除該對象的內部狀態。
缺省情況下,輸入操作符丟棄空白符、空格符、制表符、換行符以及回車。如果希望讀入上述字符,或讀入原始的輸入數據,一種方法是使用istream的get()成員函數來讀取一個字符,另一種方法是使用istream的getline()成員函數來讀取多個字符。istream的read(char* addr, streamsize size)函數從輸入流中提取size個連續的字節,並將其放在地址從addr開始的內存中。istream成員函數gcount()返回由最後的get()、getline()、read()調用實際提取的字符數。
輸入流有三個函數來測試流狀態:即bad(), fail()和eof()。ignore()用來拋掉制定個數的緩衝區中的字節。
其它的istream成員函數:putback( char c ) 將字符放回iostream;unget()往回重置「下一個」istream項;peek()返回下一個字符或EOF,但不要提取出來 。
Remove ads
輸出格式化
width(int x) |
下一個輸出的最小字符數目 |
fill(char x) |
填充字符 |
precision(int x) |
設置浮點數的有效數字的位數 |
操縱符(manipulator)是使用<<
或>>
算子修改流的對象.
endl |
"end line": 流中插入換行符並刷新(flush)流的輸出緩衝. |
ends |
"end string": 向流中插入空字符(null character)並刷新(flush)流的輸出緩衝. |
flush |
強迫流的輸出緩衝寫出到輸出設備. |
ws |
導致輸入流吃掉空白(whitespace) |
showpoint |
指示流要顯示小數點與一些數字0 |
頭文件中iomanip
還定義了一些manipulators。
批評
某些環境下並不提供共享版本的C++庫。導致程序要靜態編譯入C++標準庫,使得程序的尺寸變大。[7]
示例
使用C++寫成的 Hello World 程序如下所示:
#include <iostream>
using namespace std;
int main()
{
cout << "Hello, world!" << endl;
return 0;
}
在這段代碼中,文件 iostream 中聲明了程序所要輸入和輸出操作的有關信息。
下述代碼創建一個文件'file.txt'並寫入文本'Hello World':
#include <fstream>
int main()
{
std::ofstream file;// can be merged to std::ofstream file("file.txt");
file.open("file.txt");
file << "Hello world!\n";
file.close();// is not necessary because the destructor closes the open file by default
return 0;
}
參考文獻
外部連結
Wikiwand - on
Seamless Wikipedia browsing. On steroids.
Remove ads