Лекция 5. Файлы. Текстовые и двоичные файлы, доступ к файлам в языке С++. Средства Windows для работы с файлами. ФАЙЛЫ Под файлом понимается именованная область внешней памяти ЭВМ (жесткого диска, дискеты, диска CD-ROM). Для работы с файлами в С++ определён особый тип данных FILE. Переменные типа FILE представляют собой структуры, содержащие информацию о файлах, позволяющую осуществлять доступ и операции над ними. Файлы становятся доступными программе только после выполнения особой процедуры открытия файла. Эта процедура заключается в создании переменной типа FILE и её связывании с именем существующего или вновь создаваемого файла, а также в указании направления обмена информацией: чтение из файла или запись в него. Файловая переменная создаётся и связывается с именем файла в результате обращения к стандартной функции fopen(): FILE *f1; f1=fopen("data.txt", "rt"); Первым параметром процедуры fopen() является указатель на строку символов, содержащую имя файла. Второй параметр содержит строку-спецификатор, задающую тип доступа к файлу и его свойства. Второй параметр может содержать следующие символы: r – открыть файл для чтения; w – открыть пустой файл для записи (если открывается существующий файл, его содержимое теряется); a – открыть для записи в конец файла; файл создаётся, если он не существует; r+ - открыть для чтения и записи (файл должен существовать); w+ - открыть пустой файл для чтения и записи, если файл существует, его содержимое теряется; a+ - открыть для чтения и добавления, файл создаётся, если он не существует; b – открывает файл в двоичном режиме; t – открывает файл в текстовом режиме. Возвращаемым значением функции fopen() является указатель на файловую переменную. При её выполнении дисковый файл подготавливается к обмену данными. В результате специальная переменная – файловый указатель места (не путать с указателем на файловую переменную) инициализируется нужным значением. Файловым ука- зателем называется переменная, содержащая адрес байта в файле, начиная с которого в него будут помещены данные или откуда они будут прочитаны. Например, при открытии файла со спецификатором “r” файловый указатель помещается в начало файла, а при открытии со спецификатором “a” – в конец. ТЕКСТОВЫЕ И ДВОИЧНЫЕ ФАЙЛЫ, ДОСТУП К ФАЙЛАМ В ЯЗЫКЕ С++. Текстовые файлы. Текстовые файлы предназначены для хранения текстовой информации. Текстовый файл трактуется в С++ как совокупность символьных строк переменной длины. Доступ к каждой строке возможен лишь последовательно, начиная с первой. При создании текстовых файлов в конце каждой строки ставится специальный признак EOL (кодируется последовательностью кодов 13 и 10), а в конце всего файла – признак конца файла (код 26). Для доступа к информации в текстовом файле применяются процедуры fprintf(), fgets(), и fgetc(). Они имеют следующий формат и смысл. fprintf(f1, "My Text"); Функция fprintf() аналогична по действию функции printf() (то есть записывает строку), но имеет первым параметром указатель на файловую переменную (в примере f1), связанный с текстовым файлом, куда функция выводит данные. char s[256]; fgets(s, 256, f1); Функция fgets() аналогична по действию функции gets(), то есть читает из файла строку символов, пока не будет прочитан признак конца строки. Первым параметром указывается буфер, куда помещается прочитанная строка, вторым параметром указывается увеличенное на 1 число символов, по прочтении которого функция прекращает свою работу, третий параметр – указатель на файловую переменную. Функция возвращает значение 0 в случае невозможности чтения данных (например, если достигнут конец файла). char i; i=fgetc(f1); Функция fgetc(f1) читает один символ из файла, связанного с указателем, передаваемым ей в качестве параметра. После завершения функции fprintf(), fgets(), и fgetc() сдвигают файловый указатель на число прочитанных или записанных байт. Таким образом, следующее к ним обращение приведёт к чтению или записи файла начиная с нового места. Двоичные файлы. Двоичные файлы предназначены для хранения информации в двоичном виде. В них можно хранить данные любого формата и любой длины. Для доступа к информации в двоичном файле применяются функции fread() и fwrite().Они имеют следующий формат и смысл. char i; fread(&i, sizeof(char), 1, f1); Функция fread() читает данные из файла. Её первый параметр – указатель на переменную, в которую будут считываться данные; второй параметр – размер одной порции читаемых данных; третий – число таких порций, читаемых за одно обращение к функции; последний параметр – указатель на файловую переменную. Функция возвращает число фактически прочитанных порций (размер каждой из которых указан вторым параметром), или 0, если произошла ошибка (например, достигнут конец файла). char i; fwrite(&i, sizeof(char), 1, f1); Функция fwrite() записывает данные в файл. Её первый параметр – указатель на переменную, откуда будут записываться данные; второй параметр – размер одной порции записываемых данных, третий – число таких порций, записываемых за одно обращение к функции; последний параметр – указатель на файловую переменную. Функция возвращает число фактически записанных порций или 0 в случае ошибки. После завершения функций fread() и fwrite() файловый указатель смещается на число прочитанных или записанных байт. Кроме строго последовательных чтения и записи в языке С++ можно обеспечить доступ к любому месту файла с помощью функции fseek(). fseek(f1, 10, SEEK_CUR); Первый параметр функции fseek() – указатель на файловую переменную; второй параметр – число байт, на которое нужно сдвинуть файловый указатель; третий параметр – это место, с которого нужно начинать сдвиг. Он может принимать следующие значения: SEEK_SET – начало файла, SEEK_CUR – текущее положение файлового указателя, SEEK_END – конец файла. Есть ещё несколько полезных функций для работы с файлами: getcurdir() – возвращает текущий каталог; chdir() – устанавливает каталог по умолчанию. Перечисленные функции не исчерпывают файловый инструментарий С++. О дополнительных возможностях и специфических приёмах работы с файлами (например, с помощью потоковых команд) можно узнать из справочной системы языка С++. СРЕДСТВА WINDOWS ДЛЯ РАБОТЫ С ФАЙЛАМИ Операционная система Windows имеет собственные средства для работы с файлами, которые становятся доступными после ссылки на заголовок <windows.h>. Перечислим основные из них (подробную информацию по этим функциям можно узнать из справочной системы WIN32.HLP или WIN32S.HLP). CreateFile() – создаёт новый или открывает существующий файл. ReadFile() – читает данные из файла. WriteFile() – записывает данные в файл. Главное причина, по которой программисту иногда приходится обращаться напрямую к функциям WinAPI при работе с файлами – возможность реализовать особые режимы доступа, чтения и записи (например, асинхронные чтение и запись). ЗАДАНИЕ К ЛЕКЦИИ 6 Создать в редакторе текстовый файл с записями следующего вида: Иванов Петр Сергеевич 1975 Сидоров Николай Андреевич 1981 Воробьянинов Ипполит Матвеевич 1978 …. Прочитать данные из этого файла и записать в другой только те строки, которые относятся к родившимся позднее 1980 года.