34671

Организация файловой системы в Паскале

Реферат

Информатика, кибернетика и программирование

Виды файлов. Типизированные файлы [2] Процедуры и функции для работы с файлами любого типа [3] Процедуры и функции для работы с типизированными файлами [4] Нетипизированные файлы [4.1] Нетипизированные файлы.

Русский

2013-09-08

140 KB

11 чел.

исциплина «Основы алгоритмизации и программирование»  Организация файловой системы в Паскале

Организация файловой системы в Паскале

[1] Файлы. Виды файлов. Типизированные файлы

[2] Процедуры и функции для работы с файлами любого типа

[3] Процедуры и функции для работы с типизированными файлами

[4] Нетипизированные файлы

[4.1] Нетипизированные файлы. Их отличия. Процедуры blockread и blockwrite.

[5] Тeкстовые файлы

Файлы. Виды файлов. Типизированные файлы

Файлом называется область памяти жесткого диска, имеющая свое имя.

Типизированный файл – последовательность элементов одного типа.

Описание файлового типа имеет синтаксис:

file of < тип элементов>;

Type

  Student = record

                    Name, Fam : string;

                    Bal: integer;

                  end;

Var

  File1 : file of char;

  File2 : file of Student;

  File3 : file of string;

Файловые переменные имеют специфическое применение. Над ними нельзя выполнять никаких операций (присваивать значение, сравнивать и др.). Их можно использовать только для выполнения операций с файлами (чтения, записи, удаления файла и т.д.). кроме того, через файловую переменную можно получить информацию о конкретном файле (тип, параметры, имя файла и т.д.).

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

Процедуры и функции для работы с файлами любого типа

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

До начала работы с файлами устанавливается связь файловой переменной МуFilе с именем дискового файла. Например,

 assign (МуFilе, 'с:\МуDirectory\Result.dat');

здесь приведено полное (с указанием пути) имя пользовательского файла Result.dat.

Все файлы, открытые в результате работы программы, должны быть закрыты при завершении программы процедурой

 closе (МуFilе);

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

Открытие нового файла для записи производится процедурой, единственный аргумент которой – переменная файлового типа, например:

 rewrite (МуFilе);

Эта процедура создает на диске новый файл, имя которого связано с переменной МуFilе процедурой Аssign. Указатель работы с файлом помещается в начальную позицию.

Подготовку существующего файла для чтения и записи выполняет процедура

 reset (МуFilе);

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

Запись в файл производится процедурой

 write (МуFilе, var1, var2, ...., varN);

Чтение из файла производится аналогичной процедурой:

 read (МуFilе, var1, var2, ...., varN);

Процедуры и функции для работы с типизированными файлами

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

 Seek (МуFilе, n)

где n – требуемое положение указателя.

Внимание! Нумерация элементов типизированного файла начинается с нуля.

Поэтому, чтобы обратиться к третьму элементу, нужно записать Seek (МуFilе, 2).

Seek (МуFilе, 0) – устанавливает указатель в начальной позиции (на первый элемент).

Seek (МуFilе, FileSize(МуFilе)) – устанавливает указатель после последнего элемента, то есть на признак конца файла.

Текущую позицию указателя дает функция

 FilePos (МуFilе).

Задача 1. Составить программу создания списка учащихся и вывода только фамилий, начинающихся на букву Ш.

Program L;

Var

I,N : Integer;

F : File Of String;

S : String;

Begin

Assign(F,'Spis.lst');   {Связываем переменную F с файлом Spis.lst}

Writeln('Введите количество учащихся');

Readln(N);    {Вводим количество учащихся}

Rewrite(F);   {Создаем файл для записи в него данных}

For I:=1 To N Do  {Для всех учащихся}

Begin

Writeln('Введите фамилию');

Readln(S);

Write(F,S)

End;

Close(F);

Reset(F);

Writeln; Writeln('Список учащихся:');

