## 9.2 ファイルストリームの操作

### 9.2.1 ファイルストリームオブジェクトの作成とオープン

ファイルストリームの作成方法は 2 通りあります。11 空のファイルストリームを作成してファイルを開き、開いたファイルを後からストリームに接続する方法と、構築時にファイルを開いてストリームに接続する方法です。次の例では、この 2 通りの手続きをそれぞれ示します。

>     ifstream file;                                                //1
>     ;
>     file.open(argv[1]);                                           //2
>     if (!file) // エラー: 入力用にファイルを開くことができません

または

>     ifstream source("src.cpp"); //3
>     if (!source) // エラー: 入力用に src.cpp を開くことができません

//1 | どのファイルにも接続されていないファイルストリームが作成されます。ファイルストリーム上の演算はすべて失敗します。
//2 | この場合は、ファイルが開かれ、ファイルストリームに接続します。ファイルを開くことができない場合は、`ios_base::failbit` が設定されます。開くことができれば、これでファイルストリームは使用することができます。
//3 | この場合は、ファイルは開かれると同時にストリームに接続します。

### 9.2.2 ファイルストリームの状態の検査

一般に、ファイルが正しく開かれたかどうかは、後でストリームの状態を調べることで確認することができます。失敗した場合は、`failbit` が設定されます。

`is_open()` という関数がありますが、これは開かれたファイルにファイルストリームが接続されているかどうかを示す関数です。この関数は、`open()` に対する直前の呼び出しが成功したかどうかを示すものではありません。この微妙な違いを理解するために、ファイルに接続済みのファイルストリームを例に挙げます。次のコードでは、`open()` への呼び出しが失敗した場合でも、`is_open()` は真を返します。

>     void main(int argc, char* argv[])
>     {
>       if (argc > 2)
>       {  ofstream fil;                                            //1
>          fil.open(argv[1]);
>          // ...
>          fil.open(argv[2]);                                       //2
>          if (fil.fail())                                          //3
>          {  // オープンに失敗しました  }
>          if (fil.is_open())                                       //4
>          {  // 開かれているファイルに接続しました  }
>       }
>     }

//1 | ファイルを開き、ファイルストリームをそのファイルに接続します。
//2 | このストリームを開こうとすると失敗します。
//3 | したがって、`failbit` が設定されます。
//4 | しかし、開かれたファイルにファイルストリームが接続されたままなので、`is_open()` は、依然として真を返します。

### 9.2.3 ファイルストリームを閉じる

上記の例では、

    void main(int argc, char* argv[])
    {
      if (argc > 2)
      {  ofstream fil;
         fil.open(argv[1]);
         // ...
      }                                                           //1
      {  ofstream fil;
         fil.open(argv[2]);
        // ...
      }
    }

//1 | ここで、ファイルストリーム `fil` は削除され、このストリームが接続していたファイルは自動的に閉じます。

接続先のファイルを明示的に閉じることもできます。その場合、ファイルストリームは別のファイルに接続するまで空になります。

>     ifstream f;                                                   //1
>     for (int i=1; i<argc; ++i)
>     {
>         f.open(argv[i]);                                          //2
>         if (f)                                                    //3
>         {
>             process(f);                                           //4
>             f.close();                                            //5
>         }
>         else
>             cerr << "file " << argv[i] << " cannot be opened.\n";
>     }

//1 | 空のファイルストリームを作成します。
//2 | ファイルが開き、ファイルストリームに接続します。
//3 | ファイルが正しく開いたかどうかを確認します。ファイルが開かなかった場合は、`failbit` が設定されます。
//4 | これで、ファイルストリームが使用できるようになりました。ファイルの内容を読み取って処理することができます。
//5 | 再びファイルを閉じます。ファイルストリームも空になります。

Copyright (c) 1998, Rogue Wave Software, Inc.
このマニュアルに関する誤りのご指摘やご質問は、電子メールにてお送りください。

OEM リリース, 1998 年 6 月