ВІКІСТОРІНКА
Навигация:
Інформатика
Історія
Автоматизація
Адміністрування
Антропологія
Архітектура
Біологія
Будівництво
Бухгалтерія
Військова наука
Виробництво
Географія
Геологія
Господарство
Демографія
Екологія
Економіка
Електроніка
Енергетика
Журналістика
Кінематографія
Комп'ютеризація
Креслення
Кулінарія
Культура
Культура
Лінгвістика
Література
Лексикологія
Логіка
Маркетинг
Математика
Медицина
Менеджмент
Металургія
Метрологія
Мистецтво
Музика
Наукознавство
Освіта
Охорона Праці
Підприємництво
Педагогіка
Поліграфія
Право
Приладобудування
Програмування
Психологія
Радіозв'язок
Релігія
Риторика
Соціологія
Спорт
Стандартизація
Статистика
Технології
Торгівля
Транспорт
Фізіологія
Фізика
Філософія
Фінанси
Фармакологія


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

1. Описать файловую переменную.

2. Описать переменную того же типа.

3. Выполнить назначение (Assign).

4. Открыть файл для чтения (Reset).

5. В цикле читать из файла (Read).

6. Закрыть файл (Close).

Пример 5. Определить среднюю температуру для значений, хранящихся в файле Temp.dat.

Program Task2;

Var Ft: File Of Real;

T,St: Real; N: Integer;

Begin Assign(Ft,'Temp.dat');

Reset(Ft);

St:=0;

While Not Eof(Ft) Do

Begin

Read(Ft,T);

St:=St+T

End;

N:=FileSize(Ft);

St:=St/N;

WriteLn('Средняя температура зa',N:3,'суток равна',St:7:2,'гр-в');

Close(Ft)

End.

В этой программе использована функция определения размера файла:

FileSize (<имя файловой переменной>);

Ее результат — целое число, равное текущей длине файла.

Замечание: согласно стандарту Паскаля в файл, открытый оператором Rewrite, можно только записывать информацию, а файл, открытый оператором Reset, можно использовать только для чтения. В Турбо Паскале допускается запись (Write) в файл, открытый для чтения (Reset). Это создает определенные удобства для модификации файлов.

Текстовые файлы. Текстовый файл — наиболее часто употребляемая разновидность файлов. Как уже отмечалось раньше, немагнитные внешние устройства (логические) работают только с текстовыми файлами. Файлы, содержащие тексты программ на Паскале и других языках программирования, являются текстовыми. Различная документация, информация, передаваемая по каналам электронной связи, — все это текстовые файлы.

В программе файловая переменная текстового типа описывается следующим образом:

Var <идентификатор>:tехt;

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

 

Каждая строка заканчивается специальным кодом — маркером конца строки (м.к.с.). Весь файл заканчивается маркером конца файла (м.к.ф.). Схематически это выглядит так:

 

Каждый символ представлен во внутреннем коде (ASCII) и занимает 1 байт. Текстовый файл отличается от символьного не только делением на строки. В текстовой файл можно записать и из него прочитать информацию любого типа. Если эта информация несимвольная, то в процессе чтения или записи происходит ее преобразование из символьной формы во внутреннюю и обратно.

Текстовый файл можно создать или преобразовать с помощью текстового редактора. Его можно просмотреть на экране дисплея или распечатать на принтере.

В программах на Паскале для работы с текстовыми файлами наряду с процедурами Read и Write употребляются процедуры ReadLn и WriteLn.

ReadLn(FV,<CПИСок ввода>)

Эта процедура читает строку из файла с именем FV, помещая прочитанное в переменные из списка ввода.

WriteLn(FV,<список вывода>)

Процедура записывает в файл FV значения из списка вывода, после чего выставляет маркер конца строки.

Для обнаружения конца строки в текстовом файле используется функция

Eoln(FV)

(End of line — конец строки). Это логическая функция, которая принимает значение true, если указатель файла достиг маркера конца строки и false — в противном случае.

