Pascaler
О проекте Теоретический материал Тестирование Архив задач
Войти в личный кабинет



О проекте


Преподавателям


Тема: Тeкстовые файлы, их описание и основные отличия от типизированных файлов.

Наряду с описанными типами файлов Pascal имеет средства взаимодействия с файлами несколько иной структуры-так называемыми текстовыми файлами. Введение текстовых файлов несколько нарушает стройность языка, однако позволяет использовать Pascal при программировании широкого класса задач, имеющих нечисловой характер и связанных с обработкой текстовой информации.

Во многих версиях языка допускается хранение файлов на диске как символьных данных. При считывании файла в оперативную память машины символы файла преобразуются в тот тип данных, который объявлен в программе. Файлы символьных данных называются текстовыми файлами. Текстовые файлы имеют тип text.

Структура текстовых файлов отличается от структуры обычных файлов (которые представляют из себя линейную последовательность элементов одного типа) тем, что содержимое текстового файла рассматривается как последовательность строк переменной длины, разделённых специальной комбинацией, называемой "конец строки". Как правило, эта комбинация строится из управляющего кода "перевода каретки" (CR, Carriage Return, символ #13), за которым, возможно, следует управляющий код "перевод строки" (LF, Line Feed, символ #10). Признаком конца строки считается нажатие клавиши ввода.

Текстовый файл завершается специальным кодом "конец файла" (символ #26). В большинстве случаев знание конкретной кодировки управляющих символов не обязательно ввиду наличия файловых операций, автоматически учитывающих эти символы.

Таким образом, текстовый файл структурно несколько похож на "файл из байтов" (file of byte) с той разницей, что в нем, помимо содержательной информации, встречаются символы специального назначения.

Его можно схематически представить в следующем виде:

. . . . . . . . . . . . . .#13#10
. . . . . . . . . . . . . . . . . . . .#13#10
. . . . . . . . . . . . . . . . .#13#10
. . . . . . . . . . . .#13#10
. . . . . . . . . . . . . . . . . . . . . . . . . .#13#10
#26

Описанная структура текстовых файлов хорошо согласуется с интуитивно понимаемым построением текстовой информации и полностью совпадает со стандартной структурой текстов, принятой в MS-DOS, используемой во многих текстовых редакторах, понимаемой компиляторами с языков программирования и т.д.

С каждым файлом на диске должна быть связана файловая переменная, которая описывается в соответствии с типом файла на диске. Представителем же текстового файла в Pascal-программе является переменная файлового типа, которая должна быть описана с указанием стандартного типа text:

Var
  TextFile : text;

Примечание. Слово text не является зарезервированным словом, а считается идентификатором стандартного типа, наряду с идентификаторами integer, real и т.д.

Обращение к файлу в дальнейшем идёт через файловую переменную.

Далее доступ к файлу требуется открыть. Открыть любой файл можно на чтение и на запись. Для этого существуют процедуры reset, rewrite.

К примеру, пусть на диске создан текстовой файл text.txt.

Для Turbo Pascal описание и связывание файловой переменной f с файлом text.txt, будет выглядеть так :

Var
  f: text;
Begin
  assign(f, 'd:\tp7\bin\text.txt'); {Полный путь до файла }
  reset(f);{Открыть на чтение]
  . . .
End.

assign([файл. пер. ], [полный путь до файла на диске]) -связывает файл на диске с файловой переменной f типа текст.

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

Когда имя файла на диске не указывается, то параметр f оказывается связанным со стандартным вводом/выводом. Если присвоено пустое имя, то после обращения к reset(f) f будет указывать на стандартный файл ввода, а после обращения к rewrite(f) f будет указывать на стандартный файл вывода.

reset([ файловая переменная ]) -открывает файл на чтение.

Ввод-вывод для текстовых файлов подчиняется тем же общим правилам, что и для обычных типизированных файлов; однако имеется несколько важных особенностей.

Во-первых, для одного текстового файла нельзя одновременно производить операции и ввода, и вывода. Это означает, что после открытия текстового файла процедурой reset возможно только чтение информации из файла, после процедуры rewrite - только запись в файл.

Во-вторых, обмены с текстовыми файлами всегда являются строго последовательными, то есть после чтения из файла элемента с порядковым номером N следующая операция чтения даст элемент с номером N+1. Иными словами, прямой доступ к любому элементу текстового файла невозможен; для текстовых файлов не допускаются вызовы Seek, FilePos, FileSize.

Под чтением файла понимают ввод данных из внешнего файла, находящегося на диске, в оперативную память машины. Данные файла становятся доступными программе. Внешний файл, из которого читаются данные, часто называют входным файлом.

Базовой техникой обменов с текстовыми файлами является посимвольный ввод-вывод. При этом производится чтение или запись всех символов, как информационных, так и специальных.

Покажем простую программу, выполняющую чтение некоторого текста. Эта программа выводит на экран последовательность кодов символов, составляющих файл text.txt.

Program TextFile1;
Var
  f : text; {Читаемый текст}
  S : char; {Очередной прочитанный символ}
Begin
  assign(f, 'text.txt'); {Связываем файл text.txt с переменной f}
  reset(f,); {Открываем файл text.txt для чтения}
  while not Eof(f) do{Пока нет конца файла делай...}
    begin
      readln(f, S);{Читаем из файла очередной символ в переменную а}
      writeln(a);{Печатаем код символа на экран}
    end;
  close(f);{Закрываем файл}
  readln
End.

Задание. Наберите текст программы и запустите программу на выполнение. Просмотрите результат работы программы. Найдите выведенные на экран коды специальных символов.

Еще одной особенностью работы с текстовыми файлами является возможность непосредственных обменов значениями различных базовых типов (для обычных типизированных файлов тип параметров read и write должен совпадать с базовым типом файла). Так, в текстовый файл можно записать6 например, целое или вещественное число. При этом его внутреннее представление будет автоматически преобразовано в строчку символов, образующих изображение этого числа.

Рассмотрите простую программу, выполняющую чтение из текстового файла целых чисел и вывод на печать только четных чисел.

Program TextFile2;
Var
  f : text;
  Put : string;
  a : integer;
Begin
  Put := 'D:\TP7\BIN\Primer2'; {Полный путь до файла }
  assign(f, Put); {Связываем файл с переменной f}
  reset(f); {Открываем файл на чтение.}
  while not Eof(f) do{Пока нет конца файла делай...}
    begin
      readln(f, a);{Считываем число в переменную а}
        if not odd(a) {Если число нечетное,}
          then
            writeln(a);{То выводим его на экран}
    end;
  close(f);
  readln
End.

Задание. Напишите программу, с помощью которой можно сформировать текстовый файл, содержащий

  • значения целого типа;
  • значения вещественного типа;
  • значения булева типа.

Для описанных выше случаев записи произвольной информации в текстовый файл в языке имеются дополнительные возможности, которые заключаются в задании размера поля записи. Если после записываемой переменной или выражения поместить символ двоеточия, а после него - любое выражение целого типа, то для выводимого значения будет отведено поле, размер которого (число символов) будет равен значению выражения. Следующая тривиальная программа наглядно показывает действие указателя поля:

Program TextFile3;
Var
  f : text;
  V : real;
  i : word;
  Put : string;
Begin
  Put := 'D:\TP7\BIN\Primer3'; {Полный путь до файла }
  assign(f, Put); {Связываем файл с переменной f}
  rewrite(f); {Открываем файл на запись}
  V := 123.456;
  write(f, V,#13#10);{выводим без указателя поля на экран}
  for i := 8 to 12 do
    write(f, V:i,#13#10);{динамически изменяем размер поля}
  close(f);
End.

Задание. Наберите программу, дополните ее выводом содержимого текстового файла на экран. Проанализируйте полученные результаты выполнения программы.

Управление размещением значений в текстовых файлах очень удобно при формировании структурированных файлов (списков, таблиц и т.п.), так как если изображение значения меньше размера поля, то оно всегда "прижимается" к его правому краю.

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

Вернуться назад
2003—2012 © Группа «Vimedia»
Проект «Pascaler» — лучший на ХI Всероссийской конференции молодых исследователей с международным участием «Шаг в будущее», Россия, Москва, 12 – 16 апреля 2004г.