2009-05-20 6 views
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; 
} 

ответ

3

Это связано с тем, что бит ошибки в объекте 'inFile' был установлен.
Вам необходимо сбросить бит ошибки, прежде чем делать что-либо еще.

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

Вызов clear для сброса состояния перед вызовом, чтобы открыть.

0

Вам не нужно использовать флаги ошибок и т.д., вы можете просто вызвать функцию inFile.is_open() для проверки. Вам также не нужно использовать inFile.clear().

0

Да сделать четкий

если пользователь предоставляет каталог вам нужно сделать FindFirst и FindNext

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

и обрабатывать все файлы таким образом.

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) 
Смежные вопросы