Где ошибка в этой функции, запрашивающая пользователя ввести имя файла через цикл? - PullRequest
1 голос
/ 04 ноября 2011

Следующая функция работает правильно в Visual C ++, но не в G ++.

void OpenFile(ifstream *input)
{
  string fileName = "";
  while (true) {
    cout << "Enter the filename: ";
    cin >> fileName;
    input->open(fileName.c_str());
    cin.clear();
    if (input->is_open()) break;
    cout << "The filename does not exist. Try again." << endl;
  }
}

В g++, если пользователь правильно введет имя файла в первый раз, программа будет выполнена.Однако, если пользователь неправильно вводит имя файла, функция предложит ему ввести еще одну попытку, и когда пользователь введет правильное имя файла при следующей попытке, курсор переместится на следующую строку, и программа остановится.В чем ошибка?Опять же, это работает правильно в Visual C++.

1 Ответ

1 голос
/ 04 ноября 2011

Что должен делать cin.clear()? Это должно сбросить любую ошибку состояние на входе, но, надеюсь, вход не находится в состоянии ошибки. (В противном случае вы пытаетесь открыть файл без имени.) Неопределенный файл.)

Что касается изменяющегося поведения программы, я подозреваю, что это связано с тем, как система (или библиотека) буферизует ввод. cin >> fileName обычно не возвращается, пока вы не введете новую строку; однако он не удалит символ новой строки из входного потока. В зависимости от того, как ввод буферизуется, это может привести к его блокировке. (хотя я не думаю, что это должно). При попытке зацикливаться на запрос вход, вероятно, лучше использовать std::getline, а затем извлечь информация, которая вам нужна из строки, которую вы прочитали. (В этом случае просто возможно, будет достаточно удалить пустое пространство на обоих концах.)

...