iostream

C++提供输入/输出的標準函示庫

iostreamC++中用於數據的串流輸入與輸出標頭檔,屬於C++標準程式函式庫的一部分。[1][2]

iostream 為 Input/Output Stream 的縮寫,即是輸入/輸出流。「流」是一連串從I/O裝置讀寫的字元[3]

概述

資料流輸入輸出函式庫中的大部分類別都是模板類別,可以適用於不同的字元型別或操作函數(如字元比較)。常用的一些字元型別的資料流輸入輸出已經用typedef定義了相應的模板特化實例。

例如,basic_fstream<CharT,Traits>是檔案資料流輸入輸出的實作的模板類別。它的一個特化實例:fstreambasic_fstream<char,char_traits<char>>的型別別名,換句話說,這是basic_fstream的字元型別為char使用預設字元操作集的特化實例。

資料流輸入輸出函式庫中的類別可分為兩類。一是定義了介面的抽象,適用於任何流型別,無論是檔案流、主記憶體快取區流或者網絡socket流。二是對具體數據源與資料槽(sink)的流的實作。C++標準函式庫僅實作了檔案流與主記憶體緩衝區流。

資料流輸入輸出函式庫中的類別依據是否實作底層或高層操作可分為兩類別。實作了底層操作的類別稱作流緩衝區(stream buffer),處理沒有任何格式化功能的字元。這些類別極少被程式設計師直接使用。實作高層操作的類別稱作流,並提供了不同的格式化能力,是建構於流緩衝區之上的。

下表列出了資料流輸入輸出函式庫的所有類別的分類:

Class 解釋 Typedefs
Stream buffers (底層功能)
basic_streambuf 提供了底層的輸入輸出介面,被具體的數據源與槽實作。罕用
  • streambuf - 字元型別char
  • wstreambuf - 字元型別wchar_t
basic_filebuf 提供了檔案流的底層的輸入輸出介面,被具體的數據源與槽實作。罕用
  • filebuf - 字元型別 char
  • wfilebuf -字元型別 wchar_t
basic_stringbuf 提供了字元檔案流的底層的輸入輸出介面,被具體的數據源與槽實作。罕用
  • stringbuf - 字元型別char
  • wstringbuf - 字元型別wchar_t
Support classes
ios_base 管理格式化資訊與異常狀態 不適用
basic_ios 管理流緩衝區
  • ios - 字元型別char
  • wios - 字元型別wchar_t
Input streams buffers (高層功能)
basic_istream 包裝一個抽象流緩衝區並提供高層輸入介面,如格式化能力
  • istream - 字元型別 char
  • wistream - 字元型別wchar_t
basic_ifstream 包裝一個檔案流緩衝區並提供高層輸入介面,如打開關閉流
  • ifstream - 字元型別char
  • wifstream - 字元型別wchar_t
basic_istringstream 包裝一個字串流緩衝區並提供高層輸入介面,如訪問基礎字串
  • istringstream - 字元型別char
  • wistringstream - 字元型別wchar_t
Output streams buffers (高層功能)
basic_ostream 包裝一個抽象流緩衝區並提供高層輸出介面,如格式化能力
  • ostream - 字元型別char
  • wostream - 字元型別wchar_t
basic_ofstream 包裝一個檔案流緩衝區並提供高層輸出介面,如打開關閉流
  • ofstream - 字元型別char
  • wofstream - 字元型別wchar_t
basic_ostringstream 包裝一個字串流緩衝區並提供高層輸出介面,如訪問基礎字串
  • ostringstream - 字元型別char
  • wostringstream - 字元型別wchar_t
Input/output streams buffers (高層功能)
basic_iostream 包裝一個抽象流緩衝區並提供高層輸入輸出介面,如格式化能力
  • iostream - 字元型別char
  • wiostream - 字元型別wchar_t
basic_fstream 包裝一個檔案資料流輸入輸出緩衝區,並提供高層輸入輸出介面,如打開關閉檔案
  • fstream - 字元型別char
  • wfstream - 字元型別wchar_t
basic_stringstream 包裝一個字串資料流輸入輸出緩衝區,並提供高層輸入輸出介面,如訪問基礎字串
  • stringstream - 字元型別char
  • wstringstream - 字元型別wchar_t

標頭檔

  • <ios>包含着ios_basebasic_ios的類別的定義,負責資訊格式化與關聯的流緩衝區。
  • <istream>包含了basic_istream類別模板定義,實作了格式化輸入
  • <ostream>包含了basic_ostream類別模板定義,實作了格式化輸出
  • <iostream>包含了basic_iostream類別模板定義,實作格式化輸入輸出
  • <fstream>包含了basic_ifstream, basic_ofstreambasic_fstream類別模板定義,實作格式化檔案流的格式化輸入、輸出
  • <sstream>包含了basic_istringstream, basic_ostringstreambasic_stringstream 類別模板定義,實作格式化字串流的輸入輸出
  • <iomanip>包含了格式化manipulator
  • <iosfwd>包含了所有的資料流輸入輸出函式庫的前向宣告(forward declaration)

