Операции над файлами модуля System
Для работы с файлами определены операции:
- Установочные и завершающие.
- Перемещения по файлу.
- Ввод/вывод.
- Специальные.
Установочные и завершающие операции
Вызов | Описание |
Assign(F,Name) | Связать файловую переменную F с именем Name. |
Rewrite(F) | Открыть файл F для записи. |
Reset(F) |
Открыть файл F для чтения.
Если такого нет, то он создается заново. |
Append(F); Append – добавить. |
Процедура. Открывает текстовый файл, связанный с файловой переменной F, для добавления информации в его конец.
Маркер доступа ставится в конец файла автоматически. |
Rename(F,NewName) | Переименовать файл F на диске на NewName. |
Close(F) | Закрыть файл F. |
Erase(F) | Удалить файл F с диска. |
Операции перемещения по файлу
Вызов | Описание |
Seek(F,Pos) | Установить маркер доступа типизированного файла F в позицию Pos. |
FileSize(F) | Размер типизированного файла F в компонентах. |
FilePos(F) | Номер текущей компоненты типизированного файла F. |
Eof(F) | Проверить файл F на конец. |
SeekEoF | Установить позицию на конец текстового файла. |
EoLn(T) | Проверить строку текста T на конец. |
Операции ввода/вывода
Вызов | Описание |
Read(F,<список переменных>) | Читать из файла F в переменные. |
ReadLn(F,<список переменных>)) |
Читать из файла F в переменные.
Перейти к следующей строке. |
Write(F,<список переменных>)) | Запись переменных в файл F. |
WriteLn(F,<список переменных>)) |
Запись переменных в файл F.
Перейти к следующей строке. |
Списки ввода и вывода – имена переменных, разделенные запятыми.
Ввод/вывод в консольных приложениях
Консоль – это клавиатура и дисплей. Консольное приложение – программа для ДОС. ДОС – операционная система, которая поддерживает режим командной строки. Командная строка – набор символов, вводимых с клавиатуры. Результаты работы отображаются в виде символов на дисплее.
ДОС использует символьный интерфейс, в котором нужны символы псевдографики. Поэтому она работает с таблицей кодировки ASCII, отличающейся от кодировки ANSI в FPC. При создании консольного приложения с кириллицей в состав программы в строку uses проекта должен быть введен модуль RusTrans, содержащий подпрограмму русификации Rus. Эта подпрограмма преобразует в строках коды ANSI в коды ASCII.
При создании консольных приложений для работы с клавиатурой и дисплеем используются упрощенные версии стандартных процедур ввода/вывода. Подробно ввод/вывод рассматривается при изучении работы с файлами. Клавиатура и дисплей в FPC рассматриваются, соответственно, как файлы с именами Input и Output, которые по умолчанию считаются открытыми. В процедурах ввода/вывода при работе с консолью их имена пропускаются.
Компилятор в первой позиции списка процедуры ввода/вывода ищет имя файловой переменной. Если она не обнаружена, то в качестве имени файла выбираются Input (клавиатура) для ввода или Output (дисплей) для вывода.
Процедуры ввода с клавиатуры
Процедура
read(b1,b2,.. bn); // read – читать, b1, b2, … bn – переменные
осуществляет ввод численных данных с клавиатуры, в результате которого переменные b1, b2, … bn получают значения. Данные при вводе разделяются пробелом или нажатием клавиши <Enter>.
Процедура
readln(b1,.. bn);
выполняет то же самое, но операция завершается переходом к следующей строке программы даже, если число введенных данных меньше, чем в списке ввода.
Процедура
readln;
осуществляет пропуск одной строки при чтении. Употребляется для создания паузы до нажатия клавиши <Enter>.
Процедуры вывода на дисплей
Процедура
write(Exp1, Exp2, … ExpN); // write – писать, Exp1… ExpN> – выражения
выводит данные в соответствии со списком переменных и/или констант b1, b2, … bn. Данные выводятся в строку и разделяются пробелом. Следующий вывод будет продолжен в этой же строке.
Процедура
writeln(OutExp1, OutExp2, … OutExpN);
выполняет то же самое, но по завершении процедуры осуществляется переход к следующей строке.
Процедура
writeln;
осуществляет пропуск одной строки при выводе для выразительности.
БНФ для выражения вывода:
OutExp::=Name[:MinWidth[:DecPlaces]]
- Name – имя величины,
- MinWidth – минимальное число позиций всего, включая знак числа и десятичную точку,
- DecPlaces – число позиций под дробную часть, требует задания MinWidth.
Специальные операции
Вызов | Описание |
SetTextBuf(F, Buffer [, Size]); | Назначает текстовый буфер Buffer размером Size для текстового файла F. Если Size пропущен, то он принимается по умолчанию 128 байт. |
BlockRead(F,Buf,Count,Res) |
Читать из нетипизированного файла F в буфер Buf Count записей.
Res – число фактических записей. |
BlockWrite |
Писать из буфера Buf в нетипизированный файл F Count записей.
Res – число фактических записей. |
Текстовые файлы в модуле System
Типичный режим – последовательный построчный доступ. Посимвольный доступ невозможен. Выбор строки с заданным номером можно организовать программно. Пример программы, которая создает текстовый файл, заносит в него список строк, сохраняет его. Затем файл открывается для дополнения и в его конец заносятся новые строки в строки с клавиатуры. После каждой из этих операций файл открывается для проверки итогов.
program TextFile;
{$mode objfpc}{$H+}
uses
Classes, SysUtils, RusTrans;
const
FileDir=’m:\Lazarus_examples\08_1\’;
var
MyFile: text; // Файловая переменная
FilePath,FileName,Temp: string; // Переменные для строк
i,imax: integer;
label
Exit;
begin
writeln(Rus(‘Введите имя файла’));
readln(FileName);
writeln;
FilePath:=FileDir+FileName; // Путь к файлу
AssignFile(MyFile,FilePath); // Связь файлом на диске
{$I-} // Отключить контроль ошибок
Rewrite(MyFile); // Создать новый файл
{$I+}; // Включить контроль ошибок
if IOResult = 0 // Проверить ошибку открытия файла
then writeln(Rus(‘Спасибо’))
else
begin
writeln(Rus(‘Ошибка’));
readln;
goto Exit // Выход при ошибке
end;
writeln;
imax:=5;
writeln(Rus(‘Введите ‘),imax,Rus(‘ строк’));
for i:=1 to imax do // Повторять imax раз
begin
write(Rus(‘Строка ‘),i,’ = ‘);
readln(Temp); // Чтение строки с клавиатуры
writeln(MyFile,Temp); // Запись этой строки в файл
end;
CloseFile(MyFile); // Закрыть файл
Reset(MyFile); // Открыть его для проверки
i:=1;
writeln;
writeln(Rus(‘Содержимое файла’));
writeln;
while not EOF(MyFile) do // Повторять до конца файла
begin
readln(MyFile,Temp); // Чтение строки из файла
writeln(Rus(‘Строка ‘),i,’ = ‘,Temp); // Вывод строки на дисплей
i:=i+1
end;
writeln;
CloseFile(MyFile); // Закрыть файл
{$I-} // Отключить контроль ошибок
Append(MyFile); // Открыть файл для добавления строк
{$I+}; // Включить контроль ошибок
if IOResult = 0 // Проверить ошибку открытия файла
then writeln(‘OK’)
else
begin
writeln(Rus(‘Ошибка’));
readln;
goto Exit // Выход при ошибке
end;
writeln;
writeln(Rus(‘Введите ‘),imax,Rus(‘ строк’));
for i:=imax+1 to imax*2 do // Повторять imax раз
begin
write(Rus(‘Строка ‘),i,’ = ‘);
readln(Temp); // Чтение строки с клавиатуры
Writeln(MyFile,Temp) // Запись этой строки в файл
end;
CloseFile(MyFile); // Закрыть файл
Reset(MyFile); // Открыть его для проверки
i:=1;
writeln;
writeln(Rus(‘Содержимое файла’));
writeln;
while not EOF(MyFile) do // Повторять до конца файла
begin
readln(MyFile,Temp); // Чтение строки из файла
writeln(Rus(‘Строка ‘),i,’ = ‘,Temp); // Вывод строки на дисплей
i:=i+1
end;
writeln;
writeln(‘OK’);
readln;
CloseFile(MyFile); // Закрыть файл
Exit:;
end.
Типизированные файлы в модуле System
Пример программы произвольного доступа к компонентам файла. Программа заносит в файл последовательно целые числа со значениями от N1 до N2. После этого компоненты файла отображаются.
program ProizDostup;
{$mode objfpc}{$H+}
uses
Classes, SysUtils, RusTrans;
const
FileDir=’h:\Lazarus_examples\Для УП\ProizDostup’;
var
MyFile: File of integer; // Файловая переменная
FilePath, FileName: string;
N1,N2,i,imax,Temp: integer;
begin
FileName:=’ProizDostup’;
FilePath:=FileDir+FileName;
AssignFile(MyFile,FilePath); // Связь с файлом на диске
Rewrite(MyFile); // Создать новый файл
writeln;
writeln(Rus(‘Введите N1, N2′));
readln(N1,N2);
writeln;
imax:=N2-N1;
for i:=0 to imax do
begin
Temp:=N1+i;
write(MyFile,Temp) // В файл значение номер i
end;
CloseFile(MyFile);
Reset(MyFile); // Открыть файл для проверки
writeln(Rus(‘Компоненты файла’));
for i:=0 to imax do // Цикл чтения
begin
Seek(MyFile,i); // Установить текущий указатель файла i
read(MyFile,Temp); // Читать элемент
writeln(Rus(‘Компонент ‘),i,’ = ‘,Temp);// Вывести его на дисплей
end;
CloseFile(MyFile); // Закрыть файл
writeln;
writeln(‘OK’);
readln;
end.
Нетипизированные файлы в модуле System
Программа с высокой скоростью копирует файл-источник в файл-приемник, после чего удаляет первый.
program FileCopy;
{$mode objfpc}{$H+}
uses SysUtils, RusTrans; // Ссылка на модули
var
InFile,OutFile: file; // Файловые переменные
Buf:array[1..512] of byte; // Буфер в 512 байт.
begin
AssignFile(InFile,’a:\File1’); // Связь с переменной файл-источник
AssignFile(OutFile,’c:\File2’); // Связь с переменной файл-приемник
reset(InFile,512); // Открыть файл-источник
rewrite(OutFile,512); // Создать файл-приемник
while not EOF(InFile) do // Повторять до конца файла-источника
begin
BlockRead(InFile,Buf,1); // Читать блок из InFile в буфер
BlockWrite(OutFile,Buf,1); // Писать блок из буфера в OutFile
end;
CloseFile(OutFile); // Закрыть файл-приемник
erase(InFile); // Удалить файл-источник
end.
При работе с диском размер буфера лучше брать кратным размеру сектора. В нашем примере размер записи принят по умолчанию (128 байт). Кратность есть.