Текст задания звучит следующим образом: вывести на экран текст из файла text.txt. Это задание базируется на выполнении предыдущего — запись текста в файл. Вывод текста из файла на экран в Pascal/Delphi осуществляется с помощью двух процедур: readln() и writeln(). Рассмотрим подробное решение этой задачи. Лабораторная работа выполняется в Delphi 10.3 Rio.
Анализ задачи
На данном этапе предполагается, что у нас имеется файл text.txt, который содержит некоторое количество строк текста или же файл пуст. Наша задача сводится к следующим шагам:
- Получить доступ к файлу
- Считывать из файла строки до тех пор, пока не будет достигнут конец файла
- Закрыть файл
Решение задачи
Создаем новое консольное приложение в 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-файлом не будет обнаружено необходимого файла, то вместо ошибки будет выведено следующее сообщение:
Подобное улучшение кода делает программу более гибкой к изменению и позволяет избежать лишних проблем в случае, если файл не будет найден.
Файлы для загрузки
Скачать файлы лабораторной работы вы можете со страницы исходников: