Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Programmirovanie.docx
Скачиваний:
0
Добавлен:
01.04.2025
Размер:
374 Кб
Скачать
☆

18. Создание собственных функций-манипуляторов.

ostream &имя_манипулятора (ostream &поток) { //код return поток;}

#include <iostream.h> #include <iomanip.h> ostream &setup (ostream &stream) {stream.setf(ios::left); stream <<setw(10)<<setfill(' $'); return stream;} int main (){ cout <<10<<" "<<setup <<10; system ("pause"); return 0;}

istream &имя_манипулятора (istream &поток) {//код return поток;}

#include <iostream.h> #include <iomanip.h> istream &prompt(istream &stream) {cin>>hex; cout <<"Enter number using hex format:"; return stream;} int main (){ int i; cin >>prompt>>i; cout <<i; system ("pause"); return 0;}

19. Методы обмена с потоками. Ниже приведены функции чтения, определенные в классе istream. gcount() - возвращает количество символов, считанных с помощью последней функции неформатированного ввода; get () - возвращает код извлеченного из потока символа или EOF; get(c) - возвращает ссылку на поток, из котороого выполнялось чтение, и записывает извлеченный символ в с; get(buf,num,lim='\n') - считываем num-l символов (или пока не встретится символов lim) и копирует их в символьную строку buf. Вместо символа lim в строку записывается признак конца строки ('\0'). Символ lim остается в потоке. Возвращает ссылку на текущий поток; getline(buf, num, lim='\n') - аналогична функции get, но копирует в buf и символ lim; ignore (num, lim = EOF) - считывает и пропускает символы до тех пор, пока не будет прочитано num символов или не встретится разделитель, заданный параметром Lim. Возвращает ссылку на текущий поток; peek () - возвращает следующий символ без удаления его из потока или EOF, если достигнут конец файла; putback(c) - помещает в поток символ с, который становится текущим при извлечении из потока; read(buf, num) - считывает num символов (или все символы до конца файла, если их меньше num) в символьный массив buf и возвращает ссылку на текущий поток; readsome(buf,num) - cчитывает num символов (или все символы до конца файла, если их меньше num) в символьный массив buf и возвращает количество считанных символов; seekg(pos) - устанавливает текущую позицию чтения в значение pos; tellg() - возвращает текущую позицию чтения потока; В классе ostream определены функции для неформатированного вывода: flush () -записывает содержимое потока вывода на физическое устройство; put (c) - выводит в поток символ с и возвращает ссылку на поток; seekg(pos) - устанавливает текущую позицию записи в значение pos; tellg() - возвращает текущую позицию записи потока; write (buf, num) - записывает в поток num символов из массива buf и возвращает ссылку на поток.

20. Открытие и закрытие файлов. В С++ файл открывается в . Различают 3 типа потока:

ifstream in; //ввод ofstream out; //вывод fstream both; //ввод и вывод

После создания потока необходимо его ассоциировать его с файлом. Для этого существует функция open() - 3 параметра

open()

void open(const char *filename, int mode, int access=filebuf::openprot);

(1-ый - имя файла, 2-ой - указывает каким способом открывается файл и может принимать одно из следующих значений: 1) ios::app -указывает на то, что выводимые данные будут добавлятся в конец файла это значение может быть использована только для потоков вывода; 2) ios::ate - вызывает поиск конца файла в момент открытия; 3)ios::binary - обуславливает открытия файла для двоичной операции; 4)ios::in - задает возможность ввода из файла; 5)ios::nocreate - данная функция задает такой режим, при котором функция open может открыть только существующий файл; 6)ios::noreplace - не позволяет открыть файл, если он уже существует, но не указанные атрибуты ios::app или ios::ate; 7)ios::out - указывает то, что файл предназначен для вывода; 8)ios::trunk - обуславливает уничтожение содержимого файла и сокращает его длину до 0.

Атрибут

Значение

0

Нормальный файл, открытый доступ

1

Файл только для чтения

2

Скрытый файл

4

Системный файл

8

Архивный файл



21. Файловый ввод/вывод. Чтение и запись в текстовые файлы. fstream.h ifstream in; //ввод ofstream out; //вывод fstream both; //ввод и вывод Чтение и запись в текстовые файлы. #include <iostream.h> #include <fstream.h> int main(){ char ch; int i; float f; char str [80]; ifstream in ("test.txt"); if (!in) { cout <<"Cannot open file.\n"; return 1; } in>>i; in>>f; in>>ch; in>>str; cout <<i<<" "<<f<<" "<<ch<<"\n"; cout <<str<<"\n"; int.close(); system ("pause"); return 0; }