While Not(Eof(F)) Do

Begin

Read(F,S);

If S[1]<>'Ш' Then

Writeln(S)

End;

Close(F)

End.

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

Program TipRecord;

Uses

   Crt;

Type

  Dann=record

               stag : byte;

               Surname, WorkName : string;

               Oklad, Year : integer;

            End;

Var

  Spisok : file of Dann;  {файл типа записи Dann}

  Man : Dann;   {переменная типа записи Dann для работы с файлом}

  Name : string[12];   {строка для хранения имени физического файла}

Procedure VvodZap (Nomer : integer);

Begin

  with Man do

      begin

          writeln('Введите данные ',Nomer,'-го работника');

          write('Фамилия: ');

          readln(Surname);

          write('Год рождения:');

          readln(Year);

          write('Стаж работы:');

          readln(stag);

          writeln('Должность:');

          readln(WorkName);

          write('Оклад');

          readln(oklad);

          write(Spisok ,Man); {записать в файл созданный элемент Man}

       end;

End;

Procedure FileVvod;

Var

  i, count : Integer;

Begin

   write('Введите имя файла данных:');

   readln(Name);   {имя физического файла}

   assign(Spisok ,Name);  {связываем файловую переменную с файлом}

   rewrite(Spisok );   {открываем файл для записи}

   write('Введите количество работников:');

   readln(count);

   for i:=1 to count do

      VvodZap(i);    {вызов процедуры ввода очередной информации в файл}

   close(Spisok );   {закрываем файл}

   readln; End;

Begin

ClrScr;

   FileVvod;

    reset (Spisok);

     While Not(Eof(Spisok)) Do

     Begin

     Read(spisok,Man);

     Writeln(Man.Surname,' - ',Man.stag)

     End;

    Close(Spisok);

End.

Изменение имени файла производится процедурой rename(МуFilе, FileName);

первый аргумент которой – переменная файлового типа, а второй аргумент – строкового типа – новое имя файла, которое может быть сокращенным или полным (с указанием пути).

Уничтожение части файла от текущего положения до конца производится процедурой

 truncate(МуFilе).

Уничтожение всего файла производится процедурой

 erase(МуFilе),

Нетипизированные файлы

Нетипизированные файлы. Их отличия. Процедуры blockread и blockwrite.

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

Эти файлы в отличие от уже рассмотренных не имеют строго определенного типа.

Нетипизированный файл рассматривается в Паскале как совокупность символов или байтов. Представление char или byte не играет никакой роли, важен лишь объем занимаемых данных.  

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

Для определения в программе нетипизированного файла служит зарезервированное слово file:

Var

  MyFile : file;

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

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

Для таких файлов самым важным параметром является длина записи в байтах. Открытие нетипизированного файла с длиной записи в 1 байт можно выполнить следующим образом:

 rewrite(MyFile, 1) или reset(MyFile, 1)

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

Особенность аппаратной поддержки заключается в том, что при обращении к внешнему устройству минимально возможным объемом для считывания являются 128 байт. После открытия файла с помощью вызовов:

 rewrite(MyFile) или reset(MyFile)

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

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

Во-первых, для обеспечения максимальной скорости обмена данными следует задавать длину, которая была бы кратна длине физического сектора дискового носителя информации (512 байт).

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

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

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

assign (МуFilе, 'с:\МуDirectory\result.dat') - процедура связывания логической файловой переменной МуFilе с конкретным физическим файлом на дисковом носителе информации;

closе (МуFilе) - процедура, закрывающая открытый файл;

rewrite (МуFilе) – процедура, создающая новый файл и открывающая его для записи или чтения; эта процедура имеет дополнительный параметр при работе с нетипизированными файлами, который будет рассмотрен позднее;

reset (МуFilе) – процедура, открывающая существующий файл данных; эта процедура имеет дополнительный параметр при работе с нетипизированными файлами, который будет рассмотрен позднее;

