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



О проекте


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


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

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

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

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.

Задачи для самостоятельной работы:

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


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


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


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


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