C++ 移行ガイド

入出力ストリーム

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=iostreamCC コマンド行に指定します。このオプションを使用すると、従来の入出力ストリームのヘッダーファイルが入った特別なディレクトリが探索され、従来の入出力ストリーム実行時ライブラリがプログラムとリンクされます。このオプションは、プログラムに必要なすべてのコンパイルだけでなく、最後のリンク段階でも使用する必要があります。そうしないと、一貫性のない結果となります。


注 -

古い形式と新しい形式の入出力ストリーム (標準の入力ストリームと出力ストリーム cincoutcerr を含む) が同じプログラムに混在していると、重大な問題が発生することがあるのでお勧めできません。