22. Файловый ввод/вывод. Двоичный ввод/вывод. fstream.h ifstream in; //ввод ofstream out; //вывод fstream both; //ввод и вывод Двоичный ввод/вывод. ostream &put(char cb);

ios::binary

Имеется несколько способов для записи и чтения двоичных данных файлов. Метод get (istream &get(char &cb); ) читает единственный символ из ассоциированного потока и помещает его значение в переменную являющейся параметром. Метод put (ostream &put(char cb);)пишет переменную параметр в поток.

#include <iostream.h> #include <fstream.h> int main() { char ch; ifstream in ("test.txt"), ios::in | ios::binary); if (!in) { cout <<"Cannot open file.\n"; return 1;} while (in) { // in будет нулем при достижении конца файла in.get (ch); cout <<ch; } in.close(); system ("pause"); return 0; }

istream &read(insigned char *buf, int num); - читает num байт в ассоциированный поток записывает в переменную buf ofstream &write(const unsigned char *buf, int num); - пишет num байт в ассоциированный поток из buf

23. Файловый ввод/вывод. Произвольный доступ. fstream.h ;ifstream in; //ввод; ofstream out; //вывод; fstream both; //ввод и вывод Произвольный доступ. Система ввода/ вывода С++ позволяет осуществлять произвольный доступ с использованием функций seekg и seekp.

ifstream &seekg (streamoff offset, seek_dir origin); - метод seekg перемещает указатель get pointer на offset позиций от некоторого параметра origin ostream &seekp (streamoff offset, seek_dir origin); -

Система ввода\вывода С++ обрабатывает 2 указателя, ассоциированных с каждым файлом. Один из них get pointer, который отслеживает где именно в файле будет производиться следующая операция чтения. И указатель put pointer , который отслеживает где в файле будет осуществляться следующие операции вывода.

Величина

Значение

Ios::beg

Начало файла

ios::cur

Текущее положение

ios::end

Конец файла

#include <iostream.h> #include <fstream.h> int main() { char ch; ifstream in ("test.txt", ios::in | ios::binary); if (!in) { cout <<"Cannot open file .\n"; return 1; }in.seekg(1,ios::beg); while (in.get(ch)) cout<<ch; in.close(); system ("pause"); return 0; }

24. Строковые потоки. Как было показано, поток может быть привязан к файлу, т.е. массиву символов, хранящемуся не в основной памяти, а, например, на диске. Точно так же поток можно привязать к массиву символов в основной памяти. char* p = new char[message_size];      ostrstream ost(p,message_size);      do_something(arguments,ost);      display(p);

