- •ВВЕДЕНИЕ
- •КЛАССЫ
- •Описание объектов
- •Указатель this
- •Конструкторы
- •Конструктор копирования
- •Статические элементы класса
- •Статические методы
- •Дружественные функции и классы
- •Дружественные функции
- •Дружественный класс
- •Деструкторы
- •Перегрузка унарных операций
- •Перегрузка бинарных операций
- •Перегрузка операции присваивания
- •Перегрузка операции приведения типа
- •НАСЛЕДОВАНИЕ
- •Ключи доступа
- •Простое наследование
- •Правила наследования методов
- •Абстрактные классы
- •ОБРАБОТКА ИСКЛЮЧИТЕЛЬНЫХ СИТУАЦИЙ
- •Синтаксис исключений
- •Перехват исключений
- •Список исключений
- •Иерархии исключений
- •СТАНДАРТНАЯ БИБЛИОТЕКА
- •Форматирование данных
- •Флаги и форматирующие методы
- •Манипуляторы
- •Методы обмена с потоком
- •Файловые потоки
- •СТРОКИ
- •Операции
- •Функции
- •Преобразование строк
- •Поиск подстрок
- •Сравнение частей строк
- •Получение характеристик строк
- •КОНТЕЙНЕРНЫЕ КЛАССЫ
- •Последовательные контейнеры
- •Векторы
- •Двусторонние очереди
- •Списки
- •Ассоциативные контейнеры
- •Словари
- •Словари с дубликатами (multimap)
- •ПРИЛОЖЕНИЕ 1. ШАБЛОНЫ ФУНКЦИЙ
- •ПРИЛОЖЕНИЕ 2. ШАБЛОНЫ КЛАССОВ
- •БИБЛИОГРАФИЧЕСКИЙ СПИСОК
Операция void *( ) неявно вызывается всякий раз, когда поток сравнивается с нулем. Это позволяет записывать циклы вида:
while (stream_obj) {
// Все в порядке, можно производить ввод/вывод
}
Файловые потоки
Стадартная библиотека содержит три класса для работы с файлами: ifstream – класс входных файловых потоков;
ofstream – класс выходных файловых потоков; fstream – класс двунаправленных файловых потоков.
Эти классы являются производными от классовistream, ostream и iostream соответственно.
Использование файлов в программе предполагает следующие операции:
–создание потока;
–открытие потока;
–обмен (ввод/вывод);
–уничтожение потока;
–закрытие файла.
Каждый класс файловых потоков содержит конструкторы, с помощью которых можно создавать объекты этих классов различными способами.
Конструкторы без параметров создают объект соответствующего класса, не связывая его с файлом:
ifstream ( ); ofstream ( ); fstream ( );
Конструкторы с параметрами создают объект соответствующего класса, открывают файл с указанным именем и связывают файл с объектом:
ifstream (const char * name, int mode = ios :: in);
ofstream (const char * name, int mode = ios :: out | ios :: trunc); fstream (const char * name, int mode = ios :: in | ios :: out);
здесь второй параметр – это режим открытия файла.
Открыть файл в программе можно с использованием либо конструкторов, либо метода open, имеющего такие же параметры, как и в соответствующем конструкторе.
Пример 1
…
ifstream inpf ("input.txt"); // используем конструктор
if (! inpf) {
cout << "Невозможно открыть файл для чтения";
return 1;
}
44
Пример 2
…
ofstream f;
f.open ("output.txt", ios :: out); //используем метод open
if (!f) {
cout << “Невозможно открыть файл для записи”;
return 1;
}
Чтение и запись выполняются либо с помощью операций чтения и извлечения, аналогичных потоковым классам, либо с помощью методов классов.
Пример. Вывод на экран содержимого файла.
# include <fstream.h>
int main ( ) {
char text [81], buf [81];
cout << "Введите имя файла";
cin >> text;
ifstream f (text);
if (!f) {
cout << "Ошибка открытия файла";
return 1;
}
while (!f.eof ( )) {
f.getline (buf,81);
cout << buf << endl;
}
return 0;
}
Для закрытия потока определен методclose ( ), но поскольку он неявно выполняется деструктором, явный вызов необходим только тогда, когда требуется закрыть поток раньше конца его области видимости.
45
Задание
Перепишите вашу программу – телефонный справочник с использованием файловых потоков и форматированного ввода-вывода.
Строковые потоки
Строковые потоки позволяют считывать и записывать информацию из областей оперативной памяти так же, как и из файла, с консоли или на дисплей.
В стандартной библиотеке определено три класса строковых потоков: istringstream – входные строковые потоки;
ostringstream – выходные строковые потоки; stringstream – двунаправленные строковые потоки.
Эти классы определены в заголовочном файле <sstream> и являются производными от классов istream, ostream и iostream соответственно.
Участки памяти, с которыми выполняются операции чтения и извлечения, по стандарту определяются как строки С++ (класс string). Строковый класс будет рассмотрен далее. Строковые потоки создаются и связываются с этими участками памяти с помощью конструкторов:
explicit istringstream (int mode = ios :: in);
explicit istringstream (const string & name, int mode = ios :: in); explicit ostringstream (int mode = ios :: out);
explicit ostringstream (const string & name, int mode = ios :: out); explicit stringstream (int mode = ios :: in | ios :: out);
explicit stringstream (const string & name, int mode = ios :: in | ios :: out);
Здесь слово explicit указывает на то, что эти конструкторы вызываются только явным образом.
В строковых потоках описан метод str, возвращаюший копию строки или устанавливающий ее значение:
string str ( ) const;
void str (const string & S);
Пример. Строковый поток используется для формирования сообщения, включающего текущее время и передаваемый в качестве параметра номер:
#include <sstream>
#include <string>
#include <iostream>
#include <ctime> using namespace std; string message (int i) { ostringstream os; time_t t;
time (&t); // Функция возвращает текущие дату и время в виде time_t
46
os << "time: " << ctime (&t) <<"number: " << i << endl; return os.str ( );
//Функция ctime () превращает время
//в строку
}
int main ( ) {
cout << message (22); return 0;}
47