
- •Определения производных типов (специализация)
- •Операторы
- •Отдельная функция
- •Определения типов, встроенные в класс
- •Конструкторы
- •Потоки ввода-вывода
- •Форматирование вывода
- •Файловый ввод-вывод
- •Обработка исключений
- •Контейнеры, итераторы и алгоритмы
- •Вариант
- •Вариант
- •Вариант
- •Вариант
- •Вариант
- •Вариант
- •Вариант
- •Вариант
- •Вариант
- •Вариант
- •Вариант
- •Вариант
- •Вариант
- •Вариант
- •Вариант
- •Вариант
- •Вариант
- •Вариант
- •Вариант
- •Вариант
Файловый ввод-вывод
Помимо предопределенных потоков, программист может заводить свои потоки ввода-вывода, ассоциированные как с уже существующими потоками, так и с файлами операционной системы или со строками в оперативной памяти компьютера.
Для того, чтобы ассоциировать некоторый поток с файлом нужно выполнить следующие действия:
// Заводим объект класса filebuf.
filebuf outfile;
// Открываем файл, режим - запись
if( !outfile.open( "c:\\filename.txt", ios::out ) ) {
cerr << "Файл не открыт!";
abort();
}
// Заводим объект класса ostream, ассоциированный с outfile
ostream cdst(&outfile);
cdst << "Ready"; // Осуществляем вывод.
Открытый файл будет закрыт в момент вызова деструктора объекта cdst.
Для открытия входного потока необходимо указать режим ios::in при открытии filebuf.
Существует конструктор класса filebuf, которому можно указать дескриптор открытого файла:
filebuf::filebuf(int hFile);
Кроме того, есть возможность использовать специальные классы для файлового ввода-вывода, описанные в файле <fstream>:
ifstream cmyin("c:\\myfile1.dat" ); // Поток ввода
ofstream cmyout("c:\\myfile2.dat" ); // Поток вывода
fstream cmyinout("c:\\myfile3.dat" ); // Поток ввода-вывода
Потоковым вводом-выводом можно пользоваться и для подготовки форматированных строк. Для этого объект специального класса ассоциируется со строкой. Вот конструкторы этих классов из файла <strstream>:
istrstream( const char* str, int len ); // Input stream
ostrstream(char* str, int len ); // Output stream
strstream(char* str, int len, int mode ); // I/O stream, mode == ios::in
// и/или ios::out
Обработка исключений
Стандарт языка C++ включает в себя описание библиотеки стандартных шаблонов (Standard template library, STL), которая включает в себя определения наиболее часто употребляемых контейнеров (таких, как vector), алгоритмов (например, алгоритм сортировки), которые работают с любыми из этих контейнеров при помощи итераторов (которые являются обобщением понятия «указатель».
Контейнеры, итераторы и алгоритмы
Контейнеры хранят данные, итераторы – позволяют адресовать хранимые в контейнерах данные, а алгоритмы (набор из множества шаблонных функций, определенных в заголовочном файле <algorithm>) позволяют при помощи итераторов произвести массу различных действий с любыми контейнерами: отсортировать, реверсировать, поискать в них что-либо и т.п.
Кроме шаблонных функций заголовочный файл <algorithm> содержит массу определений так называемых функторов: это шаблонные классы, которые, однако, могут вести себя как шаблонные функции за счет того, что в них переопределен operator ().
Вариант
Создать функцию подсчета суммы чисел в файле. Функция принимает в качестве параметра имя файла. Числа отделены друг от друга, словами, буквами, символами, знаками табуляции.
Функция должна генерировать exception, если файл не существует.
Файл должен считываться по строкам с использованием функций библиотеки <fstream>, строки должны записываться в контейнер string библиотеки STL.
Пример: строка в файле может выглядеть следующим образом: «10sdada350re 20sd100%dasd^#^#1sdas15», сумма в ней чисел соответственно равна 496.