Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Лекции по Паскалю.doc
Скачиваний:
61
Добавлен:
04.06.2015
Размер:
7.62 Mб
Скачать

Текстовые файлы

Текстовые файлы представляю собой последовательность строк различной длины, каждая из которых заканчивается меткой EOLnEnd Of Line– конец строки (последовательность символов#13#10). В конце файла стоит метка EOFEnd Of File.

Запись данных в текстовый файл практически не отличается от вывода данных на экран терминала. Чтение же данных из текстового файла имеет свои особенности.

Объявить текстовый файл можно двумя способами:

1.указанием его имени и типа в разделе описания переменных:

Var f_text : Text; объявлен текстовый файл f_text,

f_text – имя логического файла – файловой переменной

Внимание! При описании файла его размер не указывается.

2.указанием его типа в разделе определения типовTYPEи имени – в разделе описания переменных:

Type TFile_text : Text;

Var f_text : tFile_text;

Перед началом работы с файлом необходимо связать имя логического файла (файловую переменную) с физическим файлом на внешнем носителе:

Assign(имя файловой переменной, ‘путь к физическому файлу’);

Assign(f_text,’D:\User\f_text.txt’);

f_text– имя файловой переменной (логического файла),

D:\User\f_text.txt - полный путь к физическому файлу на внешнем носителе: дискD:,директория (папка)User, файлf_text.txt

Внимание! Желательно совпадение имени физического файла и имени файловой переменной; расширение имени текстового файла всегда.txt.

После установления пути к физическому файлу его можно открыть:

а)открытие нового файла длязаписив него данных:

ReWrite(f_text);

При этом на внешнем носителе создается новый физический файл с заданным именем. Если файл с таким же именем уже существовал, то он очищается,

б) открытие существующего файла длячтенияиз него данных:

ReSet(f_text);

При этом на внешнем носителе отыскивается файл с заданным именем и, если он найден, то указатель текущей записи становится в начало файла ,

в) открытие существующего файла длязаписив его конец новых строк:

Append(f_text);

При этом на внешнем носителе отыскивается файл с заданным именем и, если он найден, то указатель текущей записи становится в конец файла.

Запись в открытый для записи файл осуществляется операторами:

Write( файловая переменная, имя записываемой переменной);

WriteLn( файловая переменная, имя записываемой переменной);

Во втором случае после записи в файл значения переменной текстовый курсор переходит в начало новой строки (как на экране терминала).

В текстовый файл можно записывать данные только целого, вещественного, символьного типа или строки.

Пример: создать текстовый файл и записать в него

  1. номер учебной группы

  2. фамилию студента

  3. имя студента

  4. его оценку по информатике

  5. средний балл сдачи сессии

Данные вводить с экрана. Все данные записывать в файл с новых строк.

Интерфейс:

Номер группы: ИС-09

Фамилия: Иванов

Имя: Иван

Оценка:4

Ср. балл:4.12

Программа:

Program File_2;

Uses CRT;

Var ocenka : 2..5; оценка

sr_ball : Real; средний балл

name : String[15]; фамилия или имя

nomer : String[10]; номер группы

f_text : Text; текстовый файл

Begin

ClrScr;

Assign(f_text, ‘d:\User\f_text.txt’);

ReWrite(f_text); открываем файл для записи

Write(‘Номер группы:’);

ReadLn(nomer); вводим номер группы

WriteLn(f_text, nomer); записываем его в файл

Write(‘Фамилия:’);

ReadLn(name); вводим фамилию

WriteLn(f_text, name); записываем ее в файл с новой строки

Write(‘Имя:’);

ReadLn(name); вводим имя

WriteLn(f_text, name); записываем его в файл с новой строки

Write(‘Оценка:’);

ReadLn(ocenka); вводим оценку

WriteLn(f_text, ocenka:3); записываем ее в файл с новой строки в 3 позициях

Write(‘Ср. балл:’);

ReadLn(sr_ball); вводим средний балл

WriteLn(f_text, sr_ball:6:2); записываем его в файл с новой строки в 6 позициях

Close(f_text); закрываем файл

ReadLn;

End.

Структура созданного файла:

ИС-09

Иванов

Иван

4

4.12

Внимание! Все данные желательно записывать в текстовый файл форматным способом.

Чтение данных из открытого для чтения файла осуществляется операторами:

Read( файловая переменная, имя переменной);

ReadLn( файловая переменная, имя переменной);

Во втором случае после чтения из файла значения переменной текстовый курсор переходит в начало новой строки (как на экране терминала).

