1

tryブロックとブロックを使用して、C++ で例外処理を開始したところcatchです。いくつかのデータを含むテキスト ファイルがあり、以下に示すようにifstreamandを使用してこのファイルを読み込んでいます。getline

ifstream file;
file.open("C:\\Test.txt", ios::in);
string line;
string firstLine;
if (getline(file, line, ' '))
{
    firstLine = line;
    getline(file, line);
}

file.open指定されたパスに存在しないために指定されたファイルを開くことができない場合の例外処理を実装する方法を知りたいですTest.txtC:

4

3 に答える 3

13

デフォルトでは、iostream は例外をスローしません。代わりに、いくつかのエラー フラグを設定します。前の操作が bool へのコンテキスト変換で成功したかどうかをいつでもテストできます。

ifstream file;
file.open("C:\\Test.txt", ios::in);
if (!file) {
    // do stuff when the file fails
} else {
    string line;
    string firstLine;
    if (getline(file, line, ' '))
    {
        firstLine = line;
        getline(file, line);
    }
}

exceptionsメンバー関数を使用して例外を有効にすることができます。多くの場合、次のようなことを行うことができなくなるため、これを行うことはあまり役に立ちませんwhile(getline(file, line))。そのようなループは例外で終了するだけです。

ifstream file;
file.exceptions(std::ios::failbit);
// now any operation that sets the failbit error flag on file throws

try {
    file.open("C:\\Test.txt", ios::in);
} catch (std::ios_base::failure &fail) {
    // opening the file failed! do your stuffs here
}

// disable exceptions again as we use the boolean conversion interface 
file.exceptions(std::ios::goodbit);

string line;
string firstLine;
if (getline(file, line, ' '))
{
    firstLine = line;
    getline(file, line);
}

ほとんどの場合、iostream で例外を有効にすることは面倒だとは思いません。API は、それらをオフにした方がうまく機能します。

于 2012-05-18T09:42:32.863 に答える
3

IOstreamには、さまざまな状態ビットの例外をオンにするオプションがあります。参照には、まさにあなたが求めていたものである非常に明確な例があります。

于 2012-05-18T09:45:33.170 に答える
0

まあ、それはすべて、ファイルが存在しない場合に何をしたいかによって異なります。

現時点でのコード (これが であると仮定main) は、プロセスを終了します。

ただし、これが関数呼び出しの場合は、おそらくこの関数の呼び出しの周りに例外処理を追加する必要があります。

例えば

try
{
    OpenAndReadFile( std::string filename );
}
catch ( std::ifstream::failure e )
{
    // do soemthing else
}
catch ( OtherException e )
{
}
catch ( ... )
{
    // All others
}

これは、 に対して例外のスローがオンになっていることを前提としていifstreamます。

于 2012-05-18T09:43:25.270 に答える