Имя пользователя:
Пароль:  
Помощь | Регистрация | Забыли пароль?  | Правила  

Компьютерный форум OSzone.net » Программирование, базы данных и автоматизация действий » Программирование и базы данных » C/C++ - Сброс флагов потока

Ответить
Настройки темы
C/C++ - Сброс флагов потока

Аватара для ab.random

Новый участник


Сообщения: 29
Благодарности: 1

Профиль | Отправить PM | Цитировать


Задание.
Напишите функцию, получающую и возвращающую ссылку на объект класса 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;
}

Отправлено: 03:19, 27-02-2012

 

Аватара для ab.random

Новый участник


Сообщения: 29
Благодарности: 1

Профиль | Отправить PM | Цитировать


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

Отправлено: 15:12, 27-02-2012 | #2



Для отключения данного рекламного блока вам необходимо зарегистрироваться или войти с учетной записью социальной сети.

Если же вы забыли свой пароль на форуме, то воспользуйтесь данной ссылкой для восстановления пароля.



Компьютерный форум OSzone.net » Программирование, базы данных и автоматизация действий » Программирование и базы данных » C/C++ - Сброс флагов потока

Участник сейчас на форуме Участник сейчас на форуме Участник вне форума Участник вне форума Автор темы Автор темы Шапка темы Сообщение прикреплено

Похожие темы
Название темы Автор Информация о форуме Ответов Последнее сообщение
xDSL/DialUp - Возможно ли разделить канал на 2 потока? Parlan Сетевое оборудование 2 14-01-2012 15:24
C/C++ - [решено] установки флагов формата потоков bool Программирование и базы данных 1 02-08-2007 00:11
Монитор+TV и 2 звуковых потока BlackMonk Хочу все знать 6 19-10-2004 20:37
Характеристика потока Е1 Zx Сетевые технологии 9 25-09-2003 02:46
Ф-ия потока - член класса Sharkky Программирование и базы данных 10 10-03-2003 11:52




 
Переход