1

ユーザーにファイル名の入力を求めています。最初に有効なファイル名を入力すると、機能します。ただし、最初に無効な場合、他のすべてのチェックは失敗します。どうすればこれを修正できますか? また、ディレクトリを指定したとしましょう。すべてのテキスト ファイルの名前とその数を取得するにはどうすればよいでしょうか。

int main() {

    ifstream inFile;
    int result;
    string filename;

    cout << "If the executable is not in the same directory as the\nfile, then a directory needs to be provided\n\n";
    while (true) {
        cout << "Enter the file name:  ";
        getline(cin, filename);
        inFile.open(filename.c_str(), ios::in);

        if (!inFile)
            cout << "\n**File failed to open**\n\n";
        else break;
    }

    result = countLOC(inFile);
    cout << "\nThere are " << result << " lines of code in \"" << filename << "\"\n\n";

    inFile.close();
    return 0;
}
4

5 に答える 5

3

clearを呼び出して、open を呼び出す前の状態をリセットします。

于 2009-05-20T22:52:29.377 に答える
3

これは、オブジェクト「inFile」のエラー ビットが設定されているためです。
他の操作を行う前に、エラー ビットをリセットする必要があります。

if (!inFile)
{
    cout << "\n**File failed to open**\n\n";
    inFile.clear();
}
else break;
于 2009-05-20T22:55:39.277 に答える
0

はい明確にします

ユーザーがディレクトリを提供する場合は、FindFirstとFindNextを実行する必要があります

msdn.microsoft.com/en-us/library/zyzxfzac(VS.71).aspx

すべてのファイルをそのように処理します。

于 2009-05-20T22:58:06.557 に答える
0

それをクリアします。また、ループを中断する必要はありません。代わりにこれをお勧めします。

do {
    if (infile.fail())
       cout << "\n**File failed to open**\n\n";
    infile.clear()
    cout << "Enter the file name:  ";
    getline(cin, filename);
    inFile.open(filename.c_str(), ios::in);
} while(!infile)
于 2009-05-20T23:06:08.430 に答える
0

エラーフラグなどを実際に使用する必要はありません。チェックのために inFile.is_open() 関数を呼び出すだけです。inFile.clear() も使用する必要はありません。

于 2009-05-20T22:57:56.667 に答える