0

私はこのプログラムを持っています(プログラムの一部は掲載されていません):

//Includes and functions
int main(int argc, char *argv[])
{
    ifstream loc("achievements.loc", ios::binary);

    getline(loc, header, static_cast<char>(1));

    loc.seekg(15, ios::cur);

    loc.read(reinterpret_cast<char*>(&subdirs), sizeof(subdirs));



    for( int i = 0; i < nstrings; i++ )
    {
        loc.read(reinterpret_cast<char*>(&strid), sizeof(strid));

        loc.read(reinterpret_cast<char*>(&stroffset), sizeof(stroffset));

        curoffset = loc.tellg();
        loc.seekg(strcodesbeg+16+stroffset);

        getline(loc, codestring, '\0');

        loc.seekg(curoffset);

    }

}

次の場合にプログラムを終了したい: - ファイルが開かれていない。- getline によって取得されたヘッダー文字列が "String" と等しくありません。- 読み取り機能のいずれかが失敗します。- いずれかのシークが失敗します。- ストライド、1234 と一致しません。

C++ 例外を使用してこれを行うにはどうすればよいですか? try{}catch(...){}たとえば、データを読み取ってEOF_REACHED失敗時に送信する関数を作成する単一のブロックを使用する必要がありますか、または a try{}catch(var e){}catch(var2 e){}、 a class、またはその他の方法ですか?

単純な関数では例外の概念は理解できますが、プログラムが大きくなると複雑になります。

メイン関数で try catch ブロックを明示的に使用する C++ ソース コードも見つかりませんでしたが、例外で動作します。これはどのように可能ですか?

4

1 に答える 1

0

これを行う最も冗長な方法は、特定の例外をサブクラス化して、何が起こったかについてのコンテキストを提供することです。たとえば、次のようになります。

class FileNotOpenedException : public std::runtime_error {};

int main(int argc, char *argv[])
{
   try
   {
      ifstream loc("achievements.loc", ios::binary);

      if(!loc.is_open())
         throw FileNotOpenedException;

      // ...
   }
   catch(const FileNotOpenedException& e)
   {
      // ...
   }
}

ただし、予想されるエラー条件に対して例外を使用することは、必ずしも良い方法ではないことに注意してください。例外は、真に「例外的な」条件、つまりプログラムでは完全に予想外であり、特定のスコープで回復する方法がない場合にのみ使用する必要があります。上記の開かれていないファイルは悪い例です。ただし、read()またはseekg()関数のいずれかが失敗する方が適切な場合があります。

そうは言っても、あなたが求めていることを行うことは可能であり、上記はそれを行う1つの方法の例です.

于 2012-07-20T20:15:56.870 に答える