:: PASCAL :: ТЕОРИЯ  
 

 

Лекция 11

  

 

Файловый тип данных

 

1. Общее понятие о файле.  

  Типы данных, с которыми мы до сих пор имели дело, предназначены для манипулирования информацией, содержащейся в оперативной памяти компьютера. Однако, часто возникает необходимость сохранения этих результатов с целью их постоянного использования. Для долговременного хранения информация из оперативной памяти переносится в файлы.  
  Файл представляет собой некоторое поименованное место на внешнем носителе.  
  Кроме "долговременности" хранения у файлов имеется еще одна отличительная особенность: их неопределенный объем (или длина). Если для каждого из прочих структурированных типов (например, массивов) всегда точно определено, сколько элементов содержит та или иная структура, то, сколько элементов должно быть в файле, при объявлении файлового типа не указывается. Максимальная длина файла ограничивается только свободным местом на диске, и это является основным отличием файлов от массивов.  
  Для хранения информации в Turbo Pascal предусмотрена возможность определения файловых типов и файловых переменных. После этого информацию, которая может потребоваться впоследствии, можно перенести в файл на диске. Существуют три возможности определения файлового типа:    
  Type f = file of <базовый тип элементов файла>;  

   ft = text;  
   ff = file;  
Данный пример демонстрирует наличие трех видов файлов, которыми оперирует Turbo Pascal. Речь идет (по порядку) о типизированных, текстовых и нетипизированных файлах.  

  file и of – зарезервированные слова  
  text – идентификатор стандартного типа данных (такого, как, например, integer или real);  
  <базовый тип элементов в файле> – любой тип, кроме файлового.  
  В разделе описания переменных описываются файловые переменные указанных типов.  
  var  
  f1 : file;  
  f2 : text;  
  f3 : file of integer;  
  f4 : file of mass.  
  Среди объявленных файловых переменных f1 – это нетипизированный файл, f2 – текстовый, a f3, f4 – типизированные файлы. Причем если среди типизированных файлов элементы файла f3 относятся к стандартному типу (integer), то элементы файла f4 – к типу, объявленному пользователем (тип mass представляет собой массив целых чисел).  
  Файлы различных видов имеют нечто общее:    
ü в файле в каждый момент может быть доступен только один элемент. Например, в файле f3 можно иметь доступ к одному из целых чисел, из которых состоит файл; в файле f4 – к единственному массиву;    
ü файлы всех видов завершаются маркером конца файла (EoF – End of File).    
  Доступ к элементам файла обычно осуществляется последовательно, путем их поочередного перебора. Для того чтобы "добраться" до последнего элемента, необходимо обработать (считать или записать) все предыдущие. Кроме того, для типизированных и нетипизированных файлов возможен переход к определенному элементу (минуя предыдущие).    
  Число элементов файла определяет его объем, или длину. Как уже отмечалось, длина файла при его объявлении не фиксируется.    

 

  Попробуем представить себе все это наглядно. Информация на диске записывается на дорожках, располагающихся по концентрическим окружностям. Поэтому логично представить файл в виде части дорожки – сектора. Здесь изображен файл, содержащий пять элементов. Начинается файл идентификатором, который обозначен буквой f. Далее следуют несколько элементов, и завершается файл маркером конца файла (EoF). Элементы, образующие файл, представляют собой значения, принадлежащие любому простому или структурированному типу, за исключением файлового. Чтобы подчеркнуть, что длина файла не ограничена, изображенный здесь сектор справа не замкнут.    
  Стрелка на рисунке представляет собой указатель текущей позиции файла (указатель считывания). Для чего необходим указатель текущей позиции? Если инициировать запись в файл или считывание из файла, запись будет проводиться, начиная с элемента, перед которым расположен указатель текущей позиции. Это же касается и считывания.    
  Разумеется, данное визуальное представление файла очень условно. Часто файл занимает не часть дорожки, а несколько дорожек. Кроме того, никакой стрелки в реальности не существует. Это визуальное представление файла (вернее, его вариации) мы будем использовать в дальнейшем при изучении различных операций над файлами.  
 

2. Операции над файлами.  

  В отличие от других типов данных, в Turbo Pascal нет встроенных операторов, предназначенных для манипулирования файлами. Например, не удастся с помощью оператора присваивания присвоить файловой переменной некоторое значение. В силу этого соответствующие операции реализованы в виде процедур и функций.    
  Файловые процедуры и функции условно можно разделить на пять групп:    
  1) организующие доступ к файлам;    
  2) осуществляющие ввод/вывод;    
  3) предназначенные для ориентирования в файле;    
  4) специальные операции;    
  5) завершающие операции.    
 

