Форум программистов, компьютерный форум CyberForum.ru

Объект cin и класс istream - C++

Восстановить пароль Регистрация
 
Рейтинг: Рейтинг темы: голосов - 14, средняя оценка - 4.79
xtorne21st
интересующийся
300 / 271 / 19
Регистрация: 25.09.2010
Сообщений: 1,056
11.01.2013, 04:56     Объект cin и класс istream #1
В учебнике приводиться такое задание:
"Напишите функцию, получающую и возвращающую ссылку на объект класса istream. Фукнция должна читать данные из потока до тех пор, пока не будет достигнут конец файла. Функция должна выводить прочитанные данные на стандартное устройство вывода. Перед возвращением потока, верните все значения его флагов в допустимое состояние. Проверьте созданную функцию, передав ей при вызове объект cin в качестве аргумента ".
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
#include <stdexcept>
#include <istream>
#include <iostream>
 
using namespace std;
 
istream &myfunc(istream &arg);
 
int main()
{
myfunc(cin);
 
return 0; 
}
 
istream &myfunc(istream &arg)
{
    register int i;
    istream::iostate old_state;
 
    old_state = arg.rdstate();
    cin.clear();
    while (arg >> i && !arg.eof()) {
        if (arg.bad())
            throw runtime_error("IO stream corrupted");
        if (arg.fail()) {
            cerr << "bad data, try again";
            arg.clear(istream::failbit);
            continue;
        }
        cout << i; 
    }
    cin.clear();
    cin.clear(old_state); 
 
    return arg; 
}
У меня вопрос: "Почему если во время выполнения функции ввести: 123abc456, то во время передачи в
C++
1
2
3
4
 if (arg.fail()) {
            cerr << "bad data, try again";
            arg.clear(istream::failbit);
            continue;
то цикл обрывается? (а не передаётся инструкции continue на продолжение цикла, как задумано)

Добавлено через 7 минут
т.е. результат вывода будет: 123 вместо 123456
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
11.01.2013, 04:56     Объект cin и класс istream
Посмотрите здесь:

C++ Объект cin и его метод cin.get()
C++ Не работает getline(cin,s), istream.ignore()
тип cout-a ostrieam? соответствено тип cin-a istream? C++
C++ объект cin
C++ Объект cin
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
XpertVision
17 / 17 / 3
Регистрация: 14.06.2012
Сообщений: 146
11.01.2013, 07:36     Объект cin и класс istream #2
ПРошу прощения, не туда написал.
Kastaneda
Модератор
Эксперт С++
 Аватар для Kastaneda
4236 / 2769 / 218
Регистрация: 12.12.2009
Сообщений: 7,104
Записей в блоге: 1
Завершенные тесты: 1
11.01.2013, 08:36     Объект cin и класс istream #3
Вводим 123qwe123, выполнятся будет так:
- прочитали 123, вывели 123
- прочитали q, это не int, поток "сломался", поэтому в тело while даже не зайдет.
- выполнили то, что после while

т.е. условие цикла нужно изменить.
xtorne21st
интересующийся
300 / 271 / 19
Регистрация: 25.09.2010
Сообщений: 1,056
11.01.2013, 14:45  [ТС]     Объект cin и класс istream #4
Тогда зачем нужна эта ниструкция? В учебнике как раз она и исользуется...

Добавлено через 2 часа 14 минут
Цитата Сообщение от xtorne21st Посмотреть сообщение
C++
1
if (arg.fail()) { cerr << "bad data, try again"; arg.clear(istream::failbit); continue;
Я об этом
Yandex
Объявления
11.01.2013, 14:45     Объект cin и класс istream
Ответ Создать тему
Опции темы

Текущее время: 22:30. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru