Компьютерный форум OSzone.net  

Компьютерный форум OSzone.net (http://forum.oszone.net/index.php)
-   Программирование и базы данных (http://forum.oszone.net/forumdisplay.php?f=21)
-   -   Сброс флагов потока (http://forum.oszone.net/showthread.php?t=228872)

ab.random 27-02-2012 03:19 1867367

Сброс флагов потока
 
Задание.
Напишите функцию, получающую и возвращающую ссылку на объект класса istream. Функция должна читать данные из потока до тех пор, пока не будет достигнут конец файла. Функция должнавыводить прочитанные данные на устройство вывода. Перед возвращением потока верните все её флаги в допустимое состояние. Проверьте созданную функцию, передав ей объект cin в качестве аргумента. (Липпман, Язык программирования С++. Вводный курс. 4-ое издание, Упражнение 8.3, 8.4, стр 317).
Вопрос.
При вводе цифры или знака конца файла (Ctrl+Z), функция срабатывает как положено. Но при вводе символа, функция бесконечно выдает сообщение об ошибке, хотя должна пропустить итерацию и снова запросить ввод данных. Почему так происходит, в чем ошибка?
Заранее спасибо.
Код:

#include <cstdlib>
#include <iostream>
#include <istream>

using namespace std;

istream &funk(istream &mycin){
        int ival=0;
        while (mycin >> ival, !mycin.eof()){
              if (mycin.bad()){
                cerr << "Error of stream!" << endl;
                break;
              }
              if (mycin.fail()){
                cerr << "Bad data, try again\n"; // выводится в бесконечном цикле
                mycin.clear(istream::failbit);
                continue;
              }
              cout << "You entered " << ival << endl;
        }
        mycin.clear();
                return mycin;
}
       
int main(int argc, char *argv[]){
    funk(cin);
    system("PAUSE");
    return EXIT_SUCCESS;
}

Пробовал вычислить ошибку, проверяя косячный if:
Код:

if (mycin.fail()){
  cerr << "Bad data, try again\n";
  mycin.clear(istream::failbit); // с таким параметром флаг не сбрасывается вообще
                        // если clear() использовать без параметра флаг сбрасывается,
                        // но зацикливание остается                               
    if (!mycin.fail()) cout << "Clear" << endl;
    else cout << "No_clear" << endl;
                               
    system("pause");
    continue;
}


ab.random 27-02-2012 15:12 1867658

Перекомпилировал на MS Visual Studio 2010 (до этого DevC++ использовал с его g++). Никаких изменений. Значит, что-то с потоками. Какие могут быть проблемы? Где я что-то недопонял?


Время: 16:52.

Время: 16:52.
© OSzone.net 2001-