Употребление операторов Read и ReadLn без указания имени файловой переменной обозначает чтение из стандартного файла Input (ввод с клавиатуры). Употребление операторов Write и WriteLn без имени файловой переменной обозначает запись в стандартный файл Output (вывод на экран). В таком варианте этими операторами мы уже многократно пользовались. Считается, что файлы INPUT и OUTPUT всегда открываются соответственно для чтения и записи при работе любой программы.

При вводе с клавиатуры маркер конца строки обнаруживается при нажатии на клавишу Enter.

Процедура ReadLn может использоваться без списка ввода. В этом случае происходит пропуск текущей строки в читаемом файле.

Употребление процедуры WriteLn без списка вывода обозначает вывод пустой строки (в файле выставляется маркер конца строки).

При записи в текстовый файл в списке вывода могут присутствовать форматы. Действия форматов мы уже рассматривали при обсуждении вывода данных на экран. Точно так же форматы работают и при выводе в текстовые файлы, связанные с любыми другими устройствами.

Пример 6. Пусть файл с именем Note.txt содержит некоторый текст. Требуется подсчитать количество строк в этом тексте.

Var Note: Text; К: Integer;

Begin Assign (Note,'Note.txt');

Reset(Note);

K:=0;

While Not Eof(Note) Do

Begin

ReadLn(Note); K:=K+1

End;

WriteLn ('Количество строк равно',К);

Close(Note)

End.

Используемый здесь оператор ReadLn (Note) «пролистывает» строки из текстового файла Note, не занося их в какую-либо переменную.

Пример 7. В текстовом файле Note.txt определить длину самой большой строки.

Var Note: Text;

Max,К: Integer; С: Char;

Begin

Assign(Note,'Note.txt');

Reset (Note);

Max:=0;

While Not Eof(Note) Do

Begin

K:=0;

While Not Eoln(Note) Do

Begin

Read(Note,C); K:=K+1

End;

If K>Max Then Max:=K;

ReadLn(Note)

End;

WriteLn('Наибольшая строка имеет', Max,'знаков');

Close(Note)

End.

Здесь каждая строчка прочитывается посимвольно, при этом в переменной к работает счетчик числа символов в строке. В переменной Мах отбирается наибольшее значение счетчика.

Комбинированный тип данных

Все структурированные типы данных, с которыми мы уже познакомились, представляют собой совокупности однотипных величин. Комбинированный тип данных — это структурированный тип, состоящий из фиксированного числа компонент (полей) разного типа. Комбинированный тип имеет еще и другое название — запись.

Обычно запись содержит совокупность разнотипных атрибутов, относящихся к одному объекту. Например, анкетные сведения о студенте вуза могут быть представлены в виде информационной структуры (рис. 35).

 

Такая структура называется двухуровневым деревом. В Паскале эта информация может храниться в одной переменной типа Record (запись). Задать тип и описать соответствующую переменную можно следующим образом:

Type Anketa1=Record

FIO: String[50]; {поля}

Pol: Char;

Dat: String[16]; {записи}

Adres: String[50];

Curs: 1..5; (или элементы)

Grup: 1..10;

Stip: Real {записи}

End;

Var Student: Anketa1;

Такая запись, так же как и соответствующее ей дерево, называется двухуровневой.

К каждому элементу записи можно обратиться, используя составное имя, которое имеет следующую структуру:

<имя переменной>.<имя поля>

Например, student. fio; student. dat и т.п. Если, например, требуется полю курс присвоить значение 3, то это делается так:

Student.Curs:=3 ;

Поля записи могут иметь любой тип, в частности сами могут быть записями. Такая возможность используется в том случае, когда требуется представить многоуровневое дерево (более 2 уровней). Например, те же сведения о студентах можно отобразить трехуровневым деревом (рис.36).

 

Такая организация данных позволит, например, делать выборки информации по году рождения или по городу, где живут студенты. В этом случае описание соответствующей записи будет выглядеть так:

Type Anketa2=Record

FIO: String[50];

Pol: Char;

Dat: Record

God: Integer;

Mes: String[10];

Den: 1..31

End;

Adres: Record

Gorod: String[20];

UlDomKv: String[30];