支援類別

ios_basebasic_ios是兩個類別處理底層位元流。ios_base儲存格式化資訊與流的狀態。basic_ios管理關聯的流緩衝區。basic_ios通常以特化實例ioswios出現。basic_iosios_base很少被程式設計師直接使用。通常,它們的功能通過其它衍生的類別,如iostream[4][5]

Typedefs

名字 描述
ios basic_ioschar型別特化
wios basic_ioswchar_t型別特化
streamoff 支援內部操作
streampos 儲存緩衝區指標或檔案指標的當前位置
wstreampos 儲存寬字元版的緩衝區指標或檔案指標的當前位置
streamsize 流的尺寸

格式化操縱符(manipulator)

名字 描述
boolalpha / noboolalpha 指示流中的bool型別變數是否以truefalse,還是以01形式出現
skipws / noskipws 指示輸入操作時空白符是否被跳過
showbase / noshowbase 指示數的基數記數標誌是否顯示
showpoint / noshowpoint 指示當浮點數小數部分為0時,是否顯示小數部分
showpos / noshowpos 指示對於正數是否顯示+符號
unitbuf / nounitbuf 指示輸出是否被緩衝
uppercase / nouppercase 指示在16進制整數或浮點數輸出時是否使用大寫字元
left / right / internal 指出對齊方式
dec / oct/ hex 指示顯示整數時的記數法
fixed / scientific/
hexfloat(C++11) /
defaultfloat(C++11)
指示浮點數顯示時的記數法

輸入/輸出流

iostream標頭檔定義了輸入輸出流對象:cin, cout, cerr, clog分別為標準輸入、輸出、錯誤(無緩衝)、簿記(有緩衝)的流對象。都屬於std 名字空間[6]

ostream對象

cout屬於ostream型別,多載了左移位運算子。cout左移位運算子的運算結果為cout自身,這使得連續的左位移操作輸出一串數據成為可能。cerrclog對象是ostream型別。

istream對象

cinistream型別,多載了右位移運算子。

輸入裝置是按照行來把數據移入流輸入緩衝區。也就是說,鍵盤輸入數據時,只有按了換行鍵,這一行數據才進入緩衝區,可以讀取。

表達式cin >> ival從標準輸入讀入一個值。有兩種情況會使一個istream對象的bool轉型為false:讀到EOF(檔案結束標誌)或遇到一個無效的值(輸入流進入fail狀態)。可以用該istream對象的成員函數good()來測試,或者直接(bool)cin來測試。

istream對象的bool轉型為false的情況下,此後的所有讀入動作都是無操作(nop)。直到呼叫istream對象的成員函數clear()來清除該對象的內部狀態。

預設情況下,輸入運算子丟棄空白符、空格符、製表符('\n')、換行符以及Enter。如果希望讀入上述字元,或讀入原始的輸入數據,一種方法是使用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,但不要提取出來 。

輸出格式化

方法(函數)

width(int x) 下一個輸出的最小字元數目
fill(char x) 填充字元
precision(int x) 設置浮點數的有效數字的位數

操縱符(manipulator)

操縱符(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;
}

參考文獻

  1. ^ ISO/IEC 14882:2003 Programming Languages — C++. [lib.string.streams]/1
  2. ^ Stanley B. Lippman, Josee Lajoie. C++ Primer. Massachusetts: Addison-Wesley. 1999 - third edition: 1109–1112. ISBN 0-201-82470-1. 
  3. ^ C++ Primer (5th Edition). : 5. ISBN 0-201-72148-1. 
  4. ^ Stanley B. Lippman, Josee Lajoie. C++ Primer. Massachusetts: Addison-Wesley. 1999 - third edition: 1112–1120. ISBN 0-201-82470-1. 
  5. ^ <ios> Visual Studio 2010. Microsoft MSDN: Visual Studio 2010. [28 September 2011]. (原始內容存檔於2016-03-10). 
  6. ^ Holzner, Steven. C++ : Black Book. Scottsdale, Ariz.: Coriolis Group. 2001: 584. ISBN 1-57610-777-9. ...endl, which flushes the output buffer and sends a newline to the standard output stream. 
  7. ^ MinGW.org: Large executables. [22 April 2009]. (原始內容存檔於2020-07-04). 

外部連結