уважаемые посетители блога, если Вам понравилась, то, пожалуйста, помогите автору с лечением. Подробности тут.

Текст задания звучит следующим образом: вывести на экран текст из файла text.txt. Это задание базируется на выполнении предыдущего — запись текста в файл. Вывод текста из файла на экран в Pascal/Delphi осуществляется с помощью двух процедур: readln() и writeln(). Рассмотрим подробное решение этой задачи. Лабораторная работа выполняется в Delphi 10.3 Rio.

Анализ задачи

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

  1. Получить доступ к файлу
  2. Считывать из файла строки до тех пор, пока не будет достигнут конец файла
  3. Закрыть файл

Решение задачи

Создаем новое консольное приложение в Delphi. Как это сделать — смотри в предыдущей лабораторной работе.

Пишем следующий код:

program ReadTextFile;
 
{$APPTYPE CONSOLE}
 
{$R *.res}
 
uses
  System.SysUtils;
 
var F: TextFile;
    s: string;
begin
  AssignFile(F,'text.txt');
  Reset(F);
  while not Eof(F) do
    begin
      readln(F,s);
      Writeln(s);
    end;
  CloseFile(F);
  readln;
end.

Рассмотрим алгоритм решения этой задачи подробно:

1. Определяем переменные в разделе var

F: TextFile;

– это файловая переменная для работы с текстовым файлом

s: string;

– это переменная для хранения строки, полученной из текстового файла в delphi

2. Ассоциируем файловую переменную с внешним файлом на диске:

AssignFile(F, 'text.txt');

Более подробно об этой процедуре – см. здесь.

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

Reset(F);

Для открытия текстового файла в Pascal/Delphi могут использоваться три метода – Rewrite, Reset и Append. Однако, так как в тексте задачи указано, что необходимо читать данные из файла, то мы используем метод Reset(), который открывает файл, ассоциированный с переменной F для чтения/записи, не создавая заново и не затирая данные.

4. В цикле с предусловием while..do считываем строки из файла и выводим их на экран:

  while not Eof(F) do
    begin
      readln(F,s);
      Writeln(s);
    end;

Для условия выхода из цикла мы использовали метод Eof():

while not Eof(F)

Метод Eof() возвращает True (истину), если достигнут конец файл. Таким образом, наше условие выхода из цикла читается как «пока не достигнут конец файла«.

Цикл с постусловием repeat..until в этой задаче лучше не использовать, несмотря на то, что программа не выдаст при этом никаких ошибок. Дело в том, что, если использовать цикл с постусловием, то программа хотя бы один раз попытается считать строку из файла и, если файл окажется пустым, то на экран будет выведена пустая строка — программа сработает «вхолостую».

5. Закрываем файл и ожидаем пока пользователь не нажмет Enter:

  CloseFile(F);
  readln;

Улучшение программы

Несмотря на то, что программа будет работать, в представленном выше коде есть несколько «тонких» мест. Во-первых, это использование строковой константы (имени файла) непосредственно в коде программы, чего необходимо избегать, так как затрудняется внесение изменений в код программы, если таких констант у вас будет много. Во-вторых, если при запуске программы рядом с exe-файлом не будет обнаружен файл text.txt, то программа вызовет исключение при попытке открыть файл методом reset(). Текст ошибки при этом будет следующим:

—————————
Debugger Exception Notification
—————————
Project ReadTextFile.exe raised exception class EInOutError with message ‘File not found’.
—————————
Break Continue Help
—————————

Улучшим код нашей программы следующим образом:

program ReadTextFile;
 
{$APPTYPE CONSOLE}
 
{$R *.res}
 
 
uses
  System.SysUtils;
 
const
  cFileName = 'text.txt';
  сFileNotFound = 'Файл %s не найден!';
 
var
  F: TextFile;
  s: string;
 
begin
  if FileExists(cFileName) then
  begin
    AssignFile(F, cFileName);
    Reset(F);
    while not Eof(F) do
    begin
      readln(F, s);
      Writeln(s);
    end;
    CloseFile(F);
  end
  else
    Write(Format(сFileNotFound,[cFileName]));
  readln;
end.

В этом коде мы вынесли все строковые константы в секцию const, а в самом коде программы добавили условие:

  if FileExists(cFileName) then
  begin
    //здесь происходит чтение файла
  end
  else
    Write(Format(сFileNotFound,[cFileName]));

Функция FileExists() проверяет наличие файла на диске и возвращает True, если файл найден.

Функция Format() форматирует строку. В качестве первого аргумента этой функции выступает константа сFileNotFound, содержащая символ форматирования %s, который заменяется, в нашем случае, на имя файла (см. второй аргумент функции).

Таким образом, если рядом с exe-файлом не будет обнаружено необходимого файла, то вместо ошибки будет выведено следующее сообщение:

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

Файлы для загрузки

Скачать файлы лабораторной работы вы можете со страницы исходников:

0 0 голоса
Рейтинг статьи
уважаемые посетители блога, если Вам понравилась, то, пожалуйста, помогите автору с лечением. Подробности тут.
Подписаться
Уведомить о
0 Комментарий
Межтекстовые Отзывы
Посмотреть все комментарии