End;

Curs: 1..5 ;

Grup: 1..10;

Stip: Real

End;

Var Student: Anketa2;

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

Например, student.Dat.God; student.Adres.Gorod.

Приведем структурограмму задания комбинированного типа (рис.37).

 

В программе могут использоваться массивы записей. Если на факультете 500 студентов, то все анкетные данные о них можно представить в массиве:

Var Student: Array[1..500] Of Anketal;

В таком случае, например, год рождения пятого в списке студента хранится в переменной student[5].Dat.God.

Любая обработка записей, в том числе ввод и вывод, производится поэлементно. Например, ввод сведений о 500 студентах можно организовать следующим образом:

For I:=1 То 500 Do

With Student[I] Do

Begin

Write('Ф.И.0.:'); ReadLn(FIO);

Write('Пол (м/ж):'); ReadLn(Pol);

Write('Дата рождения:'); ReadLn(Dat);

Write('Адрес:'); ReadLn(Adres);

Write('Курс:'); ReadLn(Curs);

Write('Группа:'); ReadLn(Grup) ;

Write('Стипендия (руб.):'); ReadLn(Stip)

End;

В этом примере использован оператор присоединения, который имеет следующий вид:

With <переменная типа запись> Do <оператор>;

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

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

Работа с файлами записей. Чаще всего записи используются как элементы файлов, составляющих компьютерные информационные системы. Рассмотрим примеры программ, работающих с файлами записей.

Пример 1. Сформировать файл FM.dat, содержащий экзаменационную ведомость одной студенческой группы. Записи файла состоят из следующих элементов: фамилия, имя, отчество; номер зачетной книжки; оценка.

Program Examen;

Type Stud=Record

FIO: String[30];

Nz: String[6];

Mark: 2..5

End;

Var Fstud: File Of Stud;

S: Stud;

N,I: Byte;

Begin

Assign(Fstud,'FM.DAT'); Rewrite(Fstud);

Write('Количество студентов в группе?');

ReadLn(N);

For I:=1 To N Do

Begin

Write(I:1,'-й,Фамилия И.О.'); ReadLn(S.FIO);

Write('Номер зачетки:'); ReadLn(S.Nz);

Write('Оценка:'); ReadLn(S.Mark);

Write(Fstud,S)

End;

WriteLn('Формирование файла закончено!');

Close(Fstud)

End.

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

Прямой доступ к записям файла

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

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

Seek(FV,n)

Здесь FV — имя файловой переменной, n — порядковый номер элемента. В следующем примере эта процедура будет использована.

Пример 2. Имеется файл, сформированный программой из предыдущего примера. Пусть некоторые студенты пересдали экзамен и получили новые оценки. Составить программу внесения результатов переэкзаменовки в файл. Программа будет запрашивать номер студента в ведомости и его новую оценку. Работа заканчивается, если вводится несуществующий номер (9999).

Program New_Marks;

Type Stud=Record

FIO: String[30];

Nz: String[6] ;

Mark: 2..5

End;

Var Fstud: File Of Stud;

S: Stud;

N: Integer;

Begin

Assign(Fstud,'FM.DAT');

Reset(Fstud) ;

Write('Номер в ведомости?');

ReadLn(N);

While N<>9999 Do

Begin

Seek(Fstud,N-l);

Read(Fstud,S);

Write(S.FIO,'оценка?');

ReadLn(S.Mark);

Seek(Fstud,N-l);

Write(Fstud,S);

Write('Номер в ведомости?');

ReadLn(N);

End;

WriteLn('Работа закончена!');

Close(Fstud)

End.

Пример требует некоторых пояснений. Список студентов в ведомости пронумерован, начиная от 1, а записи в файле нумеруются от 0. Поэтому, если n — это номер в ведомости, то номер соответствующей записи в файле равен n-1. После прочтения записи «номер n—1» указатель смещается к следующей n-й записи. Для повторного занесения на то же место исправленной записи повторяется установка указателя.

© 2013 wikipage.com.ua - Дякуємо за посилання на wikipage.com.ua | Контакти