C++ 4.2 コンパイラには、これまで正式な定義ではなかった「従来型」の入出力ストリームが実装されています。この実装形式は、Cfront (1990 年) とともにリリースされたバージョンと互換性があり、いくつかの問題点が解決されています。
標準 C++ では、新しい入出力ストリームと拡張された入出力ストリーム (標準入出力ストリーム) が定義されています。新しい入出力ストリームは、綿密に定義されており、機能が豊富で、多言語化対応のコードの記述に利用できます。
C++ 5.0 コンパイラの互換モードでは、C++ 4.2 で提供されるものと同じ従来型の入出力ストリームがサポートされています。4.2 コンパイラで動作する既存の入出力ストリームはどれも、5.0 の互換モードでも同様に動作します。
新バージョンの入出力ストリームには、標準モードでアクセスできます。標準の入出力ストリームにアクセスするには、<iostream>、<fstream>、<sstream> などの新しい形式の標準ヘッダーを使用します。新しい形式のヘッダー名の末尾が .h ではないことに注意してください。
標準モードでは、デフォルトで標準の入出力ストリームが使用されます。標準形式のヘッダー名 (「.h」なし) を使用すると、標準ヘッダーが使用されます。その場合、すべての宣言は名前空間 std にあります。
それぞれの標準ヘッダーは「.h」で終わる形式のものも用意されています。これを使用すると、すべてのヘッダー名が using 宣言によって大域名前空間に存在するようになります。これらのヘッダーはサンの拡張であるため、これに依存するコードは移植性がない可能性があります。これらのヘッダーを使用すると、従来の入出力ストリームの代りに標準の入出力ストリームを使用している場合でも、既存の (簡単な) 入出力ストリームコードを変更せずにコンパイルできます。たとえば、次の下のコードは、従来の入出力ストリームでもサンの標準入出力ストリームの実装でもコンパイルできます。
標準の名前形式の iostream を使用 - hello1.cc
#include <iostream> int main() { std::cout << "Hello, world!" << std::endl; }
従来の名前形式の iostream を使用 - hello2.cc
#include <iostream.h> int main() { cout << "Hello, world!" << endl; }
すべての従来の入出力ストリームコードが標準入出力ストリームと互換性があるとは限りません。従来の入出力ストリームコードをコンパイルできない場合は、コードを変更するか、従来の入出力ストリームだけを使用する必要があります。
従来の入出力ストリームを標準モードで使用する場合は、コンパイラオプション library=iostream を CC コマンド行に指定します。このオプションを使用すると、従来の入出力ストリームのヘッダーファイルが入った特別なディレクトリが探索され、従来の入出力ストリーム実行時ライブラリがプログラムとリンクされます。このオプションは、プログラムに必要なすべてのコンパイルだけでなく、最後のリンク段階でも使用する必要があります。そうしないと、一貫性のない結果となります。
古い形式と新しい形式の入出力ストリーム (標準の入力ストリームと出力ストリーム cin、cout、cerr を含む) が同じプログラムに混在していると、重大な問題が発生することがあるのでお勧めできません。