Студопедия

КАТЕГОРИИ:

АвтоАвтоматизацияАрхитектураАстрономияАудитБиологияБухгалтерияВоенное делоГенетикаГеографияГеологияГосударствоДомЖурналистика и СМИИзобретательствоИностранные языкиИнформатикаИскусствоИсторияКомпьютерыКулинарияКультураЛексикологияЛитератураЛогикаМаркетингМатематикаМашиностроениеМедицинаМенеджментМеталлы и СваркаМеханикаМузыкаНаселениеОбразованиеОхрана безопасности жизниОхрана ТрудаПедагогикаПолитикаПравоПриборостроениеПрограммированиеПроизводствоПромышленностьПсихологияРадиоРегилияСвязьСоциологияСпортСтандартизацияСтроительствоТехнологииТорговляТуризмФизикаФизиологияФилософияФинансыХимияХозяйствоЦеннообразованиеЧерчениеЭкологияЭконометрикаЭкономикаЭлектроникаЮриспунденкция

Прямой доступ к элементам файла




 

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

Установка указателя

Процедура

Seek (<имя файловой переменной>, N)

устанавливает файловый указатель на N-й элемент. На­пример, Seek (F1, 3). Напомним, что элементы файла нумеруются с нуля.

Определение номера элемента

Функция

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

возвращает номер элемента, на который "смот­рит" файловый указатель.

Пример

Найти номер элемента, с которым будет выполняться следующая операция.

Решение

Воспользуемся функцией FilePos:

N:=FilePos(F1).

 

Определение количества элементов в файле

Функция

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

возвращает количество элементов в файле.

 

Удаление и переименование

Файлов

Удаление файлов. Процедура

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

удаляет файл на внешнем но­сителе, с которым связана файловая переменная.

Переименование файлов. Процедура

Rename (<имя файловой переменной>,

'<новое имя на дис­ке>')

переименовывает файл, связанный с данной фай­ловой переменной.

Пример 1

Ввести с клавиатуры и записать в файл DAN1.DAT последовательность целых чисел.

Решение

Сначала свяжем файловую переменную с конкрет­ным внешним файлом при помощи процедуры Assign. Откроем файл для записи посредством процедуры Rewrite. Признак конца последовательности чисел − ввод числа 0.

Program Example_83;

Var F: File Of Integer;

n: Integer;

Begin

Assign(F, 'DAN1.DAT');

{Связываем файловую переменнуюс файлом на диске}

Rewrite(F); {Открываем файл для записи}

Writeln('Конец ввода чисел - 0');

Repeat {Пока не будет введен 0}

Writeln('Введите число ');

Readln(n) ;

{Если введено число, отличное от 0, то

записываем его в файл}

If n<>0 Then Write(F, n);

Until n=0;

{Если введен 0, то выходим из цикла}

Close(F); {Закрываем файл}

End.

Пример 2

В файле DAN1.DAT записаны целые числа (см. пре­дыдущую задачу). Вычислить сумму элементов файла и результат вместе с исходными данными записать в файл DAN2.DAT.

Program Example_84;

Var F1, F2: File Of Integer;

{Файловые переменные}

S, N: Integer;

Begin{С файловой переменной F1 связываем

файл на диске}

Assign(F1, 'DAN1.DAT');

Reset(F1); {Открываем файл F1 для чтения}

Assign(F2,'DAN2.DAT') ;

{С файловой переменной F2 связываем

файл на диске}

Rewrite(F2) ;

{Открываем файл F2 для записи}

S:=0;

While Not EOf (F1) Do {Проверка на конец файла F1}

Begin

Read(F1, N);

{Чтение элемента из файла F1}

S:=S+N; {Накопление суммы}

Write(F2, N);

{Запись элемента в файл F2}

end;

Write(F2, S); {Запись суммы элементов

в конец файла F2}

