2012-03-21 3 views
0

После того, как программа считывает файл, получает символы из файла и заканчивается, пользователь спрашивает, хочет ли он читать другой файл. Если пользователь говорит «да», программа запрашивает имя файла, но затем автоматически сообщает, что файл не может быть открыт и выходит из цикла. Пожалуйста, помогите мне.Последующие файлы C++ не открываются после первого файла

Вот код:

do //do while opening the source file fails 
     { 
     cout << "Enter filename of source file: "; 
     cin.getline (filename,51); 
     sourceFile.open(filename); //opens the file with given filename 
     if (sourceFile.fail()) 
      cout << "File could not be opened" << endl; //error if can't open 
     sourceFile.clear(); 
     } 
     while (sourceFile.fail()); //exits if source file doesn't fail 
+1

Пробовали ли вы отладчик? Получилось ли имя файла, которое вы пытались открыть? –

+0

Что такое хороший отладчик? –

+1

Какая ошибка у вас? В какой системе вы работаете? 'gdb' - популярный отладчик, но то, что вы используете, будет зависеть от того, какую систему вы используете. –

ответ

1

Этот тест:

while (sourceFile.fail()) 

никогда не будет так, потому что как раз перед тем, как попасть вы звоните:

sourceFile.clear() 

который очистит любой бит задачи в iostate для потока.

Я думаю, вы просто хотите избавиться от звонка до clear().

+0

хорошо работает, потому что первый файл открывается нормально, когда он запускается через это делать while loop –

+0

@TylerGavin: Я думал, что проблема в том, что если open не прошел, цикл не пошел, чтобы снова запросить имя файла. –

+0

@TylerGavin: Думаю, теперь я вижу - я считаю, что то, что у меня есть в этом ответе, является проблемой в вашем коде (если open не удается, у вас не будет возможности повторить попытку, и это то, что я думаю, что цель цикла). Однако, похоже, ваша непосредственная проблема решается комментарием arminb. –

0

Канонический способ проверить, если открыть файл не удалось, чтобы использовать std::basic_ios::operator !():

do 
{ 
    cout << "Enter filename of source file: "; 
    std::getline(std::cin, filename); 
    sourceFile.open(filename.c_str()); 
    if (!sourceFile) 
    { 
     cout << "File could not be opened" << endl; 
    } 
} 
while (!sourceFile);