Область видимости идентификаторов
Процедуры или функции, как выше сказано, могут содержать внутри себя описание других переменных. Более того, процедуры и функции могут содержать внутри себя описание других процедур и функций, а те в свою очередь – описания других переменных, процедур и функций и т.д. Отсюда возникает проблема определения области действия переменных. Дадим определение: область действия описания конкретного идентификатора называют его областью видимости. Приведем следующие правила определения области видимости идентификаторов (переменных). 1. Глобальными переменными называются переменные, описанные в головной программе. Они доступны в любом ее месте и во всех ее подпрограммах. 2. Подпрограмма описывается в некотором описательном разделе назовем его внешним и сама имеет описательный раздел - назовем его внутренним. Локальные переменные - это переменные, описанные в процедурах и функциях, они доступны во всех частях данной подпрограммы и в любых внутренних описательных разделах, но недоступны в тех блоках программы, которые соответствуют внешним описательным разделам. На рисунке 17.1 приведена структура программы с вложенными подпрограммами: в головную программу вложена процедура 1 и процедура 2. В свою очередь в процедуру 1 вложена функция 1. Во всех процедурах и функциях этой программы будут видны, а также можно использовать глобальные Рис. 17.1
переменные головной программы. Локальные переменные функции 1 и процедуры 2 не будут видны в процедуре 1 и в головной программе. Однако локальные переменные, описанные в процедуре 1, будут видны, также как и глобальные переменные, в функции 1 (она вложена в процедуру 1). В следующем примере процедура prog1 вложена в головную программу p34. В эту процедуру вложена, в свою очередь, процедура prog2. Пример:
program p34; var х: Integer ; { глобальная переменная }
procedure prog1; { Начало описания процедуры prog1} var у: Integer; { локальная переменная }
procedure prog2; { Начало описания процедуры prog2 } var z: Integer; { локальная переменная } begin { Тело процедуры ргоg2: доступны переменные х, у, z } ………….. end;
begin { тело процедуры prog1: доступны переменные х, у } ……………… end;
begin { тело головной программы: доступна переменная х } ………….. end.
Задача: написать функцию для возведения целых чисел в натуральную степень.
program рЗ6; { Описание процедуры Istep } procedure Istep(x, n: integer ; Var p: Longint); { x - целое число, n - натуральная степень, р – результат выполнения процедуры, т.е. х в степени n. Этот параметр передаётся по ссылке } var i : integer; { локальная переменная } begin p : = x ; for i: = 2 to n do p := p * x; end; { конец процедуры Istep }
var { описание глобальных переменных } k: Longint; begin { тело головной программы } Istep(3, 3, k); { обращении к процедуре Istep. Первые два фактических параметра равны 3. Фактическая переменная k, передаваемая в процедуру по ссылке, после выполнения процедуры будет содержать результат: 3 в степени 3. } Writeln( ‘3 в степени 3=’ , k); pstep (5, 6, k) ; { обращении к процедуре Istep } Writeln(‘5 в степени 6=’ , k); pstep (7, 4, k); { обращении к процедуре Istep } Writeln(‘7 в степени 4=’ , k); end.
Файлы Основные понятия Файлы в программе – это каналы, по которым можно выполнять передачу данных. Под файлом понимают набор данных, которые считываются или записываются на внешние устройства. В языке Паскаль имеются три вида файлов: текстовые, типизированные и нетипизированные. Файловая система Паскаля — это часть DOS (дисковой операционной системы). Она имеет древовидную структуру. Корневой каталог, например диска С (логические диски имеют идентификаторы соответствующие буквам английского алфавита - А, В, С, D... ) может содержать подкаталоги, в которых возможно находятся другие подкаталоги и т. д. В корневом каталоге и во всех подкаталогах содержатся файлы. Любой файл характеризуется основным именем и расширением, которые разделяются точкой. Основное имя состоит максимум из восьми символов, а расширение - максимум из трех символов. Расширение, как правило, указывает на предназначение файла. Например, pas - текст программы на Паскале, txt - текстовый файл, dat - файл с данными и т. п. Примеры: turbo.ехе met_pas.pas tools.с gol_txt autoexec.bat Каким образом программы, работающие с файлами, знают где находятся необходимые файлы, в каком именно подкаталоге? Для решения этой проблемы при передаче программе или подпрограмме "местонахождения" файла можно воспользоваться понятием - путь к файлу. В Паскале путь к файлу - это символьная строка, заключенная в апострофы. Она формируется из имени логического диска и имен системы вложенных подкаталогов, последним из которых является тот, где непосредственно находится файл. В строке имена подкаталогов разделяются символом "\" (обратный слэш). Пример файловой системы:
Примеры: 'C:\TURBO\BGI' ‘D:V’ ‘D:\ARM\BLM\STOP' 'C:\TOOLS\MOUSE’
Файлом (файловой переменной) в Паскале является объект типа file. При использовании файловой переменной необходимо учитывать следующие ограничения: 1.Файловой переменной не разрешается присваивать другое значение. 2.Если требуется передать файловую переменную в процедуру или функцию, то соответствующий параметр передают по ссылке, т.е. используют ключевое слово Var. Типизированные файлы Типизированный файл состоит из последовательности однотипных или одинаковых компонент и может содержать различное их число (возможно ни одной). Тип компонент файла практически любой, но он не должен содержать внутри себя других файлов. Определяются файловые переменные следующим образом:
<список идентификаторов - имен файловых переменных>: File of <тип компонентов файла>; Примеры: var fl : File of Byte; f2 : File of Char; f3, f4: File of Integer; f5 : File of RJon;
Файловая переменная связывается с именем файла на логическом диске. Для этого используют следующую процедуру Assign с двумя параметрами: Assign ( fl1, St); Здесь fl1- файловая переменная, передаваемая по ссылке; S — путь и/или полное имя файла. Примеры: assign(f, 'с:\turbo\bgi\bgi.scr’); assign(fl, 'c:\arm.txt'); assign (f 2, 'd:\pols\data\car.dat'); assign(f3, 'mytext');
В операционной системе есть понятие - текущего подкаталога или буквально — подкаталога, на котором находится указатель операционной системы. Все файловые операции, при которых явно не указывается путь к файлу, происходят именно в текущем подкаталоге. В Паскале для работы с файлами из текущего каталога достаточно при вызове процедуры assign указать только полное имя файла (последний пример из выше приведённых). Чтобы начать работу с файлом, требуется его открыть. Попытка работы с неоткрытым файлом приведет к ошибке. Существует две процедуры для открытия файла. Первая – Reset с одним параметром. Обращение к ней: Reset( F); Здесь F – файловая переменная. Эта процедура открывает существующий файл, связанный с файловой переменной F. Работая с файлами, приходится опираться на понятие - указателя в файле или файлового указателя. При открытии файла указатель устанавливается перед его первой компонентой. Вторая процедура Rewrite также с одним параметром. Обращение к ней: Rewrite(F); Она создаёт и открывает новый файл, связанный с файловой переменной F. Если файл с указанным именем уже существует, то старый файл будет стёрт и создан новый пустой файл. Текущий указатель файла устанавливается в его начало. В программе любой файл (файловая переменная) может быть открыт повторно, т. е. файл, первоначально открытый для чтения, может быть открыт для записи и наоборот. Одна и та же файловая переменная может быть связана с различными физическими файлами ( но не одновременно). Пример: program p43; var f: file of byte; begin assign(f, 'c:\pols.txt'); rewrite (f) ; {...} close (f); assign(f, 'c:\news.txt'); reset (f) ; {...} close (f) ; end. Часто важно знать находится ли указатель в конце файла (за последней компонентой)? В этом случае можно воспользоваться логической функцией Eof, которая возвращает значение true - если указатель в конце файла и false - если нет. Её параметром является файловая переменная. Примеры фрагментов с использованием функции Eof: t:= Eof(fl); if Eof(f1) then... While not Eof (f2) do....
Указатель файла можно воспринимать как обычный номер текущей компоненты, которые нумеруются начиная с нуля. Таким образом, типизированные файлы являются структурой данных прямого доступа по номеру его компоненты. Чтение из типизированного файла осуществляется процедурой Read. Read(<файловая переменная>, <список переменных>); Примеры: Read(f , a); Read, (f, a, b, с) ; Переменные считываются из файла и после выполнения каждой операции считывания указатель файла перемещается на следующую компоненту. program р44; var f: file of byte; a, b, c: byte; begin assign(f, 'dospl. pas'); reset (f); read(f, a, b, c); writeln{'a= ', a, ' b= ', b, ' c= ', c); close(f); end. Запись в файл осуществляется с помощью процедуры Write. Write(<файловая переменная>,<список переменных>);
Переменные записываются в файл и после каждой записи указатель в файле перемещается за последнюю компоненту. Для перемещения указателя по файлу можно использовать процедуру Seek. Обращение к ней: Seek( f; n); После вызова процедуры указатель файла f перемещается на компоненту с номером n. Например, вызов Seek(f, FileSize(f)); приведет к перемещению указателя в самый конец файла (за последнюю компоненту). Для определения номера компоненты, на которой находится указатель файла используют функцию FilePos. Обращение к ней: FilePos( f) . Функция возвращает целое число - номер текущей компоненты (тип Longint). Если процедура FilePos возвратила значение 0, то указатель стоит в самом начале файла перед первой компонентой. Если функции FilePos и FileSize возвращают одинаковые значения, то указатель находится в самом конце файла. Обращение к последней функции также содержит только файловую переменную. Результат выполнения функции FileSize - длинное целое число размер файла или количество его компонент (тип Longint). Если функция возвращает ноль, то файл пуст. После работы с файлом (файловой переменной) или перед повторным открытием для корректного взаимодействия с операционной системой его необходимо закрыть. С этой целью используют процедуру Close. Обращение к ней содержит только один параметр – файловую переменную. Примеры: program p45; { открываем файл для записи с именем file.int, компонентами которого являются целые числа. Записываем в файл квадраты натуральных чисел от 1 до 100 } var f: file of Integer; {описываем файловую переменную} i, t: integer; begin Assign(f, 'file.int'); {связываем файловую переменную с именем файла на диске} Rewrite(f); {открываем файл для записи} for i :=1 to 100 do begin t:= sqr(i); Write (f, t);{выводим в файл квадраты целых чисел} end; Close(f); {закрываем файл} end.
program p46; {открываем созданный предыдущей программой файл для чтения и выводим его содержание на экран} var f: file of Integer; {описываем файловую переменную} i, t: integer; begin Assign (f, ' file.int' ) ; { связываем файловую переменную с именем файла на диске} Reset(f); {открываем файл для чтения} While not Eof(f) do begin Read(f, t); {читаем очередную компоненту из файла и..} Write(t, ‘ ‘); {выводим ее на экран} end; Close{f); {закрываем файл} end. Когда приходится хранить в файле информацию о множестве объектов, у каждого из которых много различных признаков (значений различного типа), компонентами типизированных файлов можно делать записи. Задача. Создать программу, записывающую в файл данные о книгах, хранящихся в библиотеке. Для каждой книги требуется следующая информация: номер, фамилия и. о. автора, название книги, количество страниц и год издания. program p47; type Books = record N: Integer; Avtor: String[45]; Nazv: String[70]; Str: Integer; God: Integer; end; var bf: file of Books; r: Books; n, i: integer; begin Writeln('Введите количество книг '); Readln(n); Assign(bf, 'bibl. dat'); Rewrite(bf); for i: = 1 to n do begin r. n:= i; Write('введите фамилию и. о. автора '); Readln(r. avtor); Write('введите название книги '); Readln(r. nazv); Write('введите количество страниц '); Readln(r.str) ; Write('введите год издания '); Readln(r. god) ; Write(bf, r); end; Close(bf); end. Задача. В файле, компонентами которого являются записи - точки плоскости (record х, у: real; end;), выбрать только те, которые находятся в первой и третьей координатных четвертях и записать их в другой файл. Вывести на экран размеры первого и второго файлов. program p48; type points= record х, у: real; end; var fl, f2: file of points; p: points; s1, s2: String; i, nl, n2: Longlnt; begin Write('введите имя исходного файла '); Readln(sl); Write('введите имя результирующего файла '); Readln(s2) ; Assign(fl,s1);{связываем файловые переменные} Assign(f2, s2); {с введенными именами файлов) Reset (fl); {первый файл открываем для чтения} Rewrite(f2); {а второй для записи} While not Eof (fl) do begin Read(fl,p);{читаем очередную запись из первого файла} if ((р. х > 0) and (p. у > 0)) or ((р. х < 0) and (p. у < 0)) then {если точка принадлежит первой или третьей четверти, то выводим ее во второй файл; данное условие можно было записать проще, но менее понятно: if p.x*p. y>0 then... } Write(f2, p); end; nl:=FileSize(f1); {получаем объем первого файла} n2:=FileSize(f2); {... второго} Writeln('nl= ', nl, ' n2 = ', n2); Close(fl); {закрываем файлы} Close (f2) ; end. Если мы открываем файл в программе, то неплохо бы предвидеть различные аварийные ситуации: отсутствует файл с таким именем, не вставлен диск в дисковод и др. При возникновении подобных ситуаций в обычном режиме программа прерывается по ошибке. Но существует возможность избежать этого: директива компилятору {$i-} выключает режим проверки и реакции на ошибки ввода/вывода, а директива {$i+} включает. Однако продолжить выполнение программы в аварийной ситуации недостаточно, важно запрограммировать реакцию на нее - обработать ошибку. Для этого предназначена функция IOResult (результат выполнения операции ввода/вывода). function IOResult: Integer; Функция возвращает целое значение. Если операция ввода/вывода не привела к ошибке, то ее значение ноль, в противном случае функция возвращает номер ошибки. Если ошибка произошла, то все последующие операции ввода/вывода игнорируются до тех пор, пока не будет вызвана функция IOResult. Номера ошибок: 100 Disk read error (ошибка диска при чтению); 101 Disk write error (ошибка диска при записи); 102 File not assigned (файловая переменная не связана с физическим файлом); 103 File not open (файл не открыт); 104 File not open for input (файл не открыт для ввода); 105 File not open for output (файл не открыт для вывода); 106 Invalid numeric format (недопустимый числовой формат). Задача. Проверить существует ли файл с введенным с клавиатуры именем. Если существует, то получить файл с новым именем, в котором порядок следования компонент - байт, изменен на обратный. program p4 9; var fl, f2: file of byte; b: byte ; sl, s2: String; n, i: Longint; begin Write('введите имя исходного файла '); Readln(sl); Write('введите имя результирующего файла '); Readln(s2); Assign(fl,s1);{связываем файловые переменные с } Assign{f2,s2);{введенными именами файлов} {$i-} {- отключаем контроль ошибок в/в} Reset (f1); {первый файл открываем для чтения) if IOResult <> 0 then begin Writeln('Произошла ошибка, файл ', s1,'не существует'); Halt; {прерываем программу} end; {$I+} {- включаем контроль ошибок в/в } Rewrite(f2); { второй файл для записи} n:= FileSize (f1); for i:= n - 1 downto 0 do begin Seek(fl, i); {- устанавливаем указатель на i-ую компоненту первого файла} Read(fl, b); {- читаем эту компоненту} Write(f2, b); {и записываем во второй файл} end; Close(fl); {закрываем файлы} Close (f2) ; End. Задача. Создайте программу, осуществляющую поиск по начальной части фамилии автора и выводящую на экран подходящие записи из файла о книгах (программа р47). program p50; type Books = record N: Integer; Avtor: String[45]; Nazv: String[70]; Str: Integer; God: Integer; end; var bf: file of Books; r: Books; i: integer; s: String; begin Writeln('Введите начальную часть фамилии автора'); Readln(s); Assign(bf, 'bibl.dat’); {Si-} {- отключаем контроль ошибок в/в} Reset(bf); {файл открываем для чтения} if IOResult <> 0 then begin Writeln('Произошла ошибка, файл bibl.dat не существует'); Halt; (прерываем программу} end; {$I+} {- включаем контроль ошибок в/в} While not Eof(bf) do begin Read(bf, r); { Функция Pos(SubS, S: String): Byte возвращает позицию, начиная с которой в строке S располагается подстрока SubS (0 - S не содержит SubS).} if pos(s, r. avtor) = 1 then Writeln(r. n: 3, r. avtor: 12, r. nazv: 14, r. str: 6, r. god: 8) ; end; Close(bf) ; end. Для работы с файловой системой нам могут понадобиться следующие процедуры из модуля System: procedure ChDir(s: string); Процедура изменяет текущий каталог. Здесь s-выражение, содержащее путь к новому каталогу. Пример: program p51; Var S: String; begin Write('Введите путь к каталогу'); Readln(S); {$i-} ChDir(S); if IOResult <> 0 then Writeln('Данный каталог отсутствует'); end. Следующая процедура procedure GetDir(d: byte; var s: string); - возвращает имя текущего каталога для заданного логического диска. Здесь d – выражение целого типа; s -параметр переменная. (d=0 - означает текущий логический диск, d=1 - диск A, d=2 - диск В и т. д.) Пример: program p52 ; var s: String; begin GetDir (0, s) ; Writeln (' текущий каталог ', s); end. Процедура procedure MkDir(s: string); создает новый каталог. Здесь s - строковое выражение, содержащее путь и имя каталога. Следующая процедура procedure RmDir(s; string); удаляет пустой каталог. Здесь s - путь и имя каталога. Пример: program р53; var S: String; begin S : = ' ABCD ' ; {создаем новый каталог} MkDir(S) ; { . . . и сразу его удаляем} RmDir (S) ; end. Процедура procedure Erase(var j); удаляет файл. Здесь f- переменная файлового типа, связанная с именем внешнего файла с помощью процедуры Assign. Пример: program p54; var F: file; Ch : Char ; S: String; begin Write (' Введите имя удаляемого файла ')/' Readln(S); Assign(F, S) ; {Si-} Reset (F) ; if lOResult <> 0 then Writeln (' файл ' , S, ' отсутствует') else begin Close (F) ; Write ( 'Удалять ', S, '? (y/no) ' ) ; Readln(Ch) ; {Function UpCase(C: char): Char Преобразует латинскую букву в заглавную.} if UpCase(Ch) = 'Y' then Erase (F) ; end; end. Процедура procedure Rename(var f; newname: string); переименовывает файл. Здесь f - переменная файлового типа; newname - строка, содержащая новое имя внешнего файла. Пример: program p55; var f: file; S1, S2: String; begin Write('Введите имя файла'); Readln(S1); Write('Введите новое имя файла '); Readln(S2); Assign(f, S1); Writeln{'Файл ', S1, ' переименован в ', S2); Rename(f, S2} ; end. Текстовые файлы В DOS текстовые файлы физически не отличаются от любых других, но в Паскале различия существенны. Элементами текстовых файлов являются символы, объединенные в строки, но текстовый файл это не file of Char или file of String. Каждая строка заканчивается в текстовом файле символом возврата каретки CR=#13 и перевода строки LF=#10. Заканчивается текстовый файл признаком конца файла SUB=#26. Работа с текстовыми файлами очень напоминает работу с консолью. Чтение из текстовых файлов очень похоже на ввод с клавиатуры, а запись в файл напоминает вывод на экран. Указатель в текстовом файле имеет много общего с текстовым курсором. Доступ к элементам текстового файла организуется последовательно. Указатель при считывании очередного элемента файла перемещается к следующему элементу. Для записи в текстовый файл или чтения их него можно использовать процедуры Read, Readln, Write, Writeln. В качестве первого параметра в этих процедурах указывается файловая переменная, например: Read(fp, a, s); Здесь происходит присваивание переменным a и s значений двух очередных элементов их файла, связанного с файловой переменной fp. При выполнении программы на Паскале автоматически открываются два стандартных файла текстового типа. Стандартные файлы имеют имена файловых переменных Input и Output. Стандартная файловая переменная Input представляет собой доступный только для чтения файл для ввода символов с клавиатуры. Вторая файловая переменная Output связана с доступным только для записи стандартным устройством вывода символов и графических элементов на экран монитора. Обращение к файлам Input и Output.происходит автоматически, без каких-либо дополнительных средств с помощью операторов Read, Readln, Write, Writeln. Имя файла в этих процедурах не указывается, если работа ведётся со стандартным файлом. Приведём пример переназначения стандартных файлов (т.е. ввод с клавиатуры и вывод на экран) дисковым файлам. program p73; var N, M: longint; ………. begin assign(Input, 'c:\test.txt'); reset (Input) ; ……………. Read(N, M); …………….. close (Input); ………………… assign(Output, 'c:\test_rez.txt'); rewrite(Output) ; ……….. Write(N, M); ………………. close (Output) ; end. Таким образом, эта программа введёт значения переменных N и M из текстового файла test.txt и выведёт результаты работы (значения переменных N и M) в файл test_rez.txt . Файловая переменная для текстового файла описывается следующим образом: <список идентификаторов - имен файловых переменных>:Text; При работе с текстовым файлом, файловую переменную связывают с именем файла, обращаясь к процедуре Assign, а открывают для чтения и записи процедурами Reset и Rewrite соответственно. Процедура Reset открывает текстовый файл только для чтения. Открытый файл закрывается с помощью процедуры Close. В текстовый файл, как и на экран, мы можем выводить значения выражений практически любого типа. При выводе значений операторами Write и WriteLn можно пользоваться стандартными средствами форматирования данных. Примеры: Write(f, x: 6: 4); Writeln(g, 'Т= ' , f 5: 2) ; После вывода оператором Write указатель текстового файла остается в конце выведенной строки, a WriteLn - переходит на начало следующей. Примеры: program p56; {Программа выводит в текстовый файл матрицу n*m} const n= 3; m= 4 ; var Т: array[1.. n, 1.. m] of real; f: Text; {описываем файловую переменную} S: String; i, j: integer; begin Writeln('введите элементы матрицы ', n, '*', m) ; For i:= 1 to n do for j : = 1 to m do begin Write ('T[' , i, *, ' , j, '] = ') ; Readln(T[i, j ] ) ; end; Writeln('введите имя файла'); Readln(s); Assign(f, s); {связываем файловую переменную с именем файла} {$i-} Rewrite(f); {открываем текстовый файл для записи} If IOResult <> 0 then begin Writeln('Ошибка при открытии файла'); Halt; end; {$i+} for i:= 1 to n do begin for j:= 1 to m do Write(f, T[i, j] : 8: 3) ; Writeln(f) ; end; Close (f); end.
program p57; {Программа читает матрицу n*m из текстового файла} const n= 3; m= 4; var Т: array[1.. n, 1.. m] of real; f: Text; S: String; i, j: integer; begin Writeln('введите имя файла'); Readln(s); Assign(f, s); {$i-} Reset(f); {открываем текстовый файл для чтения} if lOResult <> 0 then begin Writeln('Ошибка при открытии файла'}; Halt; End; {$i+} for i:= 1 to n do begin for j:= 1 to m do begin Read(f, T[i, j] ) ; Write(T[i, j] : 8: 3); end; Writeln; End; Close(f); end.
Задача. Дан текстовый файл, создать второй текстовый файл, уплотнив первый, заменяя в каждой строке серии из двух или более пробелов (32 - ASCII) одним пробелом. program р58; var fl, f2: Text; S: String; Sl, S2: String; {функция параметром получает неуплотненную строку, а возвращает уплотненную} function Uplot(S: String): String; var Z: boolean; begin Z:= false; repeat if pos(' ', S) <> 0 then Delete (S, pos (' ', S) , 1) else Z:= true; Until Z; Uplot:= S; end;
begin Write ('введите имя исходного файла '); Readln(sl); Write('введите имя файла с результатом'); Readln(s2); Assign(fl, s1); Assign(f2, s2) ; {$i-} Reset(fl); if lOResult <> 0 then begin Writeln('Произошла ошибка, файл ', s1, 'не существует'); Halt ; end; {$i+} Rewrite(f2); While not Eof(fl) do begin Readln(fl, S); Writeln(f2, Uplot(S)); end; Close(fl) ; Close(f2) ; end.
Задача. Даны два текстовых файла. Вывести на экран количество строк в первом и во втором файлах. Если количество строк одинаковое, то вывести на экран те строки второго файла, которые отличаются от соответствующих строк первого. program p59; const Namel = 'filel. txt'; Name2= ‘file2. txt'; var fl, f2: Text; L, K: Integer; S1, S2: String; begin Assign(fl, Namel); Assign(f2, Name2); {$i-} Reset(fl) ; Reset(f2) ; if IQResult <> 0 then begin Writeln('Ошибка при открытии файлов'); Halt; end; {находим количество строк в первом файле} L:= 0; While not Eof(fl) do begin Readln(fl); inc(L); end; {находим количество строк во втором файле} К:= 0; While not Eof(f2) do begin Readln(f2); inc(K); end; Close (fl) ; Close (f 2) ; Reset (fl) ; Reset (f2) ; if К <> L then begin Writeln('файл ', namel, ' - ', L, ' строк' ); Writeln('файл ', namе2, ' - ', К, ' строк’ ); end else begin K:= 0; While not Eof(fl) do begin Readln(fl, SI) ; Readln(f2, S2); Inc(K); if S1 <> S2 then begin Writeln(' (' , K, '): ' , S1) ; Writeln(' (', K, ') : ' , S2) ; end; end; end; Close (fl) ; Close (f2); end. Иногда необходимо открыть текстовый файл для записи, и, не удаляя находящуюся в нем информацию, дописать что-то в его конец. procedure Append(var f: Text); Процедура Append открывает текстовый файл для дозаписи. Если файл с именем, указанным в Assign, не существует, то вызов процедуры Append приведет к ошибке. Пример: program р60; {Программа дописывает в текстовый файл с матрицей новую матрицу - результат транспонирования первой} Const n = 3; m = 4; var Т: array[1..n, 1.. m] of real; ТТ: array[1.. m, 1.. n] of real; f: Text; S: String; i, j: integer; begin Writeln('введите имя файла'); Readln(s); Assign(f, s); {$i-} Reset (f) ; if IOResult <> 0 then begin Writeln('Ошибка при открытии файла'); Halt; end; for i : = 1 to n do for j := 1 to m do begin Read(f, T[i, j] ); TT[j, i] := T[i, j] ; end; Close (f); {закрываем файл} {и повторно открываем его для до записи} Append ( f ) ; {выводим в файл пустую строку разделитель матриц) Writeln(f ) ; for i:= 1 to m do begin {выводим матрицу} for j := 1 to n do Write (f , TT[i, j] : 8: 3) ; Writeln(f) ; end; Close (f) ; end.
Полезны для работы с текстовыми файлами три стандартные логические функции (ниже f - файловая переменная): · EOLN(f) – возвращает значение true, если в файле достигнут конец строки, false – в противном случае; · SEEKEOLN(f) – пропускает пробелы и знаки табуляции до конца строки или до первого значащего символа и возвращает значение true, если достигнут конец строки, false – в противном случае; · SEEKEOF(f) – пропускает все пробелы, знаки табуляции и маркеры конца строки до конца файла или до первого значащего символа и возвращает значение true, если достигнут конец файла, false – в противном случае.
Популярное: Личность ребенка как объект и субъект в образовательной технологии: В настоящее время в России идет становление новой системы образования, ориентированного на вхождение... Как вы ведете себя при стрессе?: Вы можете самостоятельно управлять стрессом! Каждый из нас имеет право и возможность уменьшить его воздействие на нас... ![]() ©2015-2024 megaobuchalka.ru Все материалы представленные на сайте исключительно с целью ознакомления читателями и не преследуют коммерческих целей или нарушение авторских прав. (574)
|
Почему 1285321 студент выбрали МегаОбучалку... Система поиска информации Мобильная версия сайта Удобная навигация Нет шокирующей рекламы |