Операции над файлами модуля 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 байт). Кратность есть.

TwitterSEO CommunityВаау!News2.ruChippKoricaSMI2Google BookmarksDiggI.uaЗакладки YandexLinkstoreMyscoopCommunizmRu-marksWebmarksRuspaceLinkomaticKli.kzWeb-zakladkaZakladok.netRedditdeliciousMa.gnoliaTechnoratiSlashdotYahoo My WebБобрДобр.ruMemori.rurucity.comМоёМесто.ruMister Wong

Copyright © 2009-2010 Программирование на паскале.