2.1. Подготовка файлов к работе.  

  2.1.1. Организация доступа к файлам.  
  Поскольку файлы, в отличие от данных других типов, содержатся в так называемой вторичной памяти (т.е. на дисках), для доступа к файлам недостаточно только объявить файловую переменную. При объявлении файловой переменной не указывается ни имя файла, ни в каком каталоге он содержится. Для того чтобы конкретный файл стал доступным, его необходимо как-то связать (или ассоциировать) с ранее объявленной файловой переменной. Такое связывание осуществляется с помощью процедуры Assign, которая является стандартной процедурой Turbo Pascal.    
  Заголовок процедуры Assign выглядит следующим образом:    

    Assign (<имя файловой переменной>, <имя файла>);  
где <имя файловой переменной>имя файловой переменной любого вида, с которой ассоциируется файл с диска, имеющий имя <имя файла> .  
Обобщенный вид имени файла, которое строится по правилам имен операционной системы MS DOS, выглядит так:  
   <диск>:\<путь>\<имя_файла>

  В качестве параметра процедуры Assign вместо имени файла с диска можно использовать зарезервированное за некоторым устройством имя. В MS DOS основным аппаратным средствам ПК присвоены символические имена, которые можно использовать в операциях ввода/вывода вместо имен файлов.  
 

 

  CON – символическое имя консоли. Под консолью подразумеваются одновременно и клавиатура, и монитор компьютера. Логическое имя CON можно указать для процедуры Assign вместо имени файла; когда информацию требуется ввести с клавиатуры или вывести на экран. Система по выполняемой операции определяет, с клавиатурой или монитором ей следует иметь дело в том или ином случае. Вывести данные можно на экран, но не на клавиатуру, а ввести только с клавиатуры.  
  PRN – символическое имя принтера. Его можно указать в качестве параметра процедуры Assign (вместо имени файла), когда требуется распечатать информацию на принтере. Если к одному компьютеру подключено несколько принтеров, в MS DOS для принтеров предусмотрены следующие символические имена: LPT1, LPT2, LPT3, (причем имена PRN и LPT1 взаимозаменяемые или синонимы).    
  До выполнения над файлом каких-либо действий всегда необходимо обратиться к процедуре Assign. После вызова процедуры Assign, связь между указанными файлом и файловой переменной существует вплоть до завершения работы программы, либо пока к этой файловой переменной снова не будет применена процедура Assign.  

 

 
  2.1.2.Открытие файлов.  
  Для открытия файлов предназначены процедуры: Reset, Rewrite и Append. Причем если процедуры Reset и Rewrite подходят для открытия файла любого вида, то с помощью процедуры Append можно открыть только текстовый файл.    
  1)    
  Reset(<имя файловой переменной>);    
  Процедура Reset , примененная к текстовому файлу, открывает его только для чтения, а к типизированному или нетипизированному файлу, открывает его как для чтения, так и для записи.    
  Файл, открываемый с помощью процедуры Reset, должен уже существовать. Если файла с таким именем и в указанном каталоге не окажется, будет выдано сообщение об ошибке.    
 

 

 

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

  2)    
  Rewrite(<имя файловой переменной>);    
  Процедура Rewrite, примененная к текстовому файлу, открывает его только для записи, а к типизированному или нетипизированному файлу, открывает его как для чтения, так и для записи.    
  Замечание. Если процедуру Reset применить к несуществующему файлу, будет выдано сообщение об ошибке, а процедура Rewrite в этом случае создаст новый файл. Если же процедуру Reset применить к существующему на диске файлу, файл будет открыт, а процедура Rewrite при этом удалит содержимое старого файла и создаст новый файл с тем же именем.    
  Файл, открытый с помощью процедуры Rewrite, выглядит так:  
 

 

 

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

 

