Сайт Koder.kz сайт для Delphi программистов.

koder.kz

Web or desctop App Developer

Написать

Добавил admin | Категория Pascal за 12 уроков, перевод | 06 Февраля 2014


В этом уроке мы с вами рассмотрим:

  • Чтение из файла
  • Создание и запись в файл
  • Добавление данных в существующий файл
  • Удаление файлов
  • Использование директив {$I-}, {$I+}
  • Создание и удаление вложенных каталогов
  • Описание функции FileSize()

Введение
Файл содержит данные которые в свою очередь хранятся на жестком диске подключенному к компьютеру. Операционная система предоставляет инструменты для работы с файлами(файловой системой). Текстовые файлы как правило могут содержать текст и графическую информацию, комбинированную. Для работы с текстовыми файлами используются текстовые процессоры которые имеются в операционной системе. Текстовые файлы сохраняются на жестком диске компьютера с расшитением *.TXT или *.DOC, *.DOCX. файлы с расширением *.TXT создаются с помощью стандартного текстового процессора Notepad. Но будем помнить что некоторые программы позволяют нам сохранять так сказать отформатированный текст, или текст с картинками, для таких целей NOTEPAD естественно не подходит. Для такого текста используются специальные пакеты программ, такие например как Microsoft Word, Open Office и другие. Такие программы используют несколько иной подход для создания файла нежели NOTEPAD. Таким образом файл созданный в Microsoft Word невозможно правильно открыть в NOTEPAD, а вот файл *.TXT легко открывается в текстовом редакторе Word. Программы которые могут читать файлы расширения *.Ххх называют программами просмоторщиками файлов.
Чтение из файла
Прочитать информацию из файла на языке Паскаль не составит большого труда. Обратите внимание что в Паскале нет никаких зарезервированных слов которые используются для чтения или записи информации в файл. Для этих целей используются уже знакомые нам readln() and writeln(). И так пример, как читать информацию из файла


Program Lesson9_Program1;
Var UserFile : Text;
    FileName, TFile : String;
Begin
 Writeln('Enter the file name '+
        +'(with its full path) of the text file:');
 readln(FileName);
 {A .txt file will be assigned to a text variable}
 Assign(UserFile, FileName + '.txt'); 
 Reset(UserFile); {'Reset(x)' - means open the file x}
 Repeat
  Readln(UserFile,TFile);
  Writeln(TFile);
 Until Eof(UserFile);
 Close(UserFile);
 Readln;
End.

И так что мы с вами написали. У нас появилась новая переменная типа Text. Такая переменная применяется когда вы хотите получить доступ из своей программы к определенному текстовому файлу. Переменная FileName используется для ввода пользователем имени файла(readln(FileName);). Связь переменной UserFile с файлом, путь к которому указан в переменной FileName осуществляется с помощью функции Assign полный текст будет такой Assign(UserFile, FileName + '.txt'); после этого происходит чтение из файла в цикле Repeat который завершается только после того как достигнут конец файла Eof(UserFile). Чтение из файла производиться функцией Readln(UserFile,TFile); где указывается файл из которого нужно считать строку и переменная в которую мы считаем эту строку. Процеду Writeln(TFile); выводит эту строку к нам на экран.
Создание файла, добавление данных
Давайте сразу посмотрим пример создания и добавления информации в файл.


Program Lesson9_Program2;
Var FName, Txt : String[10];
    UserFile   : Text; 