Внимание! Переменная, указанная в операторах чтения, должна совпадать по типу со считываемым из файла значением.

Пример: прочитать из созданного ранее файла информацию и вывести ее на экран.

Программа:

Program File_3;

Uses CRT;

Var ocenka : 2..5; оценка

sr_ball : Real; средний балл

name : String[15]; фамилия или имя

nomer : String[10]; номер группы

f_text : Text; текстовый файл

Begin

ClrScr;

Assign(f_text, ‘d:\User\f_text.txt’);

ReSet(f_text); открываем файл для чтения

ReadLn(f_text, nomer); читаем из файла номер группы

WriteLn(nomer); выводим его на экран

ReadLn(f_text, name); читаем из файла фамилию

WriteLn(name); выводим ее на экран

ReadLn(f_text, name); читаем из файла имя

WriteLn(name); выводим его на экран

ReadLn(f_text, ocenka); читаем из файла оценку

WriteLn( ocenka:3); выводим ее на экран

ReadLn(f_text, sr_ball); читаем из файла средний балл

WriteLn( sr_ball:6:2); выводим его на экран

Close(f_text); закрываем файл

ReadLn;

End.

На экран будет выведено:

ИС-09

Иванов

Иван

4

4.12

Внимание! Функции и процедуры, используемые при работе с типизированными файлами (FileSize, FilePos, Seek, Truncate), для текстовых файловне используются.

Сложнее работать с текстовыми файлами, в каждой строке которых записаны разнотипные данные.

Пример: создать текстовый файлbaza.txt, в каждой строке которого хранить следующие данные:

  1. номер учебной группы

  2. фамилию студента

  3. имя студента

  4. его оценку по информатике

  5. средний балл сдачи сессии

Другими словами, необходимо создать базу данныхна основе текстового файла.

Заполнить эту базу данных информацией о нескольких студентах, конец ввода данных – вместо очередного номера группы просто нажать на клавишу ввода (ввести строку нулевой длины).

Интерфейс:

Номер группы: ИС-09

Фамилия: Иванов

Имя: Иван

Оценка:4

Ср. балл:4.12

Номер группы: ПО-09

Фамилия: Петров

Имя: Петр

Оценка:5

Ср. балл:4.27

Номер группы: ЗИ-09

Фамилия: Сидоров

Имя: Сидор

Оценка:3

Ср. балл:3.42

Номер группы:

Программа:

Program File_4;

Uses CRT;

Var ocenka : 2..5; оценка

sr_ball : Real; средний балл

name : String[15]; фамилия или имя

nomer : String[10]; номер группы

baza : Text; текстовый файл

Begin

ClrScr;

Assign(baza, ‘d:\User\baza.txt’);

ReWrite(baza); открываем файл для записи

Repeat

Write(‘Номер группы:’);

ReadLn(nomer); вводим номер группы

If (Length(nomer) = 0) если длина строки с номером группы равна нулю (сразу нажата клавиша ENTER),

Then Break; то выходим из цикла ввода

Write(baza, nomer:10); если нет, то записываем его в файл в 10 позициях (по описанию переменной nomer)

Write(‘Фамилия:’);

ReadLn(name); вводим фамилию

Write(baza, name:15); записываем ее в файл в той же строке в 15 позициях

Write(‘Имя:’);

ReadLn(name); вводим имя

Write(baza, name:15); записываем его в файл в той же строке в 15 позициях

Write(‘Оценка:’);

ReadLn(ocenka); вводим оценку

Write(baza, ocenka:3); записываем ее в файл в той же строке в 3 позициях

Write(‘Ср. балл:’);

ReadLn(sr_ball); вводим средний балл

WriteLn(baza, sr_ball:6:2); записываем его в файл в 6 позициях и переходим на новую строку

Until (False); псевдобесконечный цикл с постусловием

Close(baza); закрываем файл

ReadLn;

End.

Структура созданного файла:

ИС-09 Иванов Иван 4 4.12

ПО-09 Петров Петр 5 4.27

ЗИ-09 Сидоров Сидор 3 3.42

10 позиций 15 позиций 15 позиций 3 поз. 6 поз.

Внимание! Все данные необходимо записывать в текстовый файлформатнымспособом, иначе их нельзя будет прочитать из этого файла. Записываемыечисловыеданные необходимо разделять хотя бы одним пробелом.

В данном случае для записи в файл выделяется

  1. для номера группы - 10позиций,

  2. для фамилии или имени - 15позиций,

  3. для оценки - 3позиции,

  4. для среднего балла - 6позиций.

