Под записью файла понимается вывод результатов программы из оперативной памяти на диск, то есть создание нового файла на внешнем устройстве.
Для записи файла необходимо:
1. Открыть файл для записи оператором REWRITE (имя файла);
2. Вывести данные оператором WRITE (имя файла, параметры);
3. Закрыть файл для записи CLOSE (имя файла);
Внешний файл, в который записываются данные, называется выходным.
Например, VAR F: TEXT;
begin
ASSIGN(F,’D:\TEST.DAT’);
REWRITE(F);
WRITELN(F,’Привет!’);
CLOSE(F);
end.
Если после создания текстового файла необходимо ввести в него дополнительную информацию, то используют оператор APPEND (F).
Например, VAR F: TEXT;
begin
ASSIGN(F, ‘…’);
REWRITE(F); //
WRITELN(F, ‘Привет!’);
APPEND(F);
WRITELN(F, ‘Мир!!!’);
CLOSE(F);
end.
Если в операторе на месте имени внешнего файла указать стандартное устройство клавиатуры, то данные можно будет вводить с клавиатуры ‘con:’: ASSIGN(F,’CON:’);
Для вывода результатов на печать в качестве внешнего файла необходимо указать печатающее устройство: ASSIGN(F, ‘PRN:’); Необходимо подключить стандартный библиотечный модуль PRINTER.
При обращении к стандартным функциям и процедурам ввода/вывода автоматически производится проверка на наличие ошибок. При обнаружении ошибок программа прекращает работу и выводит на экран сообщение. С помощью директив компилятора {$I-} и {$I+} автоматическую проверку ошибок ввода/вывода можно отключить или выключить. Если автоматическая проверка отключена, ошибки ввода/вывода, возникающие при работе программы, не приводят к её останову. Стандартная функция IORESULT возвращает код ошибки. Нулевое значение кода ошибки означает нормальное завершение операции ввода/вывода.
Задача 12.1. Сформировать файл, состоящий из 10 целых чисел. Считать данные из файла, посчитать их сумму и вывести их на экран.
Листинг программы
PROGRAM TASK1;
USES CRT;
CONST N = 10;
VAR F: FILE OF INTEGER;
X: ARRAY[1..N] OF INTEGER;
I: INTEGER;
S: LONGINT;
ROAD: STRING[30];
BEGIN
CLRSCR;
RANDOMIZE;
ROAD:= 'E:\PASCAL\FILE\TASK1.DAT';
{$I-}
ASSIGN(F,ROAD);
IF IORESULT <> 0 THEN WRITELN ('ERROR ON CREATE FILE!')
ELSE
BEGIN
REWRITE(F);
IF IORESULT <> 0 THEN WRITELN ('ERROR ON OPEN/WRITE FILE!') {$I+}
ELSE
BEGIN
{$I+}
FOR I:= 1 TO N DO
BEGIN
X[I]:= RANDOM(21)-10;
WRITE(F,X[I]);
END;
CLOSE(F);
END;
{$I-}
S:= 0;
I:= 1;
RESET(F);
IF IORESULT <> 0 THEN WRITE ('ERROR ON OPEN FILE!') {$I+}
ELSE
BEGIN
{$I+}
WHILE NOT EOF (F) DO
BEGIN
READ(F,X[I]);
WRITELN(X[I]);
S:= S + X[I];
INC(I);
END;
WRITELN('S=',S:4);
CLOSE(F);
END;
END;
READLN;
ERASE(F);
END.
Задача 12.2. Сформировать файл из 5 компонент строкового типа, считать их из файла. Если первые две компоненты – числа, то образовать их них число и определить является ли оно чётным или нет.
Листинг программы
ROGRAM TASK2;
USES CRT;
CONST N = 5;
ROAD = 'E:\PASCAL\FILE\TASK2.DAT';
VAR F: TEXT;
I: BYTE;
C: CHAR;
S: STRING;
SUM, CODE: INTEGER;
D: ARRAY[1..N] OF STRING;
BEGIN
REPEAT
CLRSCR;
{$I-}
ASSIGN(F,ROAD);
IF IORESULT <> 0 THEN BEGIN WRITELN ('ERROR ON CREATE FILE!');
HALT;
{$I+}
END
ELSE
BEGIN
REWRITE(F);
IF IORESULT <> 0 THEN BEGIN WRITELN ('ERROR ON OPEN/WRITE FILE!');
HALT;
{$I+}
END
ELSE
BEGIN
{$I+}
FOR I:= 1 TO N DO
BEGIN
READLN(D[I]);
WRITELN(F,D[I]);
END;
END;
END;
CLOSE(F);
{$I-}
RESET(F);
IF IORESULT <> 0 THEN BEGIN WRITELN ('ERROR ON READ FILE!');
HALT;
{$I+}
END
ELSE
BEGIN
{$I+}
I:= 1;
WRITELN('OUTPUT');
WHILE NOT SEEKEOF(F) DO
BEGIN
READLN(F,D[I]);
WRITELN(D[I]);
INC(I);
END;
CLOSE(F);
END;
WRITELN;
S:= D[1] + D[2];
VAL(S,SUM,CODE);
IF CODE <> 0 THEN WRITELN ('ERROR IN STATEMENT')
ELSE
BEGIN
IF NOT ODD(SUM) THEN WRITELN ('YES')
ELSE WRITELN ('NO');
END;
WRITE('CONTINUE Y/N?');
READLN(C);
UNTIL (C = 'N') OR (C = 'n');
ERASE(F);
END.
Вопросы для самопроверки
1. Дайте определение файла?
2. Каков формат объявления файловых переменных?
3. Какая существует классификация файлов по способу объявления?
4. Какая существует классификация файлов в зависимости от метода доступа?
5. Каков формат оператора assign?
6. Как организовать чтение файла?
7. Каков формат оператора reset?
8. Как осуществить запись файла?
9. Какие глобальные директивы компилятору позволяют отключить (включить) автоматическую проверку ошибок ввода/вывода?