none
Восстановление потока RRS feed

  • Вопрос

  • Здравствуйте. Восстанавливаю поток:

    #include"iostream"
    using namespace std;
    int main(){
     setlocale(LC_ALL, "Russian");
     int i = 1;
     char ch=0;
     do{
      cout << "Вводите: ";
      cin >> i;
      if (!cin.good()){
       cin.clear();
       do{
        ch = cin.get();
        cout << "Вынимаем из буфера: " << (int)ch << ' ' << cin.good() << ' ' << cout.good() << ' ' << cin.rdstate() << '\n';
       }while (ch != 10);
      }
     } while (i);
     system("pause");
     return 0;
    }

    всё хорошо, но если так:

    #include"iostream"
    using namespace std;
    int main(){
     setlocale(LC_ALL, "Russian");
     int i = 1;
     char ch=0;
     do{
      cout << "Вводите: ";
      cin >> i;
      if (!cin.good()){
       cin.clear();
       while (ch != 10){
        ch = cin.get();
        cout << "Вынимаем из буфера: " << (int)ch << ' ' << cin.good() << ' ' << cout.good() << ' ' << cin.rdstate() << '\n';
       }
      }
     } while (i);
     system("pause");
     return 0;
    }

    но если так, то всё хорошо только один раз, то есть один раз идёт восстановление, а потом почему-то восстановление не срабатывает, я честно говоря без понятия почему. Помогите пожалуйста. Спасибо.

    14 апреля 2015 г. 14:30

Ответы

  • У вопроса много просмотров, поэтому решил не удалять, возможно народу будет интересен ответ, только что догадался: суть проблемы в том что во второй версии (где while а не do while) цикл очистки никогда второй раз (для очередного насильственного опустошения буфера) не запустится, потому что в ch находится 10 (ещё с прошлого то есть первого исправления). Поэтому флаги мы утановим в положение good, однако в очередной раз, когда теже ошибочные данные (буквы скажем) cin попытается сконвертировать в число и получит ошибку, исправление не сработает, по-скольку буфер не очистится (ибо цикл не запустится - в ch 10 с прошлого раза - это условие выхода). Совсем другой разговор при do while, там перед каждой проверкой значение ch обновится, по этому прошлый символ перехода на новую строку - 10(в таблице) уже не будет находится к моменту проверки условия выхода и буфер аккуратно опустошится. Надеюсь не слишком замудрил и не зря писал:)
    14 апреля 2015 г. 19:21