-1

C++は初めてですが、プログラミングの経験はあります...

ユーザーからファイル名を取得してからファイルを開くという非常に基本的なアプローチを試みています。私はいくつかの非標準ライブラリ (スタンフォード ライブラリ) を使用していますが、それが影響を与えるとは思いません。

     ifstream in;
while(true){
    string filename="";
    cout << "Enter the name of the file. ";
    getline(cin, filename);
    in.open(filename.c_str());
    if (in.fail()){
        cout << "ERROR opening file. Try again.";
    } else {
        break;
    }
}
     ... more code ...

最初に有効なファイル名を入力すると、問題なく動作し、先に進みます。無効なファイル名を入力すると、エラー メッセージが表示され、別のファイル名を要求するためにループしますが、ファイルが有効であっても、後続のすべてのエントリが無効として扱われます。私が間違っていることはありますか?ありがとう!

4

1 に答える 1

2

in.clear()の後に電話してみてくださいif (in.fail()){。これにより、ファイル ステータス ビットがクリアされるため、次の への呼び出しfail()では、最後の呼び出しの結果が表示openされます (最後の失敗したopenステータスを表示するのではなく)。C++ ドキュメントから:

void clear ( iostate state = goodbit );

エラー状態フラグの設定 エラー制御状態の新しい値を設定します。

制御状態のすべてのビットが新しいビットに置き換えられます。呼び出し前に存在する値は無効です。

引数として goodbit (デフォルト値) を指定して関数を呼び出すと、すべてのエラー フラグがクリアされます。

于 2012-07-25T15:57:16.467 に答える