Файловый поток с повторяющимся вводом
Я пытаюсь создать повторяющееся меню, которое позволит пользователю повторно ввести имя файла, если программа не может открыть файл.
Прямо сейчас это работает правильно, если я ввожу имя существующего файла, но если файл не существует, он печатает "Файл не найден", а затем выполняет остальную часть программы. Я новичок в файловых потоках, и большая часть кода была найдена по ссылкам. Я немного растерялся, что именно происходит и как лучше всего справиться с ситуацией. Любое руководство будет оценено.
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());