Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Shpory_OOP.doc
Скачиваний:
0
Добавлен:
01.05.2025
Размер:
2.17 Mб
Скачать

17 Ввод-вывод в файл. Сохранение объектов в файле.

Для действий с дисковыми файлами используются 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(...) создает буфер ввода и связывает физический поток с буфером.

Функция 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, если файл не может быть открыт.

18 Обработка исключений (блоки try, throw, catch)

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

Выше были приведены программы с использованием потока 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(); // Генерация исключения

return charPtr[i]; };

void main (void){

int index;

String Str(10);

for (int i=0; i<10; i++)

Str[i]=i+’A’;

try { for(;;) {

cout<<\nВведите индекс: 

cin>>index;

cout<<Str[index];}

}

catch(String::range) // Обработчик исключения

{cout<< Индекс за границей массива\n;} }

При выполнении программы после заполнения строки соответствующими символами включается блок try, охватывающий фрагмент программы, в котором возможно появление исключительной ситуации. Работа программы в этом блоке, заключающаяся в выведении на экран символа, соответствующего запрашиваемому числу, предполагается бесконечной (это необязательно). При возникновении исключительной ситуации – index>=11 – выполнение программы прерывается, выполняется команда throw range в функции operator[] и управление передается обработчику исключения catch(String::range). (Имя range является произвольным и устанавливает взаимосвязь между исключением и соответствующим обработчиком исключений.)

Обработчик исключения должен следовать за блоком try. Допускается несколько обработчиков, реагирующих на различные виды исключений, например, те, которые возникают при динамическом выделении памяти, при ошибках ввода-вывода, при выполнении арифметических операций и т.п. С помощью рассматриваемого механизма обрабатываются только те исключения, которые возникают при выполнении программы. Прерывание программы пользователем или от аппаратуры (например, нажатие клавиш Ctrl-Break, сигнал таймера) нельзя рассматривать как исключение.

Механизм обработки исключений поддерживает хороший стиль программирования, так как позволяет выделить в программе относительно независимые части: собственно программу – try блок и фрагмент для обработки ошибок – catch блок.

11 Библиотека STL (контейнеры и итераторы)

12 Последовательные контейнеры

13. Ассоциативные контейнеры.

14. Алгоритмы STL.

6. Пространства имен.

19. Использование классов при организации исключений. Иерархия исключений.

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]