Begin
 FName := 'Textfile';
 Assign(UserFile,'C:\'+FName+'.txt'); {assign a text file} 
 Rewrite(UserFile); {open the file 'fname' for writing}
 Writeln(UserFile,'PASCAL PROGRAMMING');
 Writeln(UserFile,'if you did not understand something,');
 Writeln(UserFile,'please send me an email to:');
 Writeln(UserFile,'victorsaliba@hotmail.com');
 Writeln(введите свою строку в ваш файл:');
 Readln(Txt);
 Writeln(UserFile,'');
 Writeln(UserFile,'The user entered this text:');
 Writeln(UserFile,Txt);
 Close(UserFile);
End.

В приведенном выше примере мы создаем файл с названием 'Textfile' на диске C:\. Создаться файл функцией Rewrite(UserFile); после чего в файл записываются строки Writeln(UserFile,'PASCAL PROGRAMMING');… Writeln(введите свою строку в ваш файл:'); тут первым параметром является файл в который записывается информация и вторым информация которую нужно добавить в файл. После чего мы считываем пользовательскую строку Readln(Txt);, добавляем пустую строку в наш файл Writeln(UserFile,'');потом говорим что сейчас будет пользовательская статья Writeln(UserFile,'The user entered this text:');, записываем пользовательскую статью Writeln(UserFile,Txt); И закрываем файл Close(UserFile);. Помните, файл всегда нужно закрывать, после окончания работы и открывать перед началом работы.
Добавление данных в существующий файл
Для того что бы добавить данные в существующий файл, его нужно открыть на чтение, добавить нужную информацию и закрыть, но не перезаписывать. Некоторые начинающие программисты на самом деле плохо понимают как не перезаписать файл с данными которые они хотели ввести, это общая проблема:


Var UFile : Text;
Begin
 Assign(UFile,'C:\ADDTEXT.TXT');
 ReWrite(UFile); 
 Writeln(UFile,'How many sentences, '+
              +'are present in this file?');
 Close(UFile);
End.

Выполните программу несколько раз, откройте файл 'C:\ADDTEXT.TXT' и посмотрите что в нем. Вы видите только одно предложение? ReWrite(UFile); функция которая открывает файл на перезапись.
Понимаете да что нам не подходит открытие файла с помощью ReWrite(UFile);, нужна какая то новая функция, и она есть это append(f) где F это переменная типа текст, ну мы с вами проходили уже это в этом же уроке. Теперь наша программа будет выглядеть так:



Var UFile : Text;
Begin
 Assign(UFile,'C:\ADDTEXT.TXT');
 Append(UFile); 
 Writeln(UFile,'How many sentences, '+
              +'are present in this file?');
 Close(UFile);
End.

Выполните программу несколько раз для того что бы увидеть изменения.
Удаление файлов
В Паскале для того что бы удалить файл используется зарезервированное слово Erase(f) где F может быть путем к файлу('C:\ADDTEXT.TXT') или самим файлом, переменной типа текст. Важным замечанием будет то что файл удаляется совсем, то есть в корзине своего компьютера вы его не найдете.
В отличии от других функций для работы с файлами функция Erase(f) не открывает файл для его удаления, так что вам не нужно закрывать файл после его удаления.
Пример программы:


Var UFile : Text; { or it could be of 'file' type}
Begin
 Assign(UFile,'C:\ADDTEXT.TXT');
 Erase (UFile); 
End.

Использование директив {$ I-}, {$ I +}
Директивы компилятора используются для настройки параметров компилятора при сборке программы, так что программисты могут контролировать свою программу. Директивы компилятора объявляются с помощью символов '{', '$' и '}'. Обратите внимание, что скобки используются для комментариев, а скобка вида, '{$ что-то}' есть ни что иное как директива. В нашем случае директива {$I} сообщает компилятору что ошибки ввода вывода при работе с файлами должны игнорироваться. То есть при возникновении ошибки программа не должна выводить ошибку и завершаться аварийно. К примеру если мы пытаемся открыть несуществующий файл, программа не вываливает нам на экран непонятную ошибку а выводит красивое сообщение – файл не найден.
Давайте теперь на небольших примерах
{$ I-}
Действия которые могут привести к ошибке
{$ I +} {отключение директивы}
Безусловно, можно включить директиву в самом начале программы и завершить с самом конце, но так делать не рекомендуется, так как ошибки в программе могут быть разные, с опытом программирования вы это поймете. И так, место где может возникнуть ошибка мы определили, предупредили об этом компилятор, что дальше? Дальше нам нужно проверить не было ли ошибки, для этого мы будем использовать системную функцию IOResult которая возвращает информацию об ошибки если она имела место быть. И так для того что бы проверить была ли ошибка нам нужно выполнить следующий код:
If (IOResult <> 0) then ...
Функцию IOResult следует явно использовать сразу после директив в противном случае функция может возвращать неверный результат. давайте теперь посмотрим мой пример:


Program Lesson9_Program3;
Uses Crt;
Var t : Text;
	  s : String;

Begin
Assign(t,'C:\ABC.DEF');
{$I-}   { disable i/o error checking }
Reset(t);
{$I+}   { enable again i/o error checking - important }
If (IOResult <> 0) then
 Begin
  Writeln('The file required to be opened is not found!');
  Readln;
 End Else 
 Begin
  readln(t,s);
  Writeln('The first line of the file reads: ',s);
  Close(t);
 End;
End.

Если наш файл не найден функция IOResult вернет значение 0 а если файл не найдет значит функция вернет отличное от нуля значение.
ВАЖНО: если файл успешно найден, файл откроется и вы должны поработав с ним закрыть его, как показано в примерах выше. А вот если он не найден то здравый смысл подсказывает что он не может быть открыт, соответственно и закрывать и работать нам не с чем. Внимательно посмотрите пример еще раз, если у вас есть какие то вопросы, пожалуйста задавайте их в комментариях. Запустите программу несколько раз, с существующими и не существующими файлами, посмотрите на результат работы.
Директивы компилятора рекомендуется использовать со всеми функциями для открытия файлов 'rewrite()', 'append()', 'erase()', а так же 'FSearch()'. Обязательно попрактикуйте этот урок, повторюсь, в случае вопросов обязательно оставляйте их в коментариях. Создание и удаление вложенных каталогов
В языке Pascal есть функции для работы с каталогами. С помощью их можно создавать или удалять каталоги с жестких дисков компьютера. Что бы создать директорию в Паскале используется функция 'createdir(c)' где С имеет тип PChar. PChar является переменной указателем, которая содержит адрес динамической переменной заданного типа. Каталог создается следующим образом:
NewDir := FSearch('C:\Pascal Programming',GetEnv('')); if NewDir = '' then CreateDir('C:\Pascal Programming');
давайте теперь пример, сразу в примере разберем функцию FSearch:


Program Lesson9_Program4;
Uses WinDos, Dos;  
{ note the inclusion of the 'windos.tpu' library }

Var NewDir : PathStr; 
{ for searching the dir and create a new one, 
if it does not exist }
		   F : Text;	

Begin
 { search for the dir }
 NewDir := FSearch('C:\Pascal Programming', GetEnv('')); 
 { create a new one, if it does not exist }
 if NewDir = '' then CreateDir('C:\Pascal Programming'); 
 Assign(F,'C:\Pascal Programming\pprogramming.txt');
 {$I+} ReWrite(F); {$I-} { disable and enable back again 
                           i/o error checking } 
 { write to text file } 
 Writeln(F,'http://pascal-programming.info/'); 
 {$I+} Close(F); {$I-}
End.

Тип переменной, 'PathStr', является новой для вас, это переменная, определенная в "dos.tpu" библиотеки. Таким образом для того что бы наш код скомпилировался нам необходимо в Uses нашей программы добавить этот модуль. Функция FSearch() реализована в модуле WINDOS поэтому он так же включен в нашу программу. Для того что бы удалить каталог нам нужно использовать функцию remove() в конце нашей программы. Ваша операционная система будет автоматически удалять каталог если он существует. Ошибки не возникнет если вы попытаетесь удалить каталог который не существует.
Описание функции FileSize()
Последний на сегодня и самый интересный материал о файлах это размер файла в байтах или функция FileSize(). Что бы вернуть размер файла нам понадобиться переменная типа LONGINT. И так смотрим пример:


Program Lesson9_Program4;
Var  f : file of byte; { file var of type byte }
    sz : longint;  { var for the size }

Begin
Assign(f,'C:\anyfile.txt');
{$I-} Reset(f); {$I+}
f (IOResult <> 0) then
 Begin     { file found? }
  Writeln('File not found.. exiting');
  Readln;
 End Else
 Begin
  { Return the file size in Kilobytes }
  sz := round(FileSize(f)/1024);
  Writeln('Size of the file in Kilobytes: ',sz,' Kb');
  Readln;
  Close(f); 
 End;
End.