Последующие файлы С++ не открываются после первого файла

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

Вот код:

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

person Tyler Gavin    schedule 21.03.2012    source источник
comment
Вы пробовали отладчик? Имеет ли смысл имя файла, который вы пытались открыть?   -  person Carl Norum    schedule 21.03.2012
comment
что такое хороший отладчик?   -  person Tyler Gavin    schedule 21.03.2012
comment
Какая у вас ошибка? На какой системе вы работаете? gdb — это популярный отладчик, но то, что вы будете использовать, будет зависеть от того, какую систему вы используете.   -  person Carl Norum    schedule 21.03.2012
comment
вы пробовали .close() файл?   -  person arminb    schedule 21.03.2012


Ответы (2)


Этот тест:

while (sourceFile.fail())

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

sourceFile.clear()

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

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

person Michael Burr    schedule 21.03.2012
comment
хорошо, это работает, потому что первый файл открывается нормально, когда он проходит через этот цикл do while - person Tyler Gavin; 21.03.2012
comment
@TylerGavin: я думал, что проблема в том, что если открытие не удалось, цикл не повторяется, чтобы снова запросить имя файла. - person Michael Burr; 21.03.2012
comment
@TylerGavin: кажется, теперь я понимаю - я считаю, что то, что у меня есть в этом ответе, является проблемой в вашем коде (если открытие завершится ошибкой, у вас не будет возможности повторить попытку, что, я думаю, и есть цель цикла) . Однако похоже, что ваша непосредственная проблема решена комментарием arminb. - person Michael Burr; 21.03.2012

Канонический способ проверить, не удалось ли открыть файл, — использовать 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);
person Johnsyweb    schedule 27.04.2012