Функции библиотеки iostream
Основное отличие профессионального программиста от любителя заключается в том, что он проверяет все входные данные. В библиотеке iostream для этого используются специальные методы класса ios и двух его наследников istream и ostream. Всего в этих классах находится порядка 25 методов, позволяющих получить информацию о состоянии объектов и управлять их поведением. Вот некоторые из них.
имя функции | действие |
int good () | возвращает 1, если ошибок не обнаружено |
int eof () | возвращает 1, если поток находится в состоянии "коней файла" |
int fail () | возвращает 1, если обнаружена восстановимая ошибка ввода-вывода (обычно, ошибка преобразования данных) |
int bad () | возвращает 1, если обнаружена невосстановимая ошибка ввода-вывода |
int clear () | сбрасывает состояние ошибки ввода-вывода |
int precision (int i) | устанавливает точность вывода чисел с плавающей точкой |
int width (int i) | устанавливает ширину поля вывода |
Как теперь можно изменить нашу программу, усилив ее проверкой на ошибки при вводе.
#include <iostream.h>
int i;
char buff[80];
do{
if (cin.fail()) cin.clear(); // сброс состояния ошибки
cout << "Введите число и символьную строку:";
cin >> i;
if (cin.fail())
{
cout << "Нужно ввести число";
continue;
}
cin >> buff;
if (cin.fail())
{
cout << "Нужно ввести строку";
continue;
}
} while (cin.fail()&&!cin.bad());
if (!cin.bad())
{
cout << "Вы ввели число:" << i << "\n"
<< "Вы ввели строку:" << buff << "\n";
}
Обратите внимание на условие повторения цикла. Условие повторение цикла означает, что нужно повторить цикл, если произошла восстановимая ошибка (как правило, это ошибка преобразования), но только в том случае, если есть возможность восстановления. Единственная ошибка, которая может вызвать аварийное завершение - это переполнение 80-символьного буфера для ввода строки. Можно решить и эту проблему, указав объекту cin размер буфера, используя метод width() класса ios.
cin.width(sizeof(buff));
cin >> buff;