- •1.1.Указатели
- •1.1.1.Объявление указателей и работа с адресами
- •1.1.2.Адресная арифметика
- •1.1.3.Указатели как формальные параметры функции
- •1.1.4.Связь указателей и массивов
- •1.1.5.Константные указатели и указатели на константы
- •1.1.6.Связь указателей и строк
- •1.1.7.Преобразование указателей
- •1.1.8.Бестиповые указатели
- •1.1.9.Массив указателей
- •1.1.10.Указатели на указатели
- •1.1.11.Резервирование и освобождение памяти (операторы new и delete)
- •1.2.Типы данных, определяемые пользователем
- •1.2.1.Переопределяемые типы данных
- •1.2.2.Структуры
- •1.2.2.1.Массивы структур
- •1.2.2.2.Использование указателей на структуры
- •1.2.2.4.Динамические структуры и массивы структур
- •1.2.3.Классы
- •1.2.3.1.Введение в ооп
- •2.1.Потоки
- •2.2.Стандартные потоки
- •2.4.Файловые потоки
- •2.4.1.Общие принципы работы с файлами
- •2.4.2.Режимы открытия файлов
- •2.4.3.Текстовые и бинарные файлы и файловые потоки
- •2.4.4.Проверка состояния файла и потока
- •2.4.5.Функции (методы) ввода-вывода
- •2.4.5.1.Методы get и put
- •2.4.5.2.Метод getline
- •2.4.5.3.Методы read и write
- •2.4.6.Особенности работы с бинарными файлами
- •2.4.7.Использование текущей позиции файла
2.4.Файловые потоки
В библиотеке C++ для ввода-вывода файлов существуют классы ifstream (для файловых входных потоков), ofstream (для файловых выходных потоков) и fstream (для файловых двунаправленных потоков). Эти классы – наследники, соответственно, классов istream, ostream и iostream, которые, в свою очередь, наследуют свойства класса ios. Это означает, что классы файлового ввода-вывода наследуют соответствующие операции и методы ввода-вывода, поля и способы форматирования и т.д. Классы файлового ввода-вывода определены в файле заголовков fstream.h.
Использование файлов в программе предполагает выполнение следующих действий:
- создание файлового потока;
- открытие потока и связывание его с файлом;
- передача данных (ввод/вывод);
- закрытие файла;
- уничтожение потока.
В программе файловый поток объявляется как объект одного из классов файлового ввода-вывода (ifstream, ofstream или fstream):
ifstream f1; // создание потока f1 для файлового ввода
ofstream f2; // создание потока f2 для файлового вывода
Как и любые другие объекты, потоки могут создаваться статически (как f1 и f2 в предыдущем примере) или динамически (с помощью операции new):
ofstream *f3 = new ofstream; // динамическое создание потока f3
// для файлового вывода
Классы файлового ввода-вывода содержат специальные операции и методы работы с файлами – открытия, проверки состояния, работы с текущей позицией, закрытия файлов, а также ввода-вывода и форматирования информации. Большинство из них унаследовано от классов-предков (ios, istream, ostream). Связывание потока с конкретным файлом осуществляется одним из двух возможных способов – либо при создании потока:
ofstream f4("d:\\test4.txt"); // создание потока f4 для файлового вывода,
// открытие и связывание его с файлом
либо при открытии уже созданного потока с помощью метода open:
f1.open("d:\\test5.txt"); // открытие ранее созданного потока f1
// и связывание его с файлом
И в том и другом случае указывается имя файла и, если необходимо, режимы его открытия, описанные в разделе 2.4.2.
Передача данных выполняется операциями >> и << или методами ввода-вывода, описанными в разделе 2.4.5. Закрытие файла происходит либо посредством выполнения метода close:
f4.close();
f3->close();
либо автоматически при уничтожении потока (при завершении программы или при удалении динамически созданного потока с помощью delete):
delete f3;
2.4.1.Общие принципы работы с файлами
При вводе-выводе файл рассматривается как последовательность байтов. Для каждого файла существует текущая позиция, начиная с которой будет выполняться следующая операция чтения или записи. Началу файла соответствует текущая позиция 0. После выполнения каждой операции ввода-вывода значение текущей позиции автоматически увеличивается на число введенных или выведенных байтов.
Пусть, например, мы начинаем чтение с начала файла. Предположим, первая операция чтения ввела 4 байта, интерпретированное как целое число. Тогда текущая позиция для данного файла становится равной 4, это значение указывает на пятый по порядку байт в файле.
Текущую позицию в файле можно явно установить с помощью специальных методов, задавая ее смещение от начала файла, конца файла или от текущего значения. Пусть, например, мы “передвинули” текущую позицию во входном файле на 20 байтов вперед. Тогда, следующая операция чтения начнет ввод именно с этой позиции. Если текущая позиция явным образом не изменяется, чтение и запись файла происходят последовательно.
