СООБЩЕНИЯ КОМПИЛЯТОРА ОБ ОШИБКАХ
§ Если в меню Options?Linker?Link Buffer, установлен параметр Memory, переключите его в значение Disk.
§ Возможно программа слишком велика, чтобы компилироваться в таком объеме памяти. Следует разбить ее на два или более модуля.
§ несоответствующее количество begin и end (не забудьте, что оператор case также заканчивается словом end);
§ включаемый файл заканчивается в середине раздела операторов. Каждый раздел операторов должен целиком помещаться в одном файле;
§ незаконченный комментарий.
§ несовместимые типы переменной и выражения в операторе присваивания;
§ несовместимые типы фактического и формального параметров в обращении к процедуре или функции;
§ тип выражения, несовместимый с типом индекса при индексировании массива;
§ несовместимые типы операндов в выражении.
§ Идентификатору функции можно присваивать значения только внутри раздела операторов данной функции.
§ Объектный файл .obj определяет идентификаторы PUBLIC, которые не находятся в сегменте CODE.
§ Идентификатор обозначает абсолютную переменную.
§ Идентификатор обозначает процедуру или функцию типа inline.
§ Файл .com содержит ссылки с размерами в байтах на перемещаемые идентификаторы. Такая ошибка происходит в случае, если вы используете операторы HIGH и DOWN с перемещаемыми идентификаторами или если вы ссылаетесь в директивах DB на перемещаемые идентификаторы.
§ Операнд ссылается на перемещаемый идентификатор, который не был определен в сегменте CODE или в сегменте DATA.
§ Операнд ссылается на процедуру EXTRN или функцию EXTRN со смещением, например CALL SortProc+8.
§ Процедуры или функции были описаны с помощью описания forward, но их определение не найдено.
§ Вы пытаетесь осуществить приведение типа выражения, когда разрешается только ссылка на переменную, процедуру или функцию.
§ Вы пытаетесь присвоить константу вне диапазона переменной.
§ Вы пытаетесь передать константу вне диапазона в качестве параметра процедуре или функции.
Размер локальных переменных, описанных в программе или функции, не может превышать 64 Кбайт.
Сообщение компилятора об ошибках
Если
ошибка возникает при компиляции внутри
TP,
Турбо Паскаль активизирует окно
редактирования и помещает курсор на
место ошибки в исходной программе.
Если
ошибка возникает при использовании
командно-строчного компилятора, Турбо
Паскаль выдает сообщение об ошибке,
выводит на экран исходную строку
программы с ошибкой и ее номер; символ
^ в выдаваемой исходной строке указывает
местоположение ошибки. Ошибки
подразделяются на:
-
ошибки
при компилировании программы; -
ошибки
на уровне DOS; -
ошибки
ввода-вывода.
Ошибки при компилировании
1
Out of memory (Выход за пределы памяти)
Данная
ошибка появляется, если компилятор
израсходовал всю доступную ему память.
Возможно, ваша программа или программный
модуль слишком велики, чтобы компилировать
их в таком объеме памяти. В этом случае
программу или программный модуль
необходимо разбить на два или более
программных модуля.
2
Identifier expected (Ожидается идентификатор)
В этом месте должен
находиться идентификатор.
3
Unknown Identifier (Неизвестный идентификатор)
Этот идентификатор
не был описан.
4
Duplicate Identifier (Повторение идентификатора)
5
Syntax error (Синтаксическая ошибка)
В исходном тексте
найден недопустимый символ. Возможно,
не заключена в кавычки строковая
константа.
6
Error in real constant (Ошибка в константе
вещественного типа)
Ошибка в синтаксисе
константы вещественного типа.
7
Error In Integer constant (Ошибка
в
константе
целого
типа)
Ошибка
в синтаксисе константы целого типа
(Учтите, что после чисел, превышающих
диапазон представления целых чисел,
должны ставиться точка и нуль, например
12345678912.0.).
8
String constant exceeds line (Строковая константа
превышает размеры строки)
Вероятно, после
строковой константы отсутствует символ
кавычка.
9
Too many nested files (Слишком много вложенных
файлов)
Компилятор допускает
не более 15 вложенных исходных файлов и
не более 4 включаемых файлов.
10
Unexpected end of file (Неожиданный
конец
файла)
Данное сообщение
может появиться по одной из следующих
причин:
В Вашей программе,
вероятнее всего, неодинаковое количество
операторов BEGIN и END.
Включаемый
файл заканчивается в середине раздела
операторов (Каждый раздел операторов
должен целиком помещаться в одном
файле).
В Вашем файле не
закрыты скобки комментария.
11
Line too long (Строка слишком длинная)
Максимальная длина
строки не может превышать 127 символов.
12
Type Identifier expected (Ожидается идентификатор
типа)
В определенном
месте не указан тип идентификатора.
13
Too many open files (Слишком много открытых
файлов)
В
файле CONFIG.SYS не установлен параметр
FILES = N, где N — представляет собой целое
число без знака. Установите в файле
CONFIG.SYS значение параметра FILES = N >= 30.
14
Invalid file name (Недопустимое имя файла)
Имя файла неверно
или указан несуществующий путь.
15
File not found (Файл
не
найден)
Файл
не найден ни в одном из каталогов,
предназначенных для хранения файлов
данного типа.
16
Disk full (Диск заполнен)
Удалите
с диска ненужные Вам файлы (например
файлы с расширением .ВАК или .ТМР) или
попробуйте сохранить текст программы
на другом диске, который имеет достаточный
объем свободной памяти.
17
Invalid compiler directive (Недопустимая директива
компилятора)
Неверная
буква в директиве компилятора, один из
параметров директивы компилятора
неверный или Вы пользуетесь глобальной
директивой компилятора, когда компиляция
тела программы уже началась.
18
Too many files (Слишком много файлов)
В
компиляции программы или программного
модуля участвует слишком много файлов.
Попытайтесь не использовать так много
файлов, например, объединяя включаемые
файлы.
19
Undefined type la pointer definition (Неопределенный
тип в описании указателя)
Вы
пытаетесь объявить типизированный
указатель, связанный с ранее необъявленным
типом данных.
20
Variable Identifier expected (Ожидается идентификатор
переменной)
В указанном курсором
месте ожидается идентификатор переменной.
21
Error in type (Ошибка в определения типа)
Определение типа
не может начинаться с этого символа.
22
Structure too large (Слишком длинная структура)
Максимально
допустимый размер любого структурированного
типа — 65520 байтов.
23
Set base type of range (Количество элементов в
множестве превышает допустимое значение)
Базовый
тип множества должен представлять собой
интервальный или перечисляемый тип
данных с не более чем 256 значениями.
24
File components may not be files or objects (Компоненты
файла
не
могут
быть
файлами
или
объектами)
Тип
компонентов файла не может быть объектным
типом, файловым типом или любым другим
структурированным типом, содержащим
компоненты типа файла или объекта.
25Invalid
string length (Неверная длина строки)
Длина описываемой
строки должна находиться в пределах
от 1 до 255.
26
Type mismatch (Несоответствие типов)
Причины, вызвавшие
появление данного сообщения, могут быть
следующими:
Несовместимы типы
переменной и выражения в операторе
присваивания.
Несовместимые
типы фактического и формального
параметров в обращении к процедуре или
функции.
Тип выражения
несовместимый с типом индекса при
индексировании массива.
Несовместимые
типы операндов в выражении.
27
Invalid subrange base type (Неправильный базовый
тип для интервала)
28Lower
bound greater than upper bound (Нижний
граница
превышает
верхнюю)
При
описании интервального типа данных Вы
объявили нижнюю границу диапазона
больше верхней.
29
Ordinal type expected (Ожидается перечисляемый
тип)
Вещественные,
строковые, структурные и ссылочные типы
в данном случае не допускаются.
30
Integer constant expected (Ожидается константа
целого типа)
31
Constant expected (Ожидается константа)
32
Integer or real constant expected (Ожидается константа
целого или вещественного типа)
33Pointer
type Identifier expected (Ожидается идентификатор
типа указатель)
Указанный курсором
идентификатор не является указателем.
34
Invalid function result type (Недопустимый тип
результата функция)
Правильными типами
результата функции являются все простые,
строковые и ссылочные типы.
35
Label Identifier expected (Ожидается идентификатор
метки)
Обнаружена ссылка
на метку, не описанную в разделе LABEL.
36
BEGIN expected (Ожидается оператор BEGIN)
37
END expected (Ожидается оператор END)
38
Integer expression expected (Ожидается выражение
целого типа)
39
Ordinal expression expected (Ожидается выражение
перечисляемого типа)
40
Boolean expression expected (Ожидается выражение
логического типа)
41
Operand types do not match operator (Несоответствие
типов
операнду)
Данная
операция не может применяться к операндам
этого типа. Такое сообщение будет
вызвано, например, при попытке выполнить
следующую операцию:’ 9′ DIV ‘G’ .
42
Error in expression (Ошибка
в
выражении)
Данный
идентификатор не может участвовать в
выражении указанным образом.
Возможно, вы забыли
указать операцию между двумя операндами.
43
Illegal assignment (Запрещенное присваивание)
Это сообщение
может появиться по следующим причинам:
-
файлам
и нетипизированным переменным нельзя
присваивать значения; -
идентификатору
функции можно присваивать значения
только внутри раздела операторов данной
функции.
44
Field Identifier expected (Ожидается идентификатор
поля)
Данный идентификатор
не соответствует полю предшествующей
переменной типа RECORD или OBJECT.
45
Object file too large (Объектный файл слишком
большой)
Турбо Паскаль не
может компоновать OBJ-файлы размером
больше чем 64 Кбайта.
46
Undefined external (Не определена внешняя
процедура)
Внешняя процедура
или функция не имеет соответствующего
определения PUBLIC в объектном файле.
Убедитесь, что вы указали все объектные
файлы в директивах {$L <имя ОВJ-файла>),
и проверьте написание идентификаторов
процедуры или функции в файле .ASM.
47
Invalid object file record
(Недопустимая
запись объектного файла)
Файл .OBJ содержит
неверную объектную запись. Убедитесь
в том, что данный файл является
действительно OBJ-файлом.
48
Code segment too large (Сегмент кода слишком
большой)
Максимально
допустимый размер кода программы или
программного модуля ранен 65520 байтам.
Разбейте Вашу программу или программный
модуль на несколько частей.
49
Data segment too large (Сегмент данных слишком
большой)
Максимальный
размер сегмента данных программы равен
65520 байтам, включая данные, описываемые
используемыми программными модулями.
Если нужно большее количество глобальных
данных, опишите большие структуры с
помощью указателей и выделяйте для них
память динамически с помощью процедуры
New.
50
DO expected (Ожидается оператор DO)
51
Invalid PUBLIC definition (Недопустимое
определение
PUBLIC)
Появление этого
сообщения возможно но следующим причинам:
-
Данный
идентификатор получил тип PUBLIC с помощью
соответствующей директивы языка
ассемблер, но не соответствует описанию
EXTERNAL в программе или программном модуле. -
Две
или более директивы PUBLIC на языке
ассемблера определяют один и тот же
идентификатор. -
OBJ-файл
определяет идентификатор PUBLIC вне
сегмента CODE.
52
Invalid EXTRN definition (Неправильное определение
EXTRN)
Появление этого
сообщения возможно по следующим причинам:
Из Ассемблера была
осуществлена ссылка с помощью директивы
EXTRN на идентификатор, который не был
описан в тексте Паскаль-программы.
Идентификатор
обозначает абсолютную переменную.
Идентификатор
обозначает процедуру или функцию типа
INLINE.
53
Too many EXTRN definition (Слишком много определений
типа EXTRN)
Турбо
Паскаль не может обрабатывать файлы
.OBJ при более чем 256 определениях EXTRN.
54
OF expected (Ожидается
оператор
OF)
55
INTERFACE expected (Ожидается
оператор
INTERFACE)
56
Invalid relocatable reference (Недопустимая
перемещаемая
ссылка)
Появление этого
сообщения возможно по следующим причинам:
-
OBJ-файл
содержит данные и перемещаемые ссылки
в сегментах, отличных от CODE, например,
при попытке описать инициализированные
переменные в сегменте DATA. -
ORJ-файл
содержит ссылки с размерами в байтах
на перемещаемые символы. Такая ошибка
происходит в случае использования
операторов HIGH и DOWN с перемещаемыми
символами или, если Вы ссылаетесь в
директивах DB на перемещаемые символы. -
Операнд
ссылается на перемещаемый символ,
который не был определен в сегментах
CODE или DATA. -
Операнд
ссылается на процедуру EXTRN или функцию
EXTRN со смещением, например CALL SortProc+8.
Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]
- #
- #
- #
- #
- #
- #
- #
- #
- #
- #
- #
На занятии будет рассмотрена работа с текстовыми файлами в Паскале и разобраны конкретные решенные примеры задач
Работа с файлами в паскале
Виды файлов в зависимости от их описания и режимом работы
- текстовые (тип text) файлы со строками неопределенной длины;
- файлы с типом записей (двоичные или типизированные (file of) );
- файлы без типа для передачи данных блоками записей нетипизированные (file).
Описание файловых переменных:
var f1: file of char; {типизированный файл} f2: file of integer; {типизированный файл} f3: file; {нетипизированный файл} f: text; {текстовый файл}
Для связи файла в коде программы и действительного файла на внешнем носителе используется процедура ASSIGN
:
assign(myfile,'c:text.txt');
где myfile
— имя переменной (объявленной ранее в области var
), ассоциированной с файлом
c:text.txt
— путь к реальному файлу
Первый аргумент процедуры assign в паскаль — переменная, второй – путь к файлу на диске.
Для считывания из файла достаточно связать поток ввода с файлом:
Считывание строки | Считывание массива из N целых |
begin Assign(input,'24.txt'); var s := ReadString; ... end. |
begin Assign(input,'26.txt'); var N := ReadInteger; var a := ReadArrInteger(N); ... end. |
Текстовые файлы в паскале: процедуры работы
Текстовый файл в Паскале — это совокупность строк произвольной длины, которые разделены между собой метками конца строки, а весь файл заканчивается меткой конца файла.
Важно: Если быть точными, то каждая строка текстового файла завершается специальной комбинацией, называемой «конец строки».
Комбинация «конец строки» состоит из двух символов: перевод каретки (ASCII-код #13
) и перевод строки (#10
). Завершается текстовый файл символом конец файла (#26
).
Возможные расширения файлов:
*.txt, *.log,
*.htm, *.html
Метод работы с текстовым файлом в Паскале предусматривает лишь последовательный доступ к каждой строке файла. Это означает, что начинать всегда возможно только с первой строки, затем проходя по каждой строке, дойти постепенно до необходимой. Т.е. можно сказать, что чтение (или запись) из файла (в файл) ведутся байт за байтом от начала к концу.
Предусмотрены два режима работы: режим для записи в файл информации и для чтения ее из файла. Одновременная запись и чтение запрещены.
Открытие файла (классический Pascal)
Допустим, мы в программе описали переменную для работы с текстовым файлом:
Рассмотрим дальнейшую последовательность работы с ним, и рассмотрим процедуры, необходимые для работы с текстовым файлом в Паскале:
процедура открытия существующего файла для чтения при последовательном доступе:
процедура открытия создаваемого файла для записи в него информации; если файл с таким именем уже существует, то информация в нем стирается:
процедура добавления в конец:
- При открытии курсор устанавливается в начало файла.
Чтение из файла (классический Pascal)
Read (f, список переменных); ReadLn (f, список переменных);Отличие
ReadLn
отRead
в том, что при использовании readln после прочтения данных пропускаются все оставшиеся символы в данной строке, включая метку конца строки.
- чтение осуществляется с той позиции, где в данный момент стоит курсор;
- после чтения курсор сдвигается к первому непрочитанному символу.
EOF (end of file)
.EOL (end of line)
.close ( f ); reset ( f ); { начинаем с начала }
Запись в текстовый файл (классический Pascal)
Write (f, список переменных); WriteLn (f, список переменных);где
f
— файловая переменная, а второй параметр – выводимые из программы и вводимые в файл данные (в виде значений переменных или просто данные)
Процедуры работы с файлом и закрытие файла
Нахождение конца файла:
Логическая функция, возвращающая True, если достигнут конец файла.
Нахождение конца строки:
Логическая функция, возвращающая True, если достигнут конец строки.
Удалить файл в Паскале
Переименование файла в Паскале
rename(переменная_файла,'новое имя файла');Закрытие:
Close (f); {закрытие файла}
Важно: Таким образом, работа с файлом осуществляется через три основных шага:
- Процедура assign.
- Процедура reset или rewrite.
- Процедура close.
Рассмотрим пример работы с файлами в паскале:
Пример 1: В файле text.txt записаны строки. Вывести первую и третью из них на экран.
(предварительно создать text.txt с тремя строками)
Решение:
Паскаль | PascalAbc.NET | ||||
---|---|---|---|---|---|
|
|
Пример 2: Дан текстовый файл. Вывести количество содержащихся в нем символов и строк (маркеры концов строк EOLN и конца файла EOF при подсчете количества символов не учитывать).
Показать решение:
Паскаль | PascalAbc.NET | ||||
---|---|---|---|---|---|
|
|
Пример 3:
Считать из файла input.txt числа (числа записаны в столбик). Затем записать их произведение в файл output.txt
Решение:
Паскаль | PascalAbc.NET | ||
---|---|---|---|
|
begin Assign(input, 'input.txt'); Assign(output, 'output.txt'); var p := 1; while not eof(input) do begin var x := readInteger; p := p * x; end; print($'произведение {p}'); end. |
pascal file text1. В цикле записать в файл числа от 1 до 10 (каждое — в своей строке), а затем их считать и отобразить на экране.
Дополните код:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 |
var filetext: text; a:string; i:integer; begin assign(filetext,'c:text.txt'); rewrite(filetext); for i:=1 to 10 do ... reset(filetext); for i:=1 to 10 do begin ... ... end; close(filetext); end. |
pascal file text2. Даны целые положительные числа N и K. Создать текстовый файл и записать в него N строк, каждая из которых состоит из K символов «*» (звездочка).
pascal file text3. Дана строка S
и текстовый файл. Добавить строку S
в конец файла.
Показать решение:
Паскаль | PascalAbc.NET | ||||
---|---|---|---|---|---|
|
|
pascal file text4. Дано целое число K
и текстовый файл. В данном файле вставить пустую строку перед строкой с номером K
. Если строки с таким номером нет, то оставить файл без изменений.
Для решения задачи можно использовать дополнительный временный файл.
Пример 5: Дано целое число K
и текстовый файл. Удалить из файла строку с номером K
. Если строки с таким номером нет, то оставить файл без изменений.
Примерный результат:
до:
>> 2 0line 1line 2line 3line
после:
0line 2line 3line
Показать решение:
Паскаль | PascalAbc.NET | ||||
---|---|---|---|---|---|
|
|
Пример 6: Дан текстовый файл F1
с набором нулей и единиц. Необходимо заменить все вхождения сочетаний 101
на 000
. Скорректированные записи поместить в файл F2
.
* Использовать функции для работы со строками:
— Pos()
— Delete()
— Insert()
Показать решение:
Паскаль | PascalAbc.NET | ||||
---|---|---|---|---|---|
|
|
Работа с данными из файла как с массивом
Пример 7: В файле input.txt записаны числа (каждое — с новой строки), их количество не превышает 100. Необходимо отсортировать их по возрастанию и записать в файл output.txt.
Трудности:
- для сортировки необходим массив, для того чтобы одновременно работать со всеми числами;
- неизвестно общее количество чисел.
Алгоритм решения:
- объявляем массив для 100 элементов;
- открываем файл на чтение, просчитываем количество чисел, заполняя массив, сохраняем количество в N;
- сортируем N элементов массива;
- записываем результат в файл.
Фрагмент решения:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 |
{ Определяем глобальные переменные: } var A: array[1..100] of integer; f: text; N, i: integer; { Определяем функцию, считывающую числа из файла, и записывающую их в массив. Функция возвращает кол-во элементов массива: } function ReadFromFile: integer; var i: integer; begin assign(f, 'input.txt'); ...;{ открытие файла в режиме чтения } i := 0; while (...) and (...) do begin i := i + 1; readln(...,...); end; close(f); ReadFromFile := i; end; { Основная программа } Begin N := ReadFromFile ; { сортировка N элементов по возрастанию } { ... } { запись отсортированного массива в файл: } assign(..., ...); ...;{ открытие файла в режиме записи } for i:=1 to N do writeln(..., ...); close(f); end. |
pascal file text5. В файле input.txt записаны числа (каждое — с новой строки), их количество не превышает 100. Необходимо найти максимальное и минимальное число и записать их в файл output.txt.
pascal file text6. Дан текстовый файл. Удалить из него все пустые строки.
А теперь вернемся к олимпиадному заданию по Паскалю, частично решенному на одном из предыдущих заданиях:
Пример 8: Шифр Цезаря заключается в том, что каждая буква исходной строки заменяется третьей после нее буквой в алфавите, который считается написанным по кругу (все символы текста латинские и прописные).
Решить ту же задачу, в которой сдвиг будет не на 3 позиции, а на k, причем отрицательное значение является признаком сдвига влево, положительное — вправо.
Формат входных данных (файл p.in): В первой строке записано число k, не превышающее по модулю 20. Во второй строке — текст, который необходимо зашифровать. Все символы текста латинские и прописные.
Формат выходных данных (файл p.out): Выведите зашифрованный текст.
Пример:
p.in | p.out |
---|---|
3 hello earth |
khoor hduwk |
* желательно создать файлы и записать данные в исходный файл «вручную»
* программа решена для k=3, выполните программу для любых k (не превышающих 20 по модулю)
Фрагменты кода:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 |
var a:char; i,n,k:byte; s,s1:string; f_in,f_out:text; begin Assign(F_in,'z:p.in'); Assign(F_out,'z:p.out'); Reset(F_in); Rewrite(F_out); s1:=''; readln(f_in,k); readln(f_in,s); for i:=1 to length(s) do begin n:=ord(s[i]); if n<>32 then {32 - пробел} n:=n+3; if ... then ...; if ... then ...; if ... then ...; a:=chr(...); s1:=...; end; writeln(s1); writeln(f_out,s1); close(f_in); close(f_out) end. |
pascal file text7. Пять делителей.
Имя входного файла: z3.in
Имя выходного файла: z3.out
Найти сумму всех чисел от 1 до n, имеющих ровно 5 делителей.
Единица и само число входят в число его делителей.
Входные данные
В единственной строке входного файла z3.in записано одно натуральное число n(1 <= n <= 1012).
Выходные данные
В единственную строку выходного файла z3.out нужно вывести одно натуральное число — найденную сумму.
Примеры:
z3.in | z3.out |
---|---|
50 | 16 |
200 | 97 |
2015 | 722 |
* Олимпиадное задание (11 класс, 2016)
В язык Паскаль выделяются данные файлового типа, которые служат для работы с информацией, расположенной на внешних устройствах. Эта информация формируется во внешней памяти компьютера, образуя некоторую область, называемую файлом. Файлы имеют имя и представляют собой совокупность однотипных элементов. Обычно они применяются, в случаях большого объема данных, долгосрочного хранения, либо необходимости предоставления доступа нескольким приложениям к одной и той же информации.
Файлы принято разделять на физические и логические. Физические файлы имеют имя, и располагаются на съемном носителе, а логические это те переменные файлового типа, которые их представляют в программе.
В Паскале различают следующие три вида файлов (в скобках описаны ключевые слова для инициализации файловой переменной):
- текстовые файлы (
text
); - типизированные (
file of <тип>
); - бестиповые (
file
).
1 Общие операции по работе с файлами
Немного позже мы разберемся с каждым из них. А сейчас рассмотрим основные операции для работы с файлами.
Создание файла
Assign(<имя файловой переменной>, <имя файла>)
Процедура Assign
связывает переменную файлового типа с физическим файлом. Например, установить соответствие между переменной Fil
и текстовым файлом lot
, расположенном на диске D
, можно так:
Assign(Fil, ‘D:lot.txt’)
Режим чтения
Reset(<имя файловой переменной>)
Процедура Reset
открывает файл в режиме чтения, после чего оператором Read(<файловая переменная>, <считываемый элемент>)
можно осуществить последовательное считывание элементов в программу.
Конец файла
ЕOF(<имя файловой переменной>)
Количество элементов в файле заранее не определяется, но часто необходимо знать о моменте достижения конца файла. Для этого в Паскале существует логическая функция EOF
, которая проверяет достигнут ли конец, и если это так, то принимает значение True
, иначе – False
. Осуществляется проверка, как правило, в цикле, в качестве условного выражения выступает функция EOF
.
Режим записи
Rewrite(<имя файловой переменной>)
Открыв файл в режиме записи, можно поэлементно записать в него информацию, воспользовавшись процедурой Write(<файловая переменная>, <элемент>)
.
Закрытие файла
Close(<имя файловой переменной>)
Процедура Close
закрывает открытый файл, а также освобождает файловую переменную, указанную в качестве параметра.
Удаление файла
Erase(<имя файловой переменной>)
При помощи процедуры Erase
, можно удалить с внешнего носителя, заранее закрытый файл.
Изменение имени файла
Rеnаmе(<имя файловой переменной>, ‘<новое имя файла>’)
Rеnаmе
переименовывает физический файл, который перед этим следует закрыть процедурой Close
.
Смещение указателя файла
Sееk(<имя файловой переменной>, <номер элемента>)
Процедура Sееk
устанавливает позицию указателя в файле на необходимый элемент (нумерация элементов начинается с нуля).
Определение положения указателя
FilePos(<имя файловой переменной>)
Функция FilePos
принимает значение порядкового номера элемента, над которым в момент вызова находиться указатель.
Определение количества элементов
FileSize(<имя файловой переменной>)
Функция FileSize
определяет количество всех имеющихся в файле элементов.
2 Текстовые файлы
Текстовые файлы могут состоять из элементов символьного (char
) и строкового (string
) типа данных. Ключевое слово Text указывает, что файловая переменная создается для работы именно с текстовым файлом:
Var <идентификатор>: Text;
Структура текстового файла представляет собой последовательность строк, которые в свою очередь состоят из символов. Любая строка оканчивается признаком «конца строки», а сам файл признаком «конца файла». Для определения конца файла в Паскаль есть функция EOF
, а для конца строки – EOLn
:
EOLn(<имя файловой переменной>)
В случае достижения конца строки она (функция EOLn
) возвращает значение True
, в противном случае False
.
Рассмотрим работу с текстовым файлом, на примере программы.
program text_fail; uses crt; var f: text; {объявление файловой переменной} s: string; n, i: integer; begin assign (f, 'file.txt'); {создание файла} rewrite(f); {открытие файла в режиме записи} write('Количество строк '); read(n); for i:=1 to n do begin readln(s); {ввод строки} writeln(f, s); {запись строки в файл} end; clrscr; reset(f); {открытие файла в режиме чтения} while not eof(f) do {выполнять пока не достигнут конец файла} begin readln(f, s); {чтение строки из файла} writeln(s); {вывод считанной строки на экран} end; close(f); {закрытие файла} end.
Место создания файла "file.txt"
не было указано, поэтому он создаться в папке по умолчанию для вашей среды программирования. Для текстовых файлов в Паскале определены следующие процедуры и функции:
Append(<имя файловой переменной>)
Процедура Append
открывает существующий файл в режиме дозаписи. После чего в его конец можно добавить какую либо информацию.
SeekEOLn(<имя файловой переменной>)
Если до конца строки остались пробелы/знаки табуляции, то функция SeekEOLn
возвращает значение True
, иначе False
.
SeekEOF(<имя файловой переменной>)
Если до конца файла остались лишь строки с пробелами/знаками табуляции, то функция SeekEOF
возвращает значение True
, иначе False
.
3 Типизированные файлы
Файл, определенный стандартным или пользовательским типом данных, называется типизированным. Общая форма объявления типизированных файлов имеет вид:
Var <имя файла>: File of <тип компонент>;
Здесь тип компонент может быть любым типом данных, определенных в Pascal, но только не файловым. Для работы с типизированными файлами используются уже знакомые нам процедуры и функции: Write, Read, Seek, Filesize, Filepos
, а также процедура Truncate
:
Truncate(<имя файловой переменной>)
Она удаляет все компоненты в файле, начиная с того над которым находиться указатель.
Одной из главных особенностей типизированного файла является возможность прямого обращения к его отдельным компонентам. Это достигается за счет, того что заранее известен тип компонент файла. Рассмотрим два примера кода, в первом из которых обращение к элементам файла происходит последовательно, а во втором прямо.
Пример: вычислить среднее арифметическое элементов файла.
Решение:
program type_fail; uses crt; var f: file of integer; {объявление файловой переменной} x, n, i: integer; sr: real; begin assign (f, 'file.dat'); {создание файла} rewrite(f); {открытие файла в режиме записи} write('Количество элементов '); read(n); for i:=1 to n do begin readln(x); {ввод элемента} write(f, x); {запись элемента в файл} end; clrscr; n:=0; reset(f); {открытие файла в режиме чтения} while not eof(f) do {выполнять пока не достигнут конец файла} begin read(f, x); n:=n+x; end; sr:=n/filesize(f); close(f); {закрытие файла} write('Среднее арифметическое = ', sr); end.
Пример 2: поменять строки в файле местами.
program type_fail; uses crt; var f: file of string; i: integer; s, s1, s2, s3: string; begin assign (f, 'file.dat'); s1:='Pascal'; s2:=' на '; s3:='Программирование'; rewrite(f); write(f, s1, s2, s3); {запись строк в файл} reset(f); write('Выводим как есть: '); while not eof(f) do {вывод содержимого файла} begin read(f, s); write(s); end; writeln; write('Вывод после обработки: '); for i:=2 downto 0 do begin seek(f, i); {смена позиции указателя} read(f, s); write(s); end; close(f); end.
Таким образом, напрашивается вывод, что типизированные файлы несколько функциональней в обработке, чем текстовые. Далее разберем последний пункт данной статьи, а именно третий вид файлов — бестиповые файлы.
4 Бестиповые (нетипизированные) файлы
Бестиповые файлы предназначены для записи участков памяти компьютера на внешний носитель и считывания их в память. В отличие от типизированных файлов, нам не нужно знать информация какого типа хранится в них. А все потому, что данные из файлов, не имеющих типа, считываются в виде байт, после чего они «подстраиваются» под переменную, в которую происходит считывание.
Общая форма записи нетипизированных файлов
Var <идентификатор>: File;
отличается от типизированных отсутствием части of <тип данных>
. Кроме того, немного изменяется принцип действия процедур Reset
и Rewrite
. К ним прибавляется второй параметр типа Word:
reset(<имя файловой переменной>, <значение>) rewrite(<имя файловой переменной>, <значение>)
Здесь «значение» — это новый размер буфера, который по умолчанию равен 128 байтам. В качестве минимального значения можно указать 1 байт, а максимального — 64 кбайт (число в байтах).
Также в бестиповых файлах для записи и чтения информации используются не стандартные процедуры Read
и Write
, а две новые: BlokRead
и BlockWrite
. Рассмотрим каждую из них.
Процедура BlockRead
Данная процедура считывает из файла заданное число записей, которые помещаются в память.
Общая форма записи:
BlockRead(<имя файловой переменной>, <x>, <количество байт>, <y>);
x, y – обычные переменные, в первую помещается прочитанные данные, во вторую – количество считанных байт. В случае удачи y (y – необязательный параметр) будет иметь тоже значение, что и третий параметр.
Процедура BlockWrite
Для записи информации в бестиповый файл предназначена процедура BlockWrite
:
BlockWrite(<имя файловой переменной>, <x>, <количество байт>, <y>);
Параметры процедуры BlockWrite
точно такие же, как и у BlockRead
. Да и принцип их одинаков, за исключением того, что первая записывает данные в файл, а вторая считывает их из него.
В следующей программе данные сначала записываются в нетипизированный файл, а затем выводятся из него посредством рассмотренных нами операций.
program no_type_fail; uses crt; var f: file; x, i ,n: byte; begin clrscr; assign(f, 'f'); rewrite(f, 1); write('n = '); readln(n); for i:=1 to n do begin x:=n-i; blockwrite(f, x, 1); {запись в файл} end; reset(f, 1); while not eof(f) do begin blockread(f, x, 1); {чтение из файла} write(x,' '); end; close(f); readkey; end.
Возможно, что ваша среда программирования не поддерживает работу с файлами, не имеющими типа. Поэтому прежде чем начать искать ошибку в коде, стоит узнать про данную функцию.