
- •Оглавление
- •Лекция №24 Файлы. Файловые переменные
- •Var Fx: File Of char;
- •X: char; I: Byte;
- •Var Fx: File Of char;
- •X: char;
- •Стандартные процедуры и функции обработки файлов
- •Текстовые файлы
- •Var f1,f2: text;
- •Var Note: Text; к: Integer;
- •Var Note: Text;
- •Файлы без типа (нетипизированные файлы)
- •Var fromf, tof: file;
- •Var f: File; I: Byte; Rec: r; Result: Word;
- •Var f: File;
- •I: Integer;
- •Var I: Byte;
- •Var b: Byte;
- •Контрольные вопросы
- •Задание
Var fromf, tof: file;
NR, NWR: WORD;
NAME:STRING[12];
BUF: ARRAY[1..2048] OF CHAR;
BEGIN
WRITE(‘ИМЯ ВХОДНОГО ФАЙЛА ’);
READLN(NAME);
ASSIGN(FROMF, NAME);
WRITE(‘ИМЯ ВЫХОДНОГО ФАЙЛА ’);
READLN(NAME);
ASSIGN(TOF,NAME);
RESET(FROMF, 1); {существующий файл}
REWRITE(TOF, 1);{новый файл}
REPEAT
BLOCKREAD(FROMF, BUF, SIZEOF(BUF), NR);
BLOCKWRITE(TOF, BUF, NR, NWR);
UNTIL (NR = 0) OR (NWR <> NR);
CLOSE(FROMF);
CLOSE(TOF);
END.
В примере программы при открытии файла без типа в вызове процедуры RESET указана длина записи равная 1. В этом случае при копировании файла не будут записаны лишние символы в новый файл.
Пример 8. Допустим имеем такой файл: dЦHello! Здесь: d - ASCII 100, Ц - ASCII 150 , Hello! - строка из 6-ти символов. Организовать чтение из файла с выводом на экран.
type R = record
A: Byte;
C: Array[1..6] of Char; end;
Var f: File; I: Byte; Rec: r; Result: Word;
begin
Assign(F, '1.txt'); { связываем файл с переменной}
{$I-}
Reset(F, 1);
{$I+}
if IOResult<>0 then Halt;
BlockRead(F, I, Sizeof(I), Result);
BlockRead(F, Rec, Sizeof(Rec), Result); Writeln(I);
Writeln('Rec values: '); Writeln('A: ', Rec.A); Writeln('S: ', Rec.C);
Readln; Close(F);
end.
В примере функция SIZEOF принимает в качестве параметра любую переменную и возвращает ее размер в байтах. Размер переменных стандартных типов (Integer, Byte....) можно найти в таблицах типов. Поэтому SIZEOF иногда очень выручает, упрощая работу. Дополнительный параметр процедуры RESULT указывает размер буфера, который используется для передачи данных. Буфер по умолчанию равен 128 байт. Если его явно не указывать, то Паскаль устанавливает это значение.
Пример 9. Сформировать данные для записи в файл.
uses Crt;
type R = record
A: Integer;
B: Word; end;
Var f: File;
Result: Word;
C: Char;
I: Integer;
S: String;
Rec: R;
begin
ClrScr;
{ считываем и задаем исходные данные }
Write('Enter CHAR: '); Readln(C);
Write('Enter INTEGER: '); Readln(I);
Write('Enter STRING: '); Readln(S);
Randomize;
Rec.A := Random(1000); Rec.B := Random(1000);
Writeln('Rec.A: ', Rec.A);
Writeln('Rec.B: ', Rec.B);
Readln;
{ выполняем действия по записи в файл }
Assign(F, '1.txt');
ReWrite(F, 1);
BlockWrite(F, C, SizeOf(C)+SizeOf(I)+255+SizeOf(Rec), Result);
Close(F);
end.
В процедуре BLOCKWRITE использовалось целое выражение в качестве указания размера записываемого буфера. Составлено оно из суммы 3х результатов функции SIZEOF и числа 255, которое является длиной строки S.
Пример11. Использование псевдографики. Это обычные символы, которые имеются в стандартном наборе ASCII.
Program Border;
uses Crt;
Procedure MakeWindow(X, Y, X1, Y1: Byte);
Var I: Byte;
Begin
GotoXY(X, Y); Write(#201); GotoXY(X1, Y); Write(#187);
GotoXY(X, Y1); Write(#200); GotoXY(X1, Y1); Write(#188);
For I := X+1 to X1-1 do
Begin GotoXY(I, Y); Write(#205);GotoXY(I, Y1); Write(#205); end;
For I := Y+1 to Y1-1 do
Begin GotoXY(X, I); Write(#186); GotoXY(X1, I); Write(#186); end;
end;