Объектно-ориентированное программирование на C++


Функции библиотеки 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;



Содержание раздела