Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > C/C++: Для новичков > Обработка ошибок потоков


Автор: RomaKiev 18.1.2011, 18:44
Доброго времени суток! Помогите разобраться в обработке ошибок потоков
Есть фрагмент кода:
Код

while(true)
    {
        cout<<"Vvedite zeloje chislo: ";
        cin>>b;
        if(cin.good())
        {
            cin.ignore(10, '\n');
            break;
            }
        cin.clear();
        cout<<"Nepravilnij vvod dannih!"<<endl;
        cin.ignore(10, '\n');
    }



Первый вопрос: 
Переменная b является целочисленной. Каким образом функция good() определяет корректность ввода данных? По типу переменной,
в которую я буду сохранять вводимые данные, или по каким-либо другим критериям?

Второй вопрос: Неясно назначение функции ignore()? Что она делает? На этом же форуме прочитал следующее:
ignore(n,'\n') число пропускаемых символов и символ разделения т.е. пропускает n символов, если ранее не будет найден '\n', далее если '\n' введен раньше n то будет удален из буфера и ignore() завершит работу.
Какие именно символы она пропускает, кроме разделителя?

Третий вопрос:
Неясно назначение функции clear()?

Заранее спасибо!


Автор: mes 18.1.2011, 18:49
http://cplusplus.com/reference/iostream/ios/good/
http://cplusplus.com/reference/iostream/istream/ignore/
http://cplusplus.com/reference/iostream/ios/clear/

Автор: RomaKiev 18.1.2011, 18:57
Цитата(mes @ 18.1.2011,  18:49)
http://cplusplus.com/reference/iostream/ios/good/
http://cplusplus.com/reference/iostream/istream/ignore/
http://cplusplus.com/reference/iostream/ios/clear/

За ссылки конечно спасибо, но я, к сожалению, не владею английским языком. 

Автор: Estranged 18.1.2011, 19:30
Учить программирование не зная английского почти невозможно. Вся документация на английском.

Автор: toxx 18.1.2011, 19:35
Цитата

За ссылки конечно спасибо, но я, к сожалению, не владею английским языком. 

там английский никакой + пример есть

Автор: Alca 19.1.2011, 10:51
Цитата

Учить программирование не зная английского почти невозможно. Вся документация на английском.

Хорошо, что не на китайском ))

Автор: JЕT 26.1.2011, 11:14
Цитата

Первый вопрос: 
Переменная b является целочисленной. Каким образом функция good() определяет корректность ввода данных? По типу переменной,
в которую я буду сохранять вводимые данные, или по каким-либо другим критериям?


Функция good() возвращает true, если для потока не установлен ни один из битов: failbit, badbit, eofbit.

Цитата

Второй вопрос: Неясно назначение функции ignore()? Что она делает? На этом же форуме прочитал следующее:
ignore(n,'\n') число пропускаемых символов и символ разделения т.е. пропускает n символов, если ранее не будет найден '\n', далее если '\n' введен раньше n то будет удален из буфера и ignore() завершит работу.
Какие именно символы она пропускает, кроме разделителя?

Те, которые будут переданы в поток.
Например:

Код

std::cin.ignore( 2 );
std::cin >> var;
std::cout << var;


Вы вводите qwerty, а получаете erty. То есть пропускается первые 2 символа.

Цитата

Третий вопрос:
Неясно назначение функции clear()?

Для очистки битов ошибок и установки goodbit.

Автор: RomaKiev 26.1.2011, 17:02
Цитата(JЕT @ 26.1.2011,  11:14)
Цитата

Первый вопрос: 
Переменная b является целочисленной. Каким образом функция good() определяет корректность ввода данных? По типу переменной,
в которую я буду сохранять вводимые данные, или по каким-либо другим критериям?


Функция good() возвращает true, если для потока не установлен ни один из битов: failbit, badbit, eofbit.

Цитата

Второй вопрос: Неясно назначение функции ignore()? Что она делает? На этом же форуме прочитал следующее:
ignore(n,'\n') число пропускаемых символов и символ разделения т.е. пропускает n символов, если ранее не будет найден '\n', далее если '\n' введен раньше n то будет удален из буфера и ignore() завершит работу.
Какие именно символы она пропускает, кроме разделителя?

Те, которые будут переданы в поток.
Например:

Код

std::cin.ignore( 2 );
std::cin >> var;
std::cout << var;


Вы вводите qwerty, а получаете erty. То есть пропускается первые 2 символа.

Цитата

Третий вопрос:
Неясно назначение функции clear()?

Для очистки битов ошибок и установки goodbit.

Спасибо за ответ! Но не могли бы вы обьяснить ещё один момент:
а с какой целью мы используем  функцию cin.ignore(10, '\n') именно здесь?
Код

while(true)
    {
        cout<<"Vvedite zeloje chislo: ";
        cin>>b;
        if(cin.good())
        {
            cin.ignore(10, '\n');
            break;
            }
        cin.clear();
        cout<<"Nepravilnij vvod dannih!"<<endl;
        cin.ignore(10, '\n');
    }

Ведь мы то уже считали данные из потока и поместили их в переменную b. Какие символы мы пропускаем далее как в конструкции if, так и после нее?

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)