Файловый поток с повторяющимся вводом

Я пытаюсь создать повторяющееся меню, которое позволит пользователю повторно ввести имя файла, если программа не может открыть файл.

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

typedef istream_iterator<char> istream_iterator;    

string fileName;

ifstream file;

do {        
    cout << "Please enter the name of the input file:" << endl;
    cin >> fileName;

    ifstream file(fileName.c_str());

    if (!file) {
        cout << "File not found" << endl;
    }

} while (!file);

std::copy(istream_iterator(file), istream_iterator(), back_inserter(codeInput));

3 ответа

Решение

Этот код будет работать.

do {
    std::cout << "Please enter the name of the input file:" << std::endl;
    std::cin >> fileName;

    file = std::ifstream(fileName.c_str());

    if (!file) {
        std::cout << "File not found" << std::endl;
    }

} while (!file);

Ваша ошибка была в том, что у вас есть 2 определения файловой переменной. переменная в while (!file) используется тот, который определен вне цикла do-while, и его действительное состояние по умолчанию установлено в true.

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

do {
...
}
while (!file.is_open())

В дополнение к ответу @acraig5075:

Написание типа затем имя переменной (ifstream file), чтобы создать новую переменную. Очевидно, вы это знаете, но если вы снова используете то же имя, например, в цикле, это создаст новую и отличную переменную.

ifstream file; // a unique variable
...
do {
    ...
    ifstream file(fileName.c_str()); // another unique variable

... поэтому измените использование внутри цикла:

    file.open(fileName.c_str());
Другие вопросы по тегам