File (516215), страница 6
Текст из файла (страница 6)
p: word; { номер страницы}
name: string[20]; { имя файла для распечатки }
const bel=#7; { звуковой сигнал }
ff=#12; { прогон страницы }
begin
writeln(' введите имя файла ');
readln(name);
if name <> ' ' then
begin
assign(f,name);
{$I-} reset(f);{$I+}
if ioresult = 0 then
begin
i:=1;
p:=1;
repeat
if i mod 50 = 0 then
begin
writeln(lst,ff);
write(bel,' страница ',p:3,' закончилась, продолжить Y/N ? ',bel);
readln(c);
if upcase(c) <> 'Y' then
begin
close(f);
halt
end;
inc(p);
for i:=1 to 35 do write(lst,' ');
writeln(lst,'-',p:2,' -');
writeln(lst);i:=1
end;
readln(f,s);
writeln(lst,s);
inc(i);
until eof(f);
writeln(lst,ff);
close(f)
end
else
begin
writeln(' файл с именем ',name,' не существует ');
halt
end;
end
else
begin
writeln(' значение name равно пробелу ');
halt
end;
end.
Следует отметить, что между текстовым и символьным типизированным файлами существует некоторая схожесть, что позволяет обрабатывать текстовый файл как символьный. В этом случае необходимо учитывать, что символ конца строки текстового файла рассматривается в символьном как обычный символ. При его считывании,, следующий за ним символ перевода каретки не анализируется, но для правильной обработки и перехода на новую строку его необходимо считать принудительно.
-
Пример 2-14. Обработка текстового файла как символьного.
{ программа формирует строки переменной длины и записывает их в текстовый файл}
Program form_text_file;
type ff=TEXT; {новый тип - текстовый файл }
var
f1:ff; {файловая переменная типа текстовый файл }
a:char;
n,i:integer;
fname,st:string[30];
Begin
writeln('введите имя файла');
readln(fname);
Assign(f1,fname);
rewrite(f1);
randomize;
for a:='A' to 'Z' do
begin {формирование строки случайным количеством букв}
st:='';
n:=random(30)+1;
for i:=1 to n do
st:=st+a;
writeln(f1,st); { записать сформированной строки в текстовый файл}
writeln(st);
end;
close(f1);
end.
{программа открывает сформированный в программе текстовый файл как типизированный типа char и читает его по символу. При этом символ конца строки, воспринимаемый как обычная компонента обрабатывается не стандартно }
Program char_frorm_text_file;
type ff=file of char; {новый тип - символьный файл }
var
f1:ff; {файловая переменная типа файл символов}
a:char;
n,i:integer;
fname,st:string[30];
Begin
writeln('введите имя файла');
readln(fname);
Assign(f1,fname);
reset(f1); {открыть текстовый файл как типизированный на чтение}
while not eof(f1) do { пока не конец файла}
begin
read(f1,a); {читать символ}
st:='';
while (ord(a)<>13) and not eof(f1) do
{до конца строки или до конца файла}
begin
st:=st+a; {добавлять считанный символ в выходную строку}
read(f1,a); { читать очередной символ}
end;
if not eof(f1) then read(f1,a); { если конец строки - читать символ конца строки}
writeln(st); {печатать сформированную строку}
end;
close(f1);
end.
2.4.3.Нетипизированные файлы.
Нетипизированными называются файлы, объявленные без указания типа его компонент. Считывание и запись в такие файлы осуществляется блоками байтов. Отсутствие типа делает эти файлы совместимыми с любыми другими файлами, а обмен блоками позволяет организовать высокоскоростной обмен данными между диском и памятью. Следует отметить, что нетипизированные файлы, как и типизированные являются файлами прямого доступа.
Определить файл можно двумя способами:
1. предварительно ввести новый тип - файл без указания типа компонент, а затем определить файловую переменную этого типа, например
TYPE <имя типа> = FILE;
VAR <файловая переменная >: <имя типа>;
2. сразу определить файловую переменную как файл без определенного типа, например
VAR <файловая переменная >: FILE;
Нетипизированный файл можно открыть на запись и чтение с использованием процедур RESET и REWRITE. При инициализации нетипизированного файла этими процедурами можно указать длину записи файла в байтах вторым параметром. В качестве этого параметра можно использовать выражение типа WORD. Если длина записи не указана, она принимается равной 128 байтам.
RESET (<файловая переменная>,<длина записи>);
REWRITE.(< файловая переменная >,<длина записи>);
<длина записи> - выражение типа WORD.
Borland Pascal не накладывает каких либо ограничений на длину записи нетипизированного файла, за исключением требования положительности и ограничения максимальной длины - 65535 байт ( емкость целого типа WORD ). Однако для обеспечения максимальной скорости обмена данными следует задавать длину, которая была бы кратна длине физического сектора дискового носителя информации (512 байт ). Например:
Кроме того, фактическое пространство на диске выделяется любому файлу порциями - кластерами, которые в зависимости от типа диска могут занимать 2 или более смежных сектора. Для гибких дискет длина кластера равна двум секторам ( 1024 байт ), для жестких дисков емкостью от 10 до 32 Мбайт - 4 или 8 смежных сектора (2048 или 4096 байт). Кластер может быть записан или прочитан за один оборот диска, поэтому наивысшую скорость обмена данными можно получить, если указать длину записи равной длине кластера.
При работе с нетипизиролванными файлами можно использовать все процедуры и функции, доступные типизированным файлам, за исключением процедур READ и WRITE. Эти процедуры заменяются высокоскоростными процедурами BLOCKREAD и BLOCKWRITE.
-
Процедура BLOCKREAD(<файловая переменная>,<буфер>,<N>[,<NN>]) - осуществляет считывание блока из файла.
<буфер> - буфер - имя переменной, которая будет участвовать в обмене данными, должна быть достаточна для размещения N записей с указанной в процедуре RESE;
<N> - количество записей, которые должны быть прочитаны за одно обращение к диску;
<NN> - необязательный параметр, содержащий количество фактически обработанных записей.
-
Процедура BLOCKWRITE (<файловая переменная>,<буфер>,<N>[,<NN>]) - осуществляет запись блока из файла.
<буфер> - буфер - имя переменной, которая будет участвовать в обмене данными, должна быть достаточна для размещения N записей с указанной в процедуре REWRITE;
<N> - количество записей, которые должны быть записаны за одно обращение к дискую
Файловая переменная должна быть объявлена как нетипизированный файл и связана с дисковым файлом процедурой ASSIGN. Файл же необходимо открыть на запись или чтение соответствующими процедурами.
-
Пример 2-15. Ускоренное копирование файла.
{ программа копирования нетипизированных файлов}
program copir;
const recs=1024;
var fi,fo:file;{ нетипизированный файл }
buf : array [1..recs] of byte;
i:word;
namein,nameout: string;
begin
writeln(' введите имя файла - источника ');
readln(namein); { имя файла источника }
assign(fi,namein);
{$I-} reset(fi);{$I+} {открыть файл на чтение длина записи по умолчанию =128 б.}
{ проверка наличия файла с указанным именем }
if ioresult <> 0 then
begin
writeln(#7,' нет файла с именем ',namein);
halt
end;
writeln(' введите имя файла - приемника ');
readln(nameout); { имя файла копии }
assign(fo,nameout);
rewrite(fo); {открыть файл на запись длина записи по умолчанию =128 б.}
while not eof(fi) do
begin
blockread(fi,buf,1,i); {читать блок из входного файла в память}
blockwrite(fo,buf,1); {писать из памяти блок в выходной файл }
end;
close(fi);
close(fo)
end.
ОГЛАВЛЕНИЕ
1. Файловая система MS DOS (организация хранения информации на внешних носителях).
2. Файловая система Borland Pascal .
2.1. Общие сведения.
2.2. Стандартные процедуры и функции для работы с файлами.
2.3. Процедуры и функции из библиотеки DOS для работы с файлами
2.4. Операции ввода - вывода Borland Pascal для работы с файлами различной внутренней структуры
2.4.1. Типизированные файлы.
2.4.2. Текстовые файлы.
2.4.3. Нетипизированные файлы.
ПРИЛОЖЕНИЕ 1
Коды некоторых ошибок ввода-вывода.
$00 - ошибка отсутствует.
$02 - файл не найден. Возникает после выполнения процедур RESET, REWRITE, APPEND, RENAME, ERASE, если имя, назначенное файловой переменной, не задает существующий файл.
$03 - путь не найден. Возникает после выполнения процедур RESET, REWRITE, APPEND, RENAME, ERASE, если имя, назначенное файловой переменной, неправильное или задает несуществующую директорию.
$04 - слишком много открытых файлов. Возникает после выполнения процедур RESET, REWRITE, APPEND, если программа имеет слишком много файлов.
$05 - запрещен доступ к файлу. Возникает после выполнения процедуры APPEND, если имя, назначенное файловой переменной, задает фай, предназначенный только для чтения.
$0C - недействительный код доступа к файлу. Возникает после выполнения процедур RESET или APPEND, если значение параметра FILEMODE в файловой переменной не является допустимым.
$0F - неправильный номер дисковода. Возникает после выполнения процедуры GETDIR, если номер дисковода не является допустимым.
$10 - нельзя удалить текущий каталог. Возникает после выполнения процедуры RMDIR, если путь указывает текущий каталог.
$11 - нельзя при переименовании указывать разные дисководы. Возникает после выполнения процедуры RENAME, если оба файла не находятся на одном и том же диске.
$64 - ошибка чтения с диска. Возникает после выполнения процедуры READ для типизированных файлов, если делается попытка чтения после достижения конца файлов.
$65 - ошибка записи на диск. Возникает после выполнения процедур CLOSE, WRITE, WRITELN, FLUSH или BLOCKWRITE, если диск переполнен
$66 - файл не назначен. Возникает после выполнения процедур RESET, REWRITE, APPEND, RENAME, ERASE, если файловой переменной не было присвоено имя с помощью обращения к процедуре ASSIGN.
$67 - файл не открыт. Возникает после выполнения процедур CLOSE, READ, WRITE, SEEK, EOF, FILEPOS, FILESIZE, FLUSH, BLOCKREAD, BLOCKWRITE, если файл не открыт.
$68 - файл не открыт для ввода. Возникает после выполнения процедур READ, READLN, EOF, EOLN, SEEKEOF или SEEKEOLN в текстовом файле, если файл не открыт для ввода.
$69 - файл не открыт для вывода. Возникает после выполнения процедур WRITE или WRITELN в текстовом файле, если файл не открыт для вывода.
$6A - неправильный числовой формат. Возникает после выполнения процедур READ, или READLN если числовое значение, считанное из текстового файла, не соответствует правильному числовому формату.
$96 - защита диска от записи. Возникает при попытке создания файла на защищенном диске или при попытке записи в файл, находящийся на защищенном диске.$98 - дисковод не готов. Возникает при попытке создания файла, либо считывания из файла с дисковода без дискеты, или с отключенного диска.
$98 - дисковод не готов. Возникает при попытке создания файла, либо считывания из файла с дисковода без дискеты или с отключенного дисковода.