Delphi 7. Занятие 1_10.
Перейти к «Краткая справочная информация о работе с ТЕКСТОВЫМ файлом.»
Перейти к «Краткая справочная информация о работе с ТИПИЗИРОВАННЫМ файлом.»
Перейти к «Краткая справочная информация о работе с НЕТИПИЗИРОВАННЫМ файлом.»
Перейти к «Краткая справочная информация о работе с ОБЪЕКТНОЙ МОДЕЛЬЮ обращения к файлу.»
Содержание
- 1 Сохранение результатов разработки программы.
- 2 Сохранение результатов расчётов.
- 3 Файл для хранения текста.
- 4 Запись в текстовый файл.
- 5 Чтение из текстового файла.
- 6 Цикл чтения строк из текстового файла.
- 7 Видео. Создаём форму для будущей программы.
- 8 Видео. Настраиваем свойства компонентов.
- 9 Видео. Создаём обработчики событий для записи и чтения данных из файла.
- 10 Видео. Дописываем данные в конец файла.
Сохранение результатов разработки программы.
Создавая текст программы, в процессе работы над ней и по окончанию её мы сохраняем на диск проект и все модули. Выбрав «Save All … » в меню «File» мы автоматически сохраняем все файлы проекта.
Выбрав «Save», сохраняем текущий модуль. «Save As …» позволяет переименовать модуль и вместо стандартного имени Unit1 задать более осмысленное имя, состоящее из латинских букв, цифр и знака подчёркивания.
«Save Project As …» позволяет задать имя всему проекту, отличное от project1.
«Close» закрывает активную вкладку.
Но всё это касается файлов самого проекта.
А как быть, если надо сохранить данные, полученные в ходе работы программы? Это могут быть числа, текст, массив, запись (о типе данных запись поговорим позднее), отдельный символ (тип данных char).
Это могут быть просто цепочки байт, описывающих, например, изображение. В этом случае говорят, что записываются блоки памяти.
Разберёмся, как это делается.
Сохранение результатов расчётов.
В файле, как и в оперативной памяти, данные хранятся в виде нулей и единиц.
При записи какого-либо типа данных они превращаются в двоичный поток и записываются на диск.
При чтении с диска происходит обратный процесс. Благодаря тому, что известен тип записанных на диск данных, двоичный поток преобразуется в конкретный тип данных.
Предположим, мы прочитали с диска последовательные 32 бита (4 байта). Если файл описан как файл целого типа, то эти 4 байта будут интерпретированы как целое число.
Если файл хранит короткие строки (пример: type sh=char[20], то есть короткая строка — это массив символов. В короткой строке не может быть больше 255 символов),то байты будут интерпретированы как 4 символа.
То есть интерпретация содержимого, записанного на диск, зависит от описанного в программе типа файла.
Файл для хранения текста.
В delphi работа с файлами несколько различается в зависимости от того, надо ли записывать в файл произвольный текст, или это будет последовательность однотипных данных.
С текстовыми файлами мы сталкиваемся, например, создавая документ в программе «блокнот».
Для работы с текстовым файлом объявляется переменная:
var vMyTextFile:TextFile;
где TextFile – предопределённый тип файла.
Далее переменная связывается или с создаваемым на диске, или с существующим файлом. Например, мы хотим создать файл «D:\MyFile.txt».
Введём промежуточную переменную var s:string; и s:=»D:\MyFile.txt»; .
Свяжем переменную vMyTextFile c именем файла с помощью процедуры:
AssignFile(vMyTextFile, s);
Теперь, когда мы употребим переменную vMyTextFile в операторах чтения или записи, поток данных будет направлен в «D:\MyFile.txt».
Создадим файл процедурой:
Rewrite( vMyTextFile);
Если посмотреть в проводнике, то мы обнаружим наш файл «D:\MyFile.txt» с нулевой длиной.
Осталось заполнить его данными.
Замечание.
Если файл с таким именем и путём доступа уже существует на диске, то он будет уничтожен и создан заново с пустым содержанием.
Запись в текстовый файл.
Рассмотрим, как осуществляется в delphi запись в файл.
Чтобы текст правильно читался из файла, необходимо, чтобы он был разбит на предложения.
Это достигается записью в конце каждого предложения специального знака #10 (#10 — это код символа в таблице символов. В текстах описаний обозначается как EOL — End Of Line. О кодировке символов и таблице символов разговор будет в дальнейшем).
Запись такого символа происходит автоматически, если использовать процедуру:
WriteLn( vMyTextFile, s1 [, … , si, … , sn]); , где si — строковая переменная.
Квадратные скобки обозначают, что указанные в них выражения могут присутствовать, а могут и не присутствовать в процедуре. Эти скобки употребляются при описании операторов в общем виде и не должны присутствовать в реальном тексте программы.
Если переменных s несколько, то их последовательность воспринимается как одна строка, в конце которой записывается символ #10 . То есть каждый раз, применяя процедуру WriteLn, мы формируем одну строку.
Замечание.
Не используйте процедуру Write вместо WriteLn, иначе получите в файле «кашу» или ошибку записи!
Чтобы при чтении текстового файла было понятно, что все записи закончились, в конце последней записи кроме знака конца строки ставят специальный знак конца файла — #26.
Далее мы можем завершить работу с файлом, или переоткрыть его для чтения.
Если, прочитав из файла несколько значений, возникает необходимость дописать строки в конец файла, то его надо переоткрыть процедурой Append(unit1.vFile).
Замечание.
К сожалению, текстовый файл нельзя исправлять напрямую. Нельзя, например, переписать вторую строку.
Для внесения изменений надо прочитать весь файл, отобразить его в каком либо компоненте, например memo, отредактировать, заново пересоздать файл и перезаписать текст из memo в файл.
Завершение работы с файлом закрывает файл. С практической точки зрения это означает, что к файлу больше нельзя обратиться процедурами записи или чтения. С другой стороны, теперь файл доступен для удаления и редактирования средствами файловой системы, например, с помощью «блокнота».
Замечание. Закрытие программы автоматически закрывает все открытые файлы. Управлять файлами (например удалить, переименовать и так далее) можно из программы, используя предназначенные для этого процедуры и функции (об этом разговор будет позже).
Чтение из текстового файла.
Чтобы организовать в delphi чтение из файла, его надо предварительно открыть процедурой Reset.
Эта процедура устанавливает внутренний указатель файла на нулевую запись.
Открытие файла осуществляется через файловую переменную: Reset(vMyTextFile).
Далее производится считывание записей от нулевой до последней оператором ReadLn( vMyTextFile, s1); , помещённым в цикл.
(Оператор ReadLn( vMyTextFile, s1 [, … , si, … , sn]) нет смысла использовать в таком виде, так как всё рано считывается ровно одна запись. То есть значение будет занесено только в s1, остальные переменные будут пустыми.).
Поэтому достаточно записать ( vMyTextFile, s1); и использовать этот оператор в цикле, отслеживая значение функции признака конца файла EOF(vMyTextFile).
При чтении последней записи из файла эта функция возвращает значение «true» — истина (служебное слово — предопределённая логическая константа. О логических константах и переменных и о том, как ими пользоваться, речь будет в дальнейшем. Другое возможное значение: «false» — ложь).
Замечание.
Использование «пустой» процедуры чтения в виде ReadLn( vMyTextFile) осуществляет переход к следующей записи.
Пример программы работы с текстовым файлом рассмотрен в видеоматериале.
Цикл чтения строк из текстового файла.
Так как с помощью процедуры ReadLn() можно прочитать только одну строку, то необходимо организовать цикл чтения строк из файла.
Он будет длиться до тех пор, пока не будет достигнут символ конца файла EOF.
Ранее мы уже рассматривали организацию цикла с помощью оператора for.
Но для его использования мы должны точно знать число его повторений. Для текстового файла это проблематично, поэтому удобней использовать цикл с так называемым пост условием:
repeat
«выполняемые операторы»
until условие
Если «условие» вырабатывает (возвращает) значение false, то цикл продолжается, если true — то завершается.
Или в нашем случае:
repeat
ReadLn(vMyTextFile,s);
Form1.Memo1.Lines.Append(s);
until EOF(vMyTextFile)
Войдя в цикл, выполняются находящиеся в нём операторы. Далее проверяется условие, находящееся в операторе until. Когдафункция EOF() вернётtrue(будет достигнут конец файла), цикл завершится и будет выполнен следующий за ним оператор.
Для примера напишем программу, на главной форме которой разместим новый компонент Panel, предназначенный для группировки на нём других компонент.
Видео. Создаём форму для будущей программы.
Видео. Настраиваем свойства компонентов.
Видео. Создаём обработчики событий для записи и чтения данных из файла.
Видео. Дописываем данные в конец файла.
Обратите внимание. При работе с файлом мы нигде не проверяли, существует ли файл на диске. Если попытаться открыть несуществующий файл, то произойдёт исключительная ситуация, будет выведено сообщение об ошибке и выполнение программы прервётся. Чтобы избежать прерывание программы при возникновении системной ошибки, применяют программную обработку таких прерываний. Об обработке исключительных ситуаций речь будет в дальнейшем.
Заключение.
Рассмотрено понятие «текстовый файл», организация данных внутри файла, дано понятие конца записи и конца файла. Даны операторы создания файловой переменной и её связывания с конкретным файлом, а также операторы записи в него строковой информации и закрытия файла.
Для чтения/записи текстовый файл надо открыть, при этом указатель установится на нулевую запись.
Оператор чтения строки считывает ровно одну запись. Весь текст считывается путём организации цикла.
Глоссарий.
- Компонент Panel.
- Текстовый файл.
- Файловая переменная.
- AssignFile(vMyTextFile, s): связывание файловой переменной с именем файла.
- Rewrite( vMyTextFile): создание (пересоздание) файла.
- EOL: признак конца строки.
- EOF: признак конца файла.
- WriteLn( vMyTextFile, s1) процедура записи строки s1 в файл.
- Reset(vMyTextFile): открыть файл (переустановить в 0 позицию).
- ReadLn( vMyTextFile, s1): читать текущую строку.
- ReadLn( vMyTextFile) пропустить строку.
- Цикл с постусловием (есть ещё цикл с предусловием) repeat … until.
- flush(unit1.vFile); вытолкнуть значения из буфера файла программы.
- Append(unit1.vFile) открыть файл для записи в конец (установить указатель файла после последней строки).
- Исключительная ситуация.