При чтении разнотипных данных из текстового файла, записанных в одной строке, необходимо учитывать следующие особенности:

  1. строкичитаются в соответствии с их описанием: если строка описана какString[10],то будут прочитаны ровно 10 позиций,

  2. числачитаются до разделителя (пробела, запятой, признака конца строки),

  3. в списке ввода оператора чтения Read (ReadLn)формат переменныхне указывается.

Пример: прочитать из созданного ранее файла информацию и вывести ее на экран.

Программа:

Program File_3;

Uses CRT;

Var ocenka : 2..5; оценка

sr_ball : Real; средний балл

fam, name : String[15]; фамилия или имя

nomer : String[10]; номер группы

baza : Text; текстовый файл

Begin

ClrScr;

Assign(baza, ‘d:\User\baza.txt’);

ReSet(baza); открываем файл для чтения

While NOT(EOF(baza)) Do

Begin

ReadLn(baza, nomer, fam, name, ocenka, sr_ball); читаем из файла очередную строку с данными

WriteLn(nomer:10, fam:15, name:15, ocenka:3, sr_ball:6:2 ); выводим ее на экран

End;

Close(baza); закрываем файл

ReadLn;

End.

На экране появится:

ИС-09 Иванов Иван 4 4.12

ПО-09 Петров Петр 5 4.27

ЗИ-09 Сидоров Сидор 3 3.42

Конечно, правильное чтение данных из текстового файла возможно только тогда, когда мы точно знаем структуру этого файла.

Записи

На начальных этапах развития программирования, при решении математических, экономических или инженерных задач программисты, как правило, обходились десятком переменных, которые обрабатывались разными алгоритмами. С течением времени объемы обрабатываемых данных стали расти. Приходилось обрабатывать не один-два десятка чисел, а целые таблицы. К тому же таблицы стали содержать не только числовую, но и текстовую информацию. И тут на помощь пришли новые типы данных – массивы, строки, множества. С их помощью можно объединить несколько объектов под одним именем, а затем обращаться к ним поэлементно. Основное требование при создании таких структур – однотипность объединяемых объектов. Однако сложность многих реальных ситуаций требует для своего отражения более гибких средств программирования.

Практика показала, что для обработки больших совокупностей однотипных данных такая структура, как массив, очень полезна. Но массив полезен тогда, когда обрабатывается однотипная информация. Реальные задачи в большинстве своем имеют дело с обработкой данных различных типов: информация по кадрам, статистические данные, бухгалтерский учет, экономические задачи. В этих задачах существенно то, что совместно обрабатывается числовая и текстовая информация, причем, как правило, размерность обрабатываемых данных даже одного типа весьма различна. Например, для хранения данных об одном студенте (номер учебной группы, фамилия, имя, оценка по информатике, средний балл сдачи сессии) нельзя использовать один массив, так как эти данные разнотипны: номер группы, фамилия, имя – строки, оценка – целое, средний балл – вещественное. Конечно, можно использовать несколько массивов: один - для хранения номеров групп, второй – для хранения фамилий и имен, третий – для хранения оценок, четвертый – для хранения средних баллов и так далее. Связь между этими массивами можно установить с помощью индексов. При этом необходимо будет решать сложную задачу целостности информации. Например, если произвести сортировку фамилий во втором массиве по алфавиту, то соответствующим образом необходимо переставить элементы остальных массивов, чтобы фамилии соответствовали остальным данным. Это достаточно сложная задача.

Так возникла необходимость в особой структуре данных, которая позволила бы одновременно хранить и обрабатывать данные различных типов.

Для работы с данными различных типов, но объединенных в одну структуру под одним именем, в Паскале введен новый тип данных – запись.

Записи могут состоять из компонентов различных типов, называемых полями. Каждое поле можно рассматривать как отдельную переменную, имеющую свое имя.

В отличие от ранее рассмотренных типов данных, тип записи описывается в разделе определения типов:

Type TStudent = Record

nomer, fam, name : String[15];

ocenka : 2..5;

sr_ball : Real;

End;

Внимание! Описание записи заканчивается словомEnd, для которогонетсловаBegin.

Описан тип записи с именем TStudent, имеющий поля:

nomer, fam, name- номер группы, фамилия и имя – строки длиной15 символов,

ocenka- оценка по информатике – интервал от 2до5,

sr_ball- средний балл сдачи сессии – вещественное.

Таким образом, при описании полей указываются их имена и через двоеточие – типы. Описание заканчивается словом End.

После определения типа записи можно описать разные базовые структуры этого нового типа в разделе описания переменных: