Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Лабник по C.pdf
Скачиваний:
74
Добавлен:
01.06.2015
Размер:
876.9 Кб
Скачать

– 53 –

При выполнении программы в случае выхода индекса массива за объявленный диапазон появляется соответствующее сообщение.

15.2. ВВОД ДАННЫХ

Перегруженная операция >> в классе iostream обеспечивает стандартный ввод и называется извлечением. Как и операция вставки, операция >> действует аналогично соответствующему оператору языка C (scanf), но не требует указаний форматов ввода.

int i; double d; cin>>i>>d;

Левые пробелы, встречающиеся при вводе строковых значений, пропускаются; ввод идет до первого пробела справа, после чего добавляется символ завершения строки. Если при вводе строки пробелы считаются ее частью, то следует воспользоваться функцией cin.read(arg,n), которая вводит n символов. Функция get вводит одиночный символ.

15.3. ВВОД-ВЫВОД ДАННЫХ, ОПРЕДЕЛЕННЫХ ПОЛЬЗОВАТЕЛЕМ

Вставки и извлечения могут переопределяться для классов (типов), введенных пользователем. Так как они возвращают ссылку на тип собственного класса, то формат перегруженных операций следующий:

istream& operator >>(istream& s, cсылка_на_тип) ostream& operator <<(ostream& s, cсылка_на_тип)

Пример для класса комплексных чисел: class Complex { double re, im;

........

friend istream& operator>>(istream&, Complex&); friend ostream& operator<<(ostream&, Complex&);

........

};

istream& operator>>(istream& s, Complex& t) { double a,b;

s>>a>>b; t.re=a; t.im=b; return s;

}

ostream& operator<<(ostream& s, Complex& t) { double a,b;

s<<t.re<<","<<t.im<<"\n"; return s;

}

}

15.4. РАБОТА С ДИСКОВЫМИ ФАЙЛАМИ

Для действий с дисковыми файлами используются 2 заголовочных файла ofstream.h и ifstream.h или один – fstream.h.

Последовательность действий следующая.

Объявляются объекты (потоки) входного и выходного типа: ifstream f1; ofstream f2;

Файлы открываются на ввод или вывод функцией-компонентой open(имя_файла, аргументы_открытия);

Вкачестве аргументов открытия используются следующие опции:

ios::app – добавление данных в файл;

ios::ate – поиск конца файла;

ios::in – открытие на ввод;

ios::out – открытие на вывод;

ios::trunc – уничтожение содержимого, если файл существует;

ios::nocreate – отказ от создания файла.

Функция open(...) создает буфер ввода и связывает физический поток с буфером.

© 1998 Калачев Д.П., Лутай В.Н.

– 54 –

Функция seekg(int k, аргументы_режима) позволяет устанавливать указатель файла на любую позицию. Аргументы режима могут быть следующие:

ios::beg – указатель устанавливается на k позиций от начала;

ios:: end – указатель устанавливается на k позиций от конца;

ios::cur – перемещается на k позиций к концу.

После окончания работы файлы закрываются функцией close(). Пример программы копирования файлов:

#include <iostream.h> #include <process.h> #include <fstream.h>

void error (char* p) {cerr<<p<<endl; exit (-1);} void main(int argc,char*argv[]) {

ifstream S; ofstream D;

S.open(argv[1],ios::nocreate);

if(!S) error("Не могу открыть файл для ввода"); D.open(argv[2]);

if(!D) error("Не могу открыть файл для вывода”); char ch;

while(S.get(ch)) D.put(ch);

if( !S.eof() && !D.bad() ) error("Несчастный случай"); S.close();

D.close();

}

Переменные S и D принимают значение «ложь» в одном из двух случаев: если достигнут конец файла (это проверяет метод eof()), или в результате сбоя в файле – bad(). Кроме того, S=0, если файл не может быть открыт.

15.5. ОБРАБОТКА ИСКЛЮЧЕНИЙ

Под исключением понимается некоторая ситуация, возникающая при выполнении программы, вследствие появления которой нормальное продолжение программы невозможно. Дальнейшее выполнение программы определяется программистом на этапе проектирования программы и носит название обработки исключения. К исключительным ситуациям относятся и ошибки выполнения.

Выше были приведены программы с использованием потока error. Исключительные ситуации возникали при выходе индекса за пределы массива или в результате дефектов в дисковых файлах. Обработка заключается в генерировании соответствующего сообщения и приостановке программы.

В последней версии С++ введен специальный механизм обработки исключений. Работу этого механизма для обнаружения выхода индекса за пределы массива рассмотрим на примере уже рассмотренного и несколько упрощенного класса String. Ключевые слова, относящиеся к механизму обработки исключения, выделены курсивом.

class String{ char *charPtr; int length;

public:

String(int size=80){ // Конструктор

length=size; charPtr=new char[length + 1]; *charPtr =‘\0’;} ~String(){delete charPtr;};

class range { }; // Локальный класс - индикатор исключения char& operator[](int);

};

char& String::operator [] (int i) {

if (i<0 || this->length<i) throw range(); // Генерация исключения

© 1998 Калачев Д.П., Лутай В.Н.