C++ 中 Iostream 的定義
本指南討論如何使用 C++ 中的基本輸入/輸出庫。
利用 <iostream>
標頭在 C++ 中包含全域性流物件
輸入/輸出庫是 C++ STL 的核心部分,幾乎每個現實世界的程式都使用它。C++ I/O 操作被抽象為流的形式,可以認為是通用的資料序列。流抽象是使用多個繼承的類實現的,並作為專門用於某些 I/O 操作的不同命名物件公開給使用者。請注意,基於流的 I/O 庫作為一個整體可用於將文字列印到控制檯或從磁碟上的檔案讀取/寫入資料。你可以將流庫視為 C++ 程式與檔案系統和裝置互動的主要方式。
兩個基本的流類是 istream
和 ostream
,對應於用於讀取和寫入資料的流。這些類提供對字元流的操作。程式經常使用四個全域性流物件來執行諸如獲取使用者輸入或列印錯誤訊息之類的操作。這些物件是:
cout
:它表示與 C 語言中的stdout
對應的標準輸出流。cin
:它是標準輸入流(對應於stdin
)。cerr
:它是作為無緩衝流實現的標準錯誤流(對應於stderr
)。clog
:它是標準的日誌流,沒有 C 等效項,它提供了cerr
的緩衝版本。
I/O 流庫的另一個重要部分是用於在不同物件之間連結操作的運算子。<<
運算子,稱為流插入運算子,將資料推送到流物件中。另一方面,>>
運算子被稱為流提取器。請注意,這些運算子通常對算術型別進行移位運算,但在這種情況下它們被實現為過載運算子。
在以下示例中,我們向你展示了 C++ 基於流的 I/O 類的基本用法。我們使用 cout
物件將 string
內容輸出到控制檯。由於 cout
對應於標準輸出流,我們使用插入運算子將資料推入,它通常會列印到控制檯。請注意,endl
物件被稱為操縱器,它輸出換行符並重新整理輸出緩衝區。
流操縱器有多種型別,有的像 endl
那樣修改輸入/輸出,有的強制流物件以不同的方式解釋輸入/輸出。後者包括數字基操作符,如:dec
、hex
和 oct
。
#include <iostream>
#include <string>
using std::cout; using std::cerr;
using std::endl; using std::string;
int main() {
string str1("what does iostream mean?");
cout << str1 << endl;
cout << str1 << " - " << str1 << endl;
return EXIT_SUCCESS;
}
輸出:
what does iostream mean?
what does iostream mean? - what does iostream mean?
如前面的程式所示,流操作符和物件最強大的特性是多次順序連結。在這種情況下,我們看到我們可以將文字值與其他變數結合起來,將它們全部推送到 cout
流。接下來,我們使用 cin
和 cerr
物件來讀取使用者輸入並列印讀取的資料。
注意需要讀取的型別的物件應該提前宣告為浮點數 x
。插入/提取運算子的另一個有用屬性是,如果操作失敗,它們將返回非零值。或者,你可以使用成員函式 fail
和 bad
來檢查給定的流物件是否遇到特定錯誤。
#include <iostream>
#include <string>
using std::cout; using std::cerr;
using std::endl; using std::string;
using std::cin;
int main() {
float x;
cout << "enter float: ";
if (! (cin >> x)) {
cerr << "error while reading the floating point value!"
<< endl;
return EXIT_FAILURE;
}
cout << x;
return EXIT_SUCCESS;
}
輸出:
error while reading the floating point value!
Founder of DelftStack.com. Jinku has worked in the robotics and automotive industries for over 8 years. He sharpened his coding skills when he needed to do the automatic testing, data collection from remote servers and report creation from the endurance test. He is from an electrical/electronics engineering background but has expanded his interest to embedded electronics, embedded programming and front-/back-end programming.
LinkedIn