eof (МуFilе) – логическая функция, проверяющая, достигнут ли конец файла;

seek (МуFilе, n) - процедура, позволяющая явно изменить значение текущего указателя файла, установив его на элемент с номером n;

filesize(МуFilе) - функция, возвращающая позицию указателя по файлу; нумерация начинается с нуля;

filepos (МуFilе) - функция, возвращающая количество элементов файла;

rename(МуFilе, FileName) - процедура, позволяющая переименовать существующий файл;

truncate(МуFilе) - процедура, позволяющая удалить часть существующего файла, начиная с текущей позиции;

erase(МуFilе) - процедура, стирающая указанный файл,

Вы должны были заметить, что в списке нет процедур read и write. Для чтения информации из нетипизированного файла и записи информации в него только для данного типа файлов в Турбо Паскаль введены две новые процедуры, поддерживающие операции ввода-вывода с более высокой скоростью.

Процедура BlockRead

blockread(Var F : file; Var Buf; Kolblocks : word; result : word);

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

Параметр Buf представляет любую переменную, которая будет участвовать в обмене данными с дисками. Эту переменную нужно описать в программе так, чтобы ее размер не был меньше размера записи, установленного в параметрах rewrite или reset (как правило, для этих целей используется некоторый массив).

Параметр Kolblocks задает число считываемых блоков, которые должны быть прочитаны за одно обращение к диску.

Параметр result является необязательным и содержит после вызова процедуры число действительно считанных записей.

Использование параметра result подсказывает, что число считанных блоков может быть меньше, чем задано параметром Kolblocks. Если result указан при вызове, то ошибки ввода-вывода в такой ситуации не произойдет. Для отслеживания этой и других ошибок чтения можно использовать опции {$I-}, {$I+} и функцию IOresult.

Кроме того, что переменная F должна быть описана как нетипизированный файл, она должна быть связана с конкретным физическим диском процедурой assign. Файл должен быть открыт процедурой reset.

Процедура BlockWrite.

blockwrite(Var F : file; Var Buf; Kolblocks : word; result : word);

Процедура предназначена для быстрой передачи в файл F определенного числа записей из переменной Buf. Все параметры процедуры blockwrite аналогичны параметрам процедуры blockread. Разница лишь в том, что файл должне быть подготовлен для записи процедурой rewrite. Содержимое переменной Buf целиком помещается в файл, начиная с текущей записи.

Обе процедуры выполняют операции ввода-вывода блоками. Объем блока в байтах определяется по формуле:

Объем = Kolblocks * recSize,

где recSize – размер записи файла, заданный при его открытии. Суммарный объем разового обмена не должен превышать 64 Кбайт. Помимо скорости передачи данных преимущество этих процедур заключается в возможности пользователя самостоятельно определять размер буфера для файловых операций. Эта возможность играет значительную роль в тех задачах, где необходимо жесткое планирование ресурсов. Программист должен позаботиться о том, чтобы длина внутреннего представления переменной Buf была достаточной для размещения всех байт при чтении информации с диска.

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

Если при чтении указана переменная Buf недостаточной длины или если в процессе записи на диск не окажется нужного свободного пространства, то произойдет следующее. Если последний параметр result в этих вызовах не задан, то возникает ошибка ввода-вывода; если параметр result  задан, то ошибка не будет зафиксирована, а после выполнения процедуры его значение не будет совпадать с значением параметра Kolblocks. Последнее обстоятельство можно проверить, сравнив два указанных значения.

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

Задача. Составить программу, которая создает нетипизированный файл из 100 чисел и выводит на экран k-ый элемент.

Program Netipiz1;

Uses

  Crt;

Type

  FileType = file;

Var

  f : FileType;

  P, B, k : byte;

Begin

  ClrScr;

      assign(F, 'MyFile');

      rewrite(F,1);

  Randomize;

  for k := 1 to 100 do

     begin

         P := Random(100);

         blockwrite(F, P, 1);      end;

