Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Задание 5_I.doc
Скачиваний:
2
Добавлен:
17.09.2019
Размер:
153.6 Кб
Скачать

Файловый ввод-вывод

Помимо предопределенных потоков, программист может заводить свои потоки ввода-вывода, ассоциированные как с уже существующими потоками, так и с файлами операционной системы или со строками в оперативной памяти компьютера.

Для того, чтобы ассоциировать некоторый поток с файлом нужно выполнить следующие действия:

// Заводим объект класса 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

  1. Обработка исключений

Стандарт языка C++ включает в себя описание библиотеки стандартных шаблонов (Standard template library, STL), которая включает в себя определения наиболее часто употребляемых контейнеров (таких, как vector), алгоритмов (например, алгоритм сортировки), которые работают с любыми из этих контейнеров при помощи итераторов (которые являются обобщением понятия «указатель».

Контейнеры, итераторы и алгоритмы

Контейнеры хранят данные, итераторы – позволяют адресовать хранимые в контейнерах данные, а алгоритмы (набор из множества шаблонных функций, определенных в заголовочном файле <algorithm>) позволяют при помощи итераторов произвести массу различных действий с любыми контейнерами: отсортировать, реверсировать, поискать в них что-либо и т.п.

Кроме шаблонных функций заголовочный файл <algorithm> содержит массу определений так называемых функторов: это шаблонные классы, которые, однако, могут вести себя как шаблонные функции за счет того, что в них переопределен operator ().

  1. Вариант

Создать функцию подсчета суммы чисел в файле. Функция принимает в качестве параметра имя файла. Числа отделены друг от друга, словами, буквами, символами, знаками табуляции.

Функция должна генерировать exception, если файл не существует.

Файл должен считываться по строкам с использованием функций библиотеки <fstream>, строки должны записываться в контейнер string библиотеки STL.

Пример: строка в файле может выглядеть следующим образом: «10sdada350re 20sd100%dasd^#^#1sdas15», сумма в ней чисел соответственно равна 496.