ФАЙЛЫ Основные определения. Файл – именованный набор данных одного типа (компонент, элементов файла) на внешнем носителе. Любой файл имеет три характерных особенности: 1. у него есть имя, что дает возможность программе работать одновременно с несколькими файлами. 2. он содержит компоненты одного типа. Типом компонентов может быть любой тип Паскаля, кроме файлов. Иными словами, нельзя создать «файл файлов». 3. длина вновь создаваемого файла никак не оговаривается при его объявлении и ограничивается только емкостью устройств внешней памяти. С файлами связано два понятия: физический файл логический файл. Физический файл находится на внешнем устройстве и имеет имя. Имена файлов Имя файла - это любое выражение строкового типа, которое строится по правилам определения имен в операционной системе: имя содержит до восьми разрещенных символов (разрешенные символы в Ms DOS это произвольные символы с кодами от 33 до 255, кроме символов пробел, точка, запятая, двоеточие, звездочка, знак вопроса, обратная косая черта, а также символ Забой - код 127 по стандарту АSCII); имя начинается с любого разрешенного символа; за именем может следовать расширение - последовательность до трех разрешенных символов; расширение, если оно есть, отделяется от имени точкой. Перед именем может указываться путь к файлу - имя диска и/или имя текущего каталога и имена каталогов вышестоящих уровней. Имя диска содержит одну из латинских букв A..Z, после которой ставится двоеточие. Имена А: и В: относятся к дисковым накопителям на гибких дискетах, имена С:, D: и т.д.-к жестким дискам. Эти имена могут относиться также к одному или нескольким виртуальным дискам, созданным в операционной памяти. Если имя диска не указано, подразумевается устройство по умолчанию - то, которое было установлено в операционной системе перед началом работы программы. 3а именем диска может указываться имя каталога, содержащего файл. Если имени каталога предшествует обратная косая черта, то путь к файлу начинается из корневого каталога, если черты нет - из текущего каталога, установленного в системе по умолчанию. За именем каталога может следовать одно или несколько имен каталогов нижнего уровня. Каждому из них должна предшествовать обратная косая черта. Весь путь к файлу отделяется от имени файла обратной косой чертой. Максимальная длина имени вместе с путем - 79 символов. Если файл находится не на диске, а на другом внешнем устройстве, то имя файла задается логическим именем устройства. Логические устройства Стандартные аппаратные средства ПК, такие как клавиатура, экран терминала, печатающее устройство (принтер) и коммуникационные каналы ввода-вывода, определяются в Паскале специальными именами, которые называются логическими устройствами. Все они в Паскале рассматриваются как потенциальные источники или приемники текстовой информации. ‘CON’ – консоль (при вводе – клавиатура, при выводе – экран монитора) ‘LPn’, где n – 1,2, и т.д. – параллельный порт ввода-вывода ‘COMn’, где n – 1,2, и т.д. – последовательный порт ввода-вывода ‘LPT’ – принтер ‘NUL’ – фиктивное устройство. NUL - логическое имя "пустого" устройства. Это устройство чаще всего используется в отладочном режиме и трактуется как устройство неограниченной емкости - приемник информации. При обращении к NUL как к источнику информации выдается признак конца файла ЕОF. Связывание логического устройства с файловой переменной осуществляется процедурой ASSIGN(< файловая переменая >, '< имя файла >'). Паскаль никогда не связывает имена логических устройств с дисковыми файлами, и в этом смысле можно считать эти имена зарезервированными. Иными словами, нельзя, например, обратиться к дисковому файлу с именем РRN - Паскаль всегда интерпретирует такой запрос как обращение к принтеру. Логический файл – это файловая переменная, связанная с типом файла при его описании. Файловую переменную можно задать любым идентификатором. При работе с файлом сначала устанавливается соответствие между физическим и логическим именем файла (при помощи процедуры Assign), далее в программе используется только файловая переменная. Например: Var f:text; {текстовый файл описывается через файловую переменную f } Begin assign(f,‘X:\11a-13\test.txt’); {устанавливается соответствие между файловой переменной f и физическим файлом с именем X:\11a-13\test.txt’} Reset(f); {открытие файла для чтения} { обработка файла} Close(f); {закрытие файла} End. Существуют стандартные файловые переменные: INPUT – для ввода с клавиатуры, OUTPUT – для вывода на экран монитора. Они могут быть переопределены пользователем, т.е. могут быть связаны с другими устройствами ввода-вывода. Виды файлов Вид файла по способу хранения информации в файле. 1. типизированные (задаются предложением FILE OF ...), 2. текстовые (задаются предложением ТЕХТ), 3. нетипизированные (задаются предложением FILE). Вид файла по способу доступа к информации в файле. 1. Прямого доступа 2. Последовательного доступа В Паскале нет средств контроля вида ранее созданных файлов. При объявлении уже существующих файлов программист должен сам следить за соответствием вида объявления характеру файла. Способы описания переменной файлового типа var < имя файловой переменной> : FILE OF <тип>; < имя файловой переменной> : ТЕХТ; < имя файловой переменной> : FILE; . < тип > - любой тип Паскаля, кроме файлов. Пример c использованием описания пользовательского типа: Type Man=record Name: string; LastName: string; End; Men=file of Man; Var Staff: Men; Numbers: file of real; Book: Text; A_File: File; Доступ к файлам. Любой программе доступны два предварительно объявленных файла со стандартными файловыми переменными: INPUT - для чтения данных с клавиатуры и OUTPUT - для вывода на экран. Любые другие файлы, а также логические устройства становятся доступны программе только после выполнения особой процедуры открытия файла (логического устройства). Эта процедура заключается в связывании ранее объявленной файловой переменной с именем существующего или вновь создаваемого файла, а также в указании направления обмена информации: чтение из файла или запись в него. Связывание файловой переменной с именем файла осуществляется обращением к встроенной процедуре ASSIGN: ASSIGN(< ф.п. >, < имя файла или л.у. >); Здесь < ф.п. > - файловая переменная (правильный идентификатор, объявленный в программе как переменная файлового типа); < имя файла или л.у. > - текстовое выражение, содержащее имя файла или логическое устройство. Пример: Assign(Book,’PascalLecture.txt’); Если имя файла задается в виде пустой строки, например, ASSIGN(f, ‘’), то файловая переменная связывается со стандартным файлом INPUT или ОUТРUТ. Пример: программа создает на диске C файл, содержащий возрастающие числа, закрывает файл, открывает его и полностью выводит его содержимое (в виде чисел). Var Num: file of Byte; Файл последовательного доступа. Открыт только на запись или только на чтение. Стандартные текстовые файловые переменные – input – ввод с клавиатуры и output – вывод на дисплей. 2. Поставить в соответствие физическому файлу на внешнем устройстве логический файл – файловую переменную, к которой будут обращаться все файловые процедуры. ASSIGN ( ФАЙЛОВАЯ ПЕРЕМЕННАЯ, ИМЯ ФАЙЛА); -Процедуру нельзя использовать для открытого файла. -связь файловой переменной с физическим файлом существует до выполнения другой assign для той же переменной. Т.е. файл можно снова открывать после close без новой assign. 3.Инициировать файл. -RESET (ФАЙЛОВАЯ ПЕРЕМЕННАЯ); открывает уже существующий файл на ЧТЕНИЕ и ставит уклазатель на начало первого элемента файла. ТЕКСТОВЫЕ ФАЙЛЫ Это последовательность символов, сгруппированных в строки, -REWRITE(ФАЙЛОВАЯ ПЕРЕМЕНАЯ): заканчивающиеся специальным символом eoln (#13 CR, #10 LF). создает и открывает новый файл для последующей записи. Если он существует, то создается новый пустой файл с таким же именем. Структура текстового файла - линейная: Не забывать -проверять файл на сушествование; #13 #10 #13 #10 #13 #10 #26 -переименовывать исходный файл во временный. -APPEND(ФАЙЛОВАЯ ПЕРЕМЕНАЯ); Строка1 строка 2 строка3 открывает файл на дозапись. процедура АРРЕND применима только к где #13 и #10 – признак (маркер) конца строки, а #26 – признак (маркер) текстовым файлам. Если текстовый файл ранее уже был открыт с конца файла. помощью RESET или REWRITE, использование процедуры APPEND Так как строки в текстовом файле могут быть разной длины, то в приведет к закрытию этого файла и открытию ею вновь, но уже для конце каждой строки ставится признак (маркер) конца строки, а в конце добавления записей. файла ставится маркер конца файла. Доступ к компонентам текстового файла только последовательный, Указаталь ставится в конец файла. При этом файл доступен только для записи!!!! Результат Eof == true. т.е. компоненты файла читаются или записываются только После reset или rewrite eof – true только если файл пуст. последовательно друг за другом. 4.Читать/писать; Текстовые файлы работают со всеми внешними устройствами. READ (ФАЙЛОВАЯ ПЕРЕМЕНАЯ, <список вв/выв>); - чтение без перехода на следующую строку Последовательность действий при работе с текстовым файлом. READLN(ФАЙЛОВАЯ ПЕРЕМЕНАЯ, <список вв/выв>); - чтение с 1. Описать (определить) переменные файлового типа: (файловые переходом на начало следующей строки переменные) Type <имя типа>= text; Var <файловая переменная>: text; READLN(ФАЙЛОВАЯ ПЕРЕМЕНАЯ); - переход на начало следующей Var <файловая переменная>:<имя типа>; строки Длина строки 0-255 символов. Чтение начинается с элемента, на который установлен текущий указатель. i:byte; Begin Assign(Num,'C:\Numbers.num'); Rewrite(Num); For i:=0 to 255 do Write(Num,i); Close(Num); Assign(Num,'C:\Numbers.num'); Reset(Num); Repeat Read(Num,i); Writeln(i); Until Eof(Num); End. WRITE (ФР, <список вв/выв>); WRITELN (ФР, <список вв/выв>); WRITELN (ФП); 5.Закрытие файла - закрывает файл, однако связь файловой переменной с именем файла, установленная ранее процедурой АSSIGN(), сохраняется. Поскольку связь файла с файловой переменной сохраняется, файл можно повторно открыть без дополнительного использования процедуры ASSIGN. CLOSE(ФАЙЛОВАЯ ПЕРЕМЕННАЯ); Процедуры и функции для работы с текстовыми файлами. 1.Проверка существования файла: Если делается попытка инициировать чтение из несуществующего файла или логического устройства РRN, возникает ошибка исполнения, которая может быть сообщена программе с помощью встроенной функции IORESULT типа WORD, которая в этом случае имеет ненулевое значение. (Можно выяснить, существует ли требуемый файл на диске). {$I-} assign(f,filername); reset(f); close(f); {$I+} if ioresult=0 writeln(‘ файл существует'); 2.Переименование неоткрытого файла RENAME(ФАЙЛОВАЯ ПЕРЕМЕНАЯ,ИМЯ ФАЙЛА); Имя файла – новое имя. Перед выполнением процедуры необходимо закрыть файл, если он ранее был открыт. 3.Удаление неоткрытого внешнего файла ERASE(ФАЙЛОВАЯ ПЕРЕМЕННАЯ); 4.Проверка конца файла EOF(ФАЙЛОВАЯ ПЕРЕМЕННАЯ); True – если обнаружен конец файлаи указатель находится в конце файла за его последним символом. False - нет Пример: While not eof(f) do {читать строки файла} При записи это означает, что очередной компонент будет добав лен в конец файла, при чтении - что файл исчерпан. 5. Проверка конца строки EOLN(ФАЙЛОВАЯ ПЕРЕМЕННАЯ); Пример: While not eoln(f) do {читать строку read(f, x)} 6. Функции используются только для открытых файлов. seekeoln(фп); -- аналогична eoln, но пропускает пробелы и табуляцию перед проверкой на конец строки. Seekeof(фп); -- аналогична eof, но пропускает пробелы и табуляцию перед проверкой на конец файла. Их удобно использовать для чтения числовых данных для пропуска разделяющих числа пробелов и знаков табуляции. 7. flush Очищает внутренний буфер файла игарантирует сохранение всех последних изменений файла на диске. Любое обращение к файлу в Паскале осуществляется через внутренний буфер, что необходимо для согласования представления файлового компонента - записи с принятым в ОС форматом хранения данных на диске. В ходе выполнения процедуры FLUSH все новые записи будут действительно записаны на диск. Процедура игнорируется, если файл был инициирован для чтения процедурой RESET. Пример программы: var f:text; x,k:integer; begin assign(f,:f.dat’); reset(f); while not eof(f) do begin k:=0; while not eoln(f) do begin read(f,x); write(x,’ ‘); inc(k); end; writeln(‘ в строке ', k,’ элементов’); readln(f); end; close (f); end. Задание: Запишите в тетрадь, задание, которое выполняет приведенная программа?