close(F);

  

  reset(F,1);

  for k := 1 to 100 do

     begin

         blockread(F, P, 1);

         write(p,' ');

     end;

  write('Введите номер нужного элемента ');

  readln(k);

  Seek(F, k-1);

  blockread(F, P, 1);

  writeln(k,'-ий элемент файла равен ', P);

  close(F);

End.

Тeкстовые файлы

Т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

          read(f, S);           {Читаем из файла очередной символ}

          write(s);              {Печатаем код символ}

       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.

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

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

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

Способы обмена с текстовыми файлами.

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

Операции чтения из файла

reset(f) - открывает существующий файл на чтение. Файловая переменная должна быть связана с внешним файлом с помощью процедуры assign.

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

Если f было присвоено пустое имя (например, assign((f),' '), то после обращения к процедуре Rezet(f) будет ссылкой на стандартный файл ввода (канал 0).

Текстовой файл становится доступным только по чтению.

При указании директивы компилятора {$I–} функция IoResult будет возвращать значение 0 в том случае, если операция завершилась успешно, и ненулевой код ошибки в противном случае.

readln([f : text],[v1,v2,....vn]) – выполняет процедуру read, затем переходит к следующей строке файла.

Процедура readln является расширением процедуры read и определена для текстовых файлов. Вызов readln(f) без параметров приводит к перемещению текущей позиции файла на начало следующей строки, если она имеется, в противном случае происходит переход к концу файла. Процедура readln без параметров полностью соответствует стандартному вводу.

При указании директивы компилятора {$I-} функция IoResult будет возвращать значение 0 в том случае, если операция завершилась успешно, и ненулевой код ошибки в противном случае.

Примечание: Функция работает только для тектовых файлов, включая стандартный ввод. Файл должен быть открыт для ввода.

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

Очень часто используется следующий способ чтения из текстового файла. В качестве параметра процедуры readln задается переменная типа string; в этом случае вся очередная строка файла целиком считывается в поданную переменную, длина которой автоматически устанавливается равной длине считанной строки. Полученная из файла строка далее может быть обработана так, как это необходимо. Важно отметить, что при таком способе производится чтение только "значащих" символов строки; завершающиеся символы в данном случае играют роль межстрочных разделителей и не считываются в строковую переменную. После чтения строки текущий указатель файла устанавливается на начало следующей строки.

Операции записи в файл

rewrite(f) - cоздаёт и открывает новый файл. Файловая переменная должна быть связана с внешним файлом с помощью процедуры assign.

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

Если f было присвоено пустое имя (например, assign((f),' '), то после обращения к процедуре rewrite(f) будет ссылкой на стандартный файл вывода (канал 1).

Текстовой файл становится доступным только по записи.

write([f : text],[v1,v2,....vn]) – записывает одно или более значений из одной или более переменных в текстовой файл.

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

Параметр v имеет вид:

<вводимое выражение : мин.размер : десятичных знаков>

Например: 

Var

   a:real;

. . . . . . .

write(f, a: 5: 2)

Такая запись означает, что мы в файл записываем действительное (не целое) число а, размером 5 знаков, 2 знака под дробную часть.

writeln([f : text],[v1,v2,....vn]) – выполняет процедуру write, а затем записывает в файл метку конца строки (перевод строки).

При вызове данной процедуры без параметров writeln(f), в файл записывается метка конца строки. Процедура writeln без параметров полностью соответствует стандартному выводу на экран.

Примечание: файл должен быть открыт для вывода.

Логическая функция Eoln

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

while not Eof(NameFale) do {пока нет конца файла NameFale делай}

  while not Eoln(NameFale) do {пока нет конца строки файла NameFale делай}

      begin

          {группа операторов обработки символов очередной строки}

      end;

Процедура открытия файла для дополнения

append(f : Тext) – процедура открывает существующий файл для присоединения. Если файл уже открыт, то он сначала закрывается, а затем открывается заново. Текущая позиция устанавливается на конец файла.

Если в последнем блоке файла размером 128 байтов присутствует символ Сtrl+Z (26 в коде ASCII), то текущая позиция устанавливается в файле таким образом, что при записи первым в блоке будет "затираться" символ Сtrl+Z.

Если переменной f было присвоено пустое имя assign(f,'  '), то после обращения к процедуре append f будет указывать на стандартный выходной файл.

После обращения к append файл f становится доступным только по записи и Eof(f) принимает всегда значение True(истина).

Рассмотрите несколько примеров простых программ.

Program TextFile4;

{Задача. Дан файл Primer1 на диске. Считать из него информацию и записать во вновь созданный файл Primer2 }

Var

   f, t: text;

   Put1, Put2, d: string;

   s : char;

Begin

   Put1 := 'D:\TP7\BIN\Primer1';{Путь до файла Primer на диске}

   assign(f, Put1 );

   reset(f);{Открыть файл c файловой пер. f на чтение }

   Put2 := 'D:\TP7\BIN\Primer2';{Путь где будет создан файл}

   assign(t, Put2);

   rewrite(t);{ Открыть файл c файловой пер. t на создание и запись }

   while Not Eof(f) Do

       begin

           while Not Eoln(f) do

               begin

                   read(f, s); {Cчитывать из f в переменную s}

                   write(t, s);{ Записывать в t значение s}

               end;

            readln(f); {Переходим к чтению следующей строки файла f}

            writeln(t);{Переходим к записи следующей строки файла t}

       end;

   close(t);{Закрытие файла Primer1}

   close(f);{Закрытие файла Primer2}

End.

Program TextFile5;

{Задача. Дан файл Primer2 со скобками. Проверить численное соответствие закрытых и открытых скобок}

Var

   f : Тext;

   Put, s : string;

   a, i : integer;

Begin

   a := 0; {Обнуляем счетчик скобок}

   Put := 'D:\TP7\BIN\Primer2'; {Полный путь до файла }

   assign(t, Put);

   reset(f); {Открываем файл на чтение.}

   while Not Eof(f) do {Пока нет конца файла делай...}

       begin

          readln(f, s); {Считываем cтроку в переменную s}

          for i := 1 to Length(s) do {Просматриваем строку до конца}

             begin

                if s[i] = '(' {Если встретилась открытая скобка,}

                  then

                     Inc(a,1);{то счетчик увеличиваем на 1}

                if s[i] = ')' {Если встретилась закрытая скобка,}

                  then

                     Dec(a,1);{то счетчик уменьшаем на 1}

             end;

       end;

   close(f);{Закрытие файла}

   if a <> 0{Если скобок одинаковое кол-во, то а=0}

      then

         writeln('No')

      else

         writeln('Yes');

   readln

End.

Program TextFile6;

{Задача. Проиллюстрировать работу процедуры append.}

Var

   f: text;

Begin

   assign(f, 'text.txt'); {создаем текстовый файл}

   rewrite(f);{ Открыть файл c файловой пер. t на создание и запись }

   writeln(f, 'Исходный текст');{ Записывать в него cтроку}

   close(f);{Закрываем сформированный файл}

   append(f); {Вновь открываем этот же файл для добавления}

   writeln(f, 'Добавляемый текст');{ Пишем в конец файла cтроку}

   close(f);{Закрываем файл}

End.

Стандартные текстовые файлы Input и Output. Примеры задач

В Паскале существуют два стандартных текстовых файла Input и Output. Эти файлы считаются известными в любой Pascal-программе (иными словами, они описаны в стандартном модуле System). Они обозначают (по терминологии MS-DOS) соответственно стандартный файл ввода и стандартный файл вывода. Обычно эти стандартные файлы связаны с конкретными физическими устройствами компьютера. Так, файловая переменная Input связана с клавиатурой, файловая переменная Output – с экраном дисплея. эти файлы считаются заранее открытыми, а соответствующие идентификаторы можно использовать в операциях ввода-вывода.

Рассмотрим, например, следующий оператор:

writeln (Output, 'Результат равен ', (X+Y)*2)

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

Аналогично, оператор read (Input, X1, X2); будет выполняться таким образом: система перейдет в состояние ожидания ввода с клавиатуры двух значений. Типы вводимых значений должны совпадать с типами переменных Х1 и Х2. Эти значения при вводе должны отделяться друг от друга одним или несколькими пробелами, а ввод должен быть завершен нажатием клавиши Enter. В процессе ввода значений набираемые на клавиатуре символы отображаются на экране. После нажатия Enter введенные значения будут присвоены переменным Х1 и Х2, и выполнение программы будет продолжено.

Для стандартных файлов Input и Output допускается сокращенная форма записи операций ввода-вывода. Так, если в процедурах read и readln первый параметр опущен, то по умолчанию подразумевается файл Input. Аналогично, отсутствие в процедурах write и writeln первого параметра означает вывод в стандартный файл Output. Вывод в стандартный файл Output используется очень часто – всегда, когда необходимо выдать некоторую информацию из программы на экран.

В соответствии с общими правилами MS-DOS стандартные файлы ввода-вывода могут быть "переназначены", то есть связаны с другими физическими устройствами или дисковыми файлами. Простейшим способом переназначения является использование для этой цели процедуры assign, например,

assign (Output,'MyFile.out')

После выполнения такого оператора стандартный файл вывода будет переназначен, то есть файловая переменная Output будет связана с дисковым файлом MyFile.out из текущего каталога. Все операции вывода, явно или неявно работающие с файлом Output, будут выводить информацию в указанный дисковый файл.

Задание. Рассмотрите предложенные программы, наберите их на компьютере, выделите необходимые части алгоритма в подпрограммы, сформулируйте решаемые ими задачи, дополните необходимыми операторами и комментарием.

Примечание. Если Вы можете решить выше поставленные задачи устно, то поставьте в известность учителя и приготовьтесь к ответу.

Program StringCount;

Uses

  Crt;

Var

  i : integer;

  s : string;

  f : text;

Begin

  ClrScr;

  readln(s);

  assign(f,s);

  reset(f);

  while not Eof(f) do

     begin

        readln(f,s);

        i:=i+1;

     end;

  close(f);

  readln;

End.

Program Zamen;

Uses

  Crt;

Var

  s : string;

  f, d : text;

Begin

  ClrScr;

  readln(s);

  assign(f,s);

  readln(s);

  assign(d,s);

  reset(f);

  rewrite(d);

  while not Eof(f) do

     begin

        readln(f,s);

        while Pos('o',s)>0 do

            s[Pos('o',s)]:='a';

        writeln(d,s);

     end;

  close(f);

  close(d);

  readln;

End.

Program MaxInFile;

Uses

  Crt;

Var

  i, j, r, Code : integer;

  s : string;

  f : text;

Begin

  ClrScr;

  readln(s);

  assign(f,s);

  reset(f);

  while not Eof(f) do

     begin

         readln(f,s);

         j:=0;

         for i:=1 to Length(s) do

             begin

                 Val(s[i],r,Code);

                 if r>j

                    then

                       j:=r;

              end;

           writeln(j);

      end;

  close(f);

  readln;

End.


 

А также другие работы, которые могут Вас заинтересовать

65672. Соборність та регіональний розвиток у суспільно-політичному житті незалежної України 255 KB
  Звертання до феномену соборності протягом століть супроводжувало боротьбу українців за право на створення власної держави, і сьогодні воно залишається актуальним у контексті боротьби за єдність країни й маніпуляцій політиків стосовно можливого “розколу України”.
65673. Использование формул объемного типа для нормирования расчетных характеристик весеннего половодья р.Северский Донец 766.5 KB
  Гідрологічні обґрунтування таких проектів полягають у визначенні розрахункових характеристик дощових паводків і весняних водопіль до яких відносяться максимальні витрати води шари і самі гідрографи стоку. При наявності водосховищ проточного типу великого значення набувають не лише ці параметри стоку в період...
65674. РЕГУЛЮВАННЯ ЦИКЛІЧНОСТІ РОЗВИТКУ РЕГІОНАЛЬНИХ СОЦІАЛЬНО-ЕКОНОМІЧНИХ СИСТЕМ 213.5 KB
  В сучасних умовах трансформації економіки України все більше уваги приділяється регіональному розвитку держави адже саме через наявність економічно сильних територій можна досягти позитивних зрушень в економіці країни в цілому.
65675. Формування організаційно-економічного механізму управління агропромисловими підприємствами 690.5 KB
  В результаті проведення ринкових реформ сформувалися нові, специфічні умови функціонування аграрних підприємств. Жорсткість конкурентної боротьби, насичення ринків товарами та послугами, падіння попиту та сукупність інших чинників ускладнюють діяльність підприємств...
65676. Розробка нових покриттів металевих імплантатів для покращення толерантності тканин організму до них 495 KB
  Вплив імплантатів встановлених в організм експериментальних тварин на зміну рівня холестерину Среактивного білку та факторів згортання крові. Біофізичні та біохімічні методи оцінки реакції організму і тканин після...
65677. ПСИХОЛОГІЧНИЙ СУПРОВІД ПРОФЕСІЙНОГО РОЗВИТКУ МАЙБУТНЬОГО ПСИХОЛОГА У ВИЩОМУ НАВЧАЛЬНОМУ ЗАКЛАДІ 181.5 KB
  Стрімкий розвиток українського суспільства його науковотехнічної та гуманітарної сфер ставить нові завдання перед системою вищої освіти передусім щодо зміни орієнтації професійної підготовки майбутніх фахівців з формування професійних знань та вмінь на забезпечення комфортних умов...
65678. ПОРУШЕННЯ СЛУХОВОЇ ФУНКЦІЇ ПРИ НЕФРОГЕННОМУ ОСТЕОПОРОЗІ 761 KB
  Діагностика та лікування розладів слуху залишається важливою проблемою сучасної оториноларингології. У зв’язку із великою частотою розладів слуху заходи по боротьбі із приглухуватістю Всесвітньою організацією охорони здоров'я ВООЗ включено до спеціальної програми яка направлена...
65679. ЗАКОНОМІРНОСТІ АДСОРБЦІЇ І ІНГІБУЮЧОЇ ДІЇ КАТІОНОАКТИВНИХ ПОЛІЕЛЕКТРОЛІТІВ І ЇХ АСОЦІАТІВ З АЛКІЛСУЛЬФОНАТАМИ НАТРІЮ 1.93 MB
  Рішенням цієї проблеми може бути кероване конструювання безпосередньо в розчині асоціатів водорозчинних полімерів з іоногенними поверхневоактивними речовинами ПАР так званих поліелектролітних комплексів ПЕК. Утворення ПЕК може призвести до зростання...
65680. ПРИНЦИПИ ФОРМУВАННЯ ЖИТЛОВИХ БУДИНКІВ У КОМПЛЕКСІ З ОБ’ЄКТАМИ ОБСЛУГОВУВАННЯ (НА ТЕРИТОРІЯХ, НАБЛИЖЕНИХ ДО АЕРОПОРТІВ) 5.24 MB
  У найбільших містах України особливо у таких як Київ Харків Львів Одеса Донецьк Дніпропетровськ та інші організація територій залежить від багатьох містобудівних чинників серед яких суттєвим є розташування аеропортів. Тому актуальним є використання територій наближених до аеропортів для житла в комплексі з об’єктами обслуговування.