С помощью стандартных операций вывода функция do_something может писать в поток ost, передавать ost подчиняющимся ей функциям и т.п. Контроль переполнения не нужен, поскольку ost знает свой размер и при заполнении перейдет в состояние, определяемое fail(). Затем функция display может послать сообщение в "настоящий" выходной поток. Такой прием наиболее подходит в тех случаях, когда окончательная операция вывода предназначена для записи на более сложное устройство, чем традиционное, ориентированное на последовательность строк, выводное устройство. Например, текст из ost может быть помещен в фиксированную область на экране. Аналогично, istrstream является вводным строковым потоком, читающим из последовательности символов, заканчивающейся нулем:

     void word_per_line(char v[], int sz)      /*  печатать "v" размером "sz" по одному слову в строке      */      {         istrstream ist(v,sz);  // создать istream для v         char b2[MAX];          // длиннее самого длинного слова         while (ist>>b2) cout <<b2 << "\n";       }

Завершающий нуль считается концом файла. Строковые потоки описаны в файле <strstream.h>.

25. Потоки ввода/вывода в массивы. Для создания потока, способного вводить и выводить данные в массив, надо использовать следу­ющую функцию-конструктор класса strstream:

strstream iostr (char *buf, int size, int mode);

Здесь buf указывает на строку, используемую для операций ввода/вывода. Величина size указы­вает на размер массива. Параметр mode служит для определения режима. Для нормальных опера­ций ввода/вывода параметру mode присваивается значение ios::in | ios::out. Для ввода массив дол­жен оканчиваться нулем.

Следующая программа использует массив для ввода и для вывода: // выполняет как ввод, так и вывод #include <iostream.h> #include <strstrea.h> int main() { char iostr[80]; strstream ios (iostr, sizeof(iostr), ios::in | ios::out); int a, b; char str[80]; ios << "1734 534abcdefghijklmnopqrstuvwxyz"; ios >> a >> b >> str; cout << a << " " << b << " " << str << endl; }

Эта программа сначала пишет два числа и буквы алфавита в массив, а затем читает их.

26. Обработка исключительных ситуаций. Исключительные ситуации – это механизм, который до сих пор вызывает много споров, как среди противников объектного подхода, так и среди его сторонников.

Условно исключения можно разделить на три типа:контролируемые; некотролируемые; фатальные. Контролируемые исключения могут происходить при нормальном выполнении системы и в большинстве своем характеризуют такие ситуации, как ошибки соединения с внешним сервисом, неверный пользовательский ввод и т.д. Некотролируемые исключения – это исключения, которые возникают вследствие выполнения некорректного кода. Эти исключения, как правило, могут быть перехвачены, но исправлению подлежат лишь в единичных случаях. К таким исключениям относят исключения возникающие при обращении по нулевому указателю, вызове несуществующего или защищенного метода, в результате неверного приведения типов и т.д. Фатальные исключения описывают ошибки, большую часть которых приложение не должно перехватывать. К ним относятся такие ситуации, как нехватка памяти, переполнение стека, попытка оперирования уже уничтоженным потоком приложения, внутренняя ошибка виртуальной машины или интерпретатора и многие другие. Возвращение успешности выполнения операции Самый простой метод заключается в том, чтобы вернуть особое значение, если произошла ошибка. Например, false.

static void vain(String[] args) {

if ( !parseXML(xml) ) {

// Error } }

 

protected function parseXML(String xml) {

[...] }

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

Возвращение кода ошибки. Этот вариант можно детализировать, если ввести в приложение набор констант, обозначающих различные виды ошибок.

27. Шаблоны функций. Многие алгоритмы не зависят от типов данных с которыми они работают. В С++ существует возможность передать информацию о типе в качестве параметра. Реализовано это с помощью шаблонов. С помощью шаблона можно определить алгоритм, который будет применяться к данным различных типов. А конкретный тип данных передается функции на этапе компиляции Формат простейшей функции-шаблона:

template <class Tupe> заголовок { /*тело функции*/ }

В общем случае функция шаблон может содержать несколько параметров:

template <class A, class B, int i> void f() {...} Пример: template <class Type> void sort_vybor (Type *b, int n) { Type a; // буферная переменная for (int i=0; i<n-1; i++) { int imin = i; for (int j=i+1; j<n; j++) if (b[j] <b[min]) imin =j; a=b[i];b[i]=b[imin]; b[imin]=a;}} #include <iostream.h> #include <windows.h> #include <class Type> void sort_vybor(Type *b, int n); int main(){ const int n=5; int i, b[n]; for (i=0; i<n; i++) cin >>b[i]; sort_vyb(b,n); // Сортировка целочисленного массива for (i=0; i<n; i++) cout <<b[i] << " "; cout <<endl; double a[] = {0.22, 117, -0.08, 0.21, 42.5}; sort_vybor(a,5); // Сортировка массива вещественных чисел for (i=0; i<5; i++) cout << a[i]<< " "; system ("pause"); return 0; }

28. Шаблоны классов. Параметризованный класс создаёт семейство родственных классов, которые можно применять к любому типу данных, передаваемому в качестве параметра

class Node{ public: int d; //Данные Node *next; // Указатель на последующий узел Node *prev; // Указатель на предыдущий узел Node (int dat = 0) { // Конструктор d=dat; next = 0; prev=0;}}; class List { class Node{ ... }; Node *pbeg, *pend; //Указатели на начало и конец списка public: List ()

void add(int d); //Добавление узла в конец списка Node *find(int i); //Поиск узла по ключу

List <<int> List_int; List<double> List_double; Block <char,128> buf; Block <monstr,100> stado; Синтаксис описания шаблона:

template <описание_параметров_шаблона> определение_класса; Правила описания шаблона 1. Шаблоны методов не могут быть виртуальными. 2. Шаблоны классов могут содержать статические элементы, дружественные функции и классы. 3. Шаблоны могут быть производными как от шаблонов, так и от обычных классов, а также являться для них базовыми. 4. Внутри шаблона нельзя определять дружественные шаблоны.

29. Классы стандартной библиотеки C++ . Строковый класс. Классы стандартной библиотеки С++ можно разделить на группы в соответствие с их назначением: 1. Потоковые классы. 2. Строковый класс. 3. Контейнерные классы, реализующие наиболее распространенные структуры для хранения данных(списки, вектора, множества). 4. Итераторы , предназначенные для унифицированного доступа к элементам контейнерных и других классов. 5. Математические классы, осуществляющие решение уравнений, нахождения значений некоторых математических функций. Присваивания и добавление частей строк

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