Write('Результат находится

в файле DAN2.DAT')

Close(F1); {Закрываем файл F1}

Close(F2); {Закрываем файл F2}

Readln;

End.

 

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

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

Var A: Text;

    

Обработка текстовых файлов

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

Для чтения данных применяется процедура Read. Если необходимо после чтения данных перейти на сле­дующую строку, то используется процедура Readln. Если необходимо просто перейти к следующей строке, то можно использовать процедуру

Readln (<имя фай­ловой переменной

текстового файла>),

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

Процедура Write записывает данные в текущую строку. Если надо записать данные и перейти к следу­ющей строке, то можно использовать процедуру Writeln. Если требуется только перейти для записи на новую строку, то применяется процедура

Writeln (<имя файловой переменной

тексто­вого файла>),

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

Так как в строках может быть разное количество символов, имеется логическая функция

Еоln (<имя файловой переменной

текстового файла>),

ко­торая принимает значение True, если достигнут конец строки.

Кроме перечисленных процедур и функций, к текс­товым файлам применяется процедура

 

Арреnd (<имя файловой переменной

текстового файла>).

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

Пример 1

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

Решение

Пусть в файле содержится следующая информация:

 

-32 16 0 8 7    
4 5 9 13 11 -5 -8
6 -8 0 -12      
5 4 3 2 1 12  
1 2          
-1 -2 -4        
-1 -2 4        

 

Этот файл можно создать в среде Турбо Паскаль следующим образом:

¨ создайте новый файл посредством командыNewменю File;

¨ запишите все числа, разделяя их пробелами, и разбейте на строки, как указано в задании;

¨ сохраните файл, например, под именем INT1.DAT. Этот файл используется в программе, которая при­ведена ниже.

Program Example_85;

Var F: Text;

 х, k: Integer;

Begin

Assign(F, 'INT1.DAT'); {Связываем

файловую переменную с файлом на диске}

Reset(F); {Открываем файл для чтения}

While Not Eof (F) Do

{Пока не достигнут конец файла}

Begin

k:=0; {Счетчик элементов строки}

While Not Eoln(F) Do  

{Пока не достигнут конец строки}

Begin

Read(F, x);

{Считываем очередное число}

Write(х, ' ');

{Выводим его на экран}

Inc(k); {Увеличиваем счетчик }

End;

Writeln('В строке ', k,' элементов');

Readln(F); {Переходим к следующей строке файла}

End;

Close(F); {Закрываем файл}

Readln;

End.

Пример 2

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

Решение

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

Program Example_86;

Var F: Text;

k1, k2, n: Integer;

Ch: Char;

Logic, Pp: Boolean;

Begin{С файловой переменной F связываем

 файл на диске}

Assign(F, 'TEST.PAS');

Reset(F); {Открываем файл для чтения}

n:=0; {Счетчик количества строк}

Logic:=True; {Пока ошибок не было,

переменная Logic имеет значение True}

While Not EOf (F) Do

{Пока не достигнут конец файла}

Begin

Inc(n); {Увеличиваем счетчик

количества строк}

k1:=0; {Счетчик количества

открывающих скобок}

k2:=0; {Счетчик количества

закрывающих скобок}

Pp:=False; {Переменная Pp

предназна­чена для определения ошибки расста­новки скобок в строке. Она

принимает значение True, когда

обнаруживается ошибка}

While Not Eoln (F) Do {Пока не

достигнут конец текущей строки файла}

Begin

Read(F, Ch); {Читаем очередной

символ строки. Если встретили

открывающую скобку, то увеличиваем

соответствующий счетчик}

If Ch='(' Then Inc(k1);

{Если закрывающая скобка стоит

после открывающей (k1>k2), то

просто уве­личиваем счетчик. Иначе –

устанавли­ваем Pp в True}

If (Ch=')') Then

If (k1>k2) Then Inc(k2)

Else Pp:=True;

End;

{Если не все закрывающие скобки

расставлены (k1<>k2) или одна из

закрывающих скобок стоит раньше

открывающей (Pp=True), то была

ошибка расстановки}

If (k1<>k2) or Pp Then

Begin

Writeln('Ошибка в ',N,' строке');

Logic:=False;

End;

Readln(F);{Переходим на следующую

строку файла}

End;

{Если значение переменной Logic осталось

ис­тинным, то ошибок расстановки не было}

If Logic Then

Writeln('Cкобки расставлены правильно');

Close(F); {Закрываем файл}

Readln;

End.

Нетипизированные файлы

     

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

Var F: File.

Нетипизированные файловые переменные предназначены для низкоуровневой работы с файлами.

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

Для работы с нетипизированными файлами можно применять почти все процедуры и функции, что и для типизированных. Исключение составляет то, что вместо процедур Read и Write используются процедуры BlockRead и BlockWrite, а процедуры Reset и Rewrite могут иметь второй параметр типа Word, который определяет размер записи, используемый при передаче данных. Если этот параметр опущен, то размер записи принимается по умолчанию равным 128 байтам.










Последнее изменение этой страницы: 2018-05-31; просмотров: 237.

stydopedya.ru не претендует на авторское право материалов, которые вылажены, но предоставляет бесплатный доступ к ним. В случае нарушения авторского права или персональных данных напишите сюда...