Является ли stream.clear () необходимым в c ++ после сбоя? - PullRequest
0 голосов
/ 17 сентября 2018

У меня есть следующий код:

string promptPlayerForFile(ifstream &infile, string prompt) {
    while (true) {
        string filename;
        cout << prompt;
        getline(cin, filename);
        infile.open(filename.c_str());
        if (!infile.fail()) return filename;
        infile.clear();
        cout << "Unable to open that file. Try again." << endl;
    }
}

Функция работает должным образом: вы вводите имена файлов до тех пор, пока не дадите правильное имя, в этом случае она связывает поток с файлом и возвращает строку имени файла.

Затем я попытался закомментировать строку infile.clear(), чтобы посмотреть, что произойдет. (Я прочитал, что он должен быть включен после сбоя, чтобы сбросить соответствующие биты потока.)

Однако, после комментирования, функция ведет себя как прежде. Если я сначала задаю неправильное имя файла, а затем правильное, оно работает, так что каким-то образом биты сброса сбрасываются даже без этой строки. Нужно ли infile.clear() и как его использовать?

Ответы [ 2 ]

0 голосов
/ 17 сентября 2018

Если вы используете C ++ 11 или выше, вам не нужно звонить infile.clear();.Если open() успешно, то вызывается clear().

Если вы используете компилятор до C ++ 11, необходимо вызвать infile.clear().Язык не гарантирует, что биты сбрасываются при успешном open().

См. https://en.cppreference.com/w/cpp/io/basic_ifstream/open для получения подробной информации о вызове clear().

0 голосов
/ 17 сентября 2018

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

...