2.2. Организация ввода/вывода в файле.  

  Для осуществления ввода информации в файл и вывода из файла в Turbo Pascal для текстовых и типизированных файлов предназначены процедуры Read и Write. Использование процедур Read и Write имеет особенности, зависящие от вида файла (текстовый это файл или типизированный).    
  1) Read (f,v1[,v2,…,vn]);    
  f - файловая переменная, имеющая тип file of …    
  v1,v2,…,vn – одна или несколько переменных, принадлежащих любому типу, за исключением файлового.    
  Процедура Read для типизированных файлов обеспечивает считывание одного или нескольких компонентов файла и присвоение считанного значения (значений) некоторой переменной (переменным).    
  2)  Write (f,v1[,v2,…,vn]);    

  

  f - файловая переменная, имеющая тип file of …    
  v1,v2,…,vn – одна или несколько переменных, принадлежащих любому типу, за исключением файлового. Эти переменные должны иметь тот же тип, что и тип файла.    
  Процедура Write для типизированных файлов обеспечивает присвоение значения (значений) некоторой переменной (переменных) компоненту (компонентам) файла.    
  После записи переменной очередному элементу файла присваивается значение переменной, т.е. старое значение элемента заменяется новым, указатель текущей позиции файла перемещается к следующему элементу. Если указатель находится в конце файла, то при записи очередного элемента этот элемент дополняет файл.  
  3)Текстовый файл представляет собой последовательность строк разной длины, состоящих из символов. Каждая строка текстового файла оканчивается маркером конца строки EoLN, а завершает текстовый файл, как и любой другой, маркер конца файла EoF. К элементам текстового файла возможен только последовательный доступ, начиная с первого. Для того чтобы файл открыть как текстовый, его необходимо ассоциировать с файловой переменной, имеющий тип Техт.  
  Замечание. Помимо Read и Write, для текстовых файлов применимы процедуры Readln и Writeln.  

 При осуществлении стандартного ввода-вывода операторы выглядят так:
   Read(a,b,c); или Write(x,y,'Вывод на экран');

  В Turbo Pascal существует два стандартных идентификатора, играющие роль текстовых файловых переменных, ассоциируемых вместо файлов с конкретными физическими устройствами компьютера. Это идентификаторы INPUT и OUTPUT, которые ассоциируются соответственно с клавиатурой и экраном компьютера. Указанные файлы считаются постоянно открытыми (т.е. для них не нужно использовать процедуры Rewrite и Reset) и эти идентификаторы можно использовать в программах. Так, операторы ввода-вывода, о которых шла речь выше, можно представить и иначе:  

    Read(Input, a,b,c); или Write(Output, x,y,'Вывод на экран');
Первый оператор считывает из файла INPUT значения (т.е. позволяет ввести их с клавиатуры), которые будут присвоены переменным a,b,c. Второй оператор записывает в файл OUTPUT (т.е. выводит на экран) значения переменных x,y, а также строку текста. Первая и вторая пары операторов эквивалентны.

  Иными словами, в процедурах Read и Write, когда требуется осуществить ввод с клавиатуры или вывод на экран, указывать файл INPUT или OUTPUT |необязательно. Если в процедуре Read или Write файл не указан, по умолчанию подразумевается файл INPUT или OUTPUT, в зависимости от того, ввод или вывод инициируется.    
  Упомянутые стандартные файлы можно "переассоциировать". Для этого достаточно воспользоваться процедурой Assign, например:    
  Assign (Output,'text.txt');    

 Если после этого в данной программе вызвать процедуру Write без указания файла, соответствующая информация окажется записана в файл TEXT.TXT.

  Использование процедуры Read для текстовых файлов похоже на ситуацию с типизированными файлами, отличие заключается в том, что переменные V1, V2, ..., Vn, записанные в одной команде, могут принадлежать различным типам данных.  
  Считывание значений типа char.  
  Если это переменная (переменные) типа char, то из файла считывается символ и присваивается переменной, затем считывается следующий символ и присваивается следующей переменной – и так до тех пор, пока всем переменным типа char, указанным при вызове процедуры Read, будут присвоены считанные из файла значения. (При вводе с клавиатуры между вводимыми значениями требуется вводить некоторый разделитель – пробел, символ табуляции (клавиша <Таb>) или конец строки (клавиша <Enter>). Если очередной считанный символ окажется маркером конца строки EoLn, считывание будет продолжено из новой строки. Если очередной считанный символ окажется маркером конца файла, то выполнение процедуры будет прекращено.    
  Считывание значений типа string.    
  Если это строковая переменная (переменные), то из файла будут считываться все символы до ближайшего маркера конца строки. Если длина считанной строки превзойдет допустимую для значений типа string величину (255 символов), все оставшиеся до конца строки байты отбрасываются. Считывание нескольких строк подряд следует производить неоднократным обращением к процедуре Readln.    
  Считывание числовых значений  
  Если это значение типа integer или real, процедура Read будет пропускать любые пробелы, символы табуляции или маркеры конца строки, предшествующие числовой строке. Когда будет обнаружена первая значащая цифра, процедура Read начнет формировать числовое значение, пока не встретится один из перечисленных символов (пробел, символ табуляции или маркер конца строки). Считанная таким образом последовательность цифр рассматривается как символьное представление соответствующего числа, и полученное значение присваивается соответствующей переменной. Если числовая строка не соответствует ожидаемому формату, будет выдано сообщение об ошибке ввода/вывода. Следующая процедура Read начнет считывание с пробела, символа табуляции или маркера конца строки, которым была завершена предыдущая числовая строка.    
  4)Кроме подпрограмм, осуществляющих ввод/вывод, имеется функция, которая осуществляет контроль за вводом/выводом.    
  IOResult()    
  возвращает код ошибки, возникшей при выполнении последней операции ввода/вывода. Если ошибки не было, функция возвращает нуль.    
  Для того чтобы контролировать ошибки ввода/вывода с помощью функции IOResult, должен быть выключен автоконтроль (директива компилятора {$1-}).    

   
::  

::


Rambler's Top100 Крапивна
 

(с)2005-2006 Web studio SEDUVAN

Hosted by uCoz