16832

Ввод-вывод данных Основные виды работ с файлами любых типов. Основные понятия. Классификация файлов

Лекция

Информатика, кибернетика и программирование

Лекция 5 Вводвывод данных Основные виды работ с файлами любых типов. Основные понятия. Классификация файлов В системах обработки больших объемов информации данные хранятся не в ОП а во внешней памяти ВП на внешних запоминающих устройствах например на жестком м

Русский

2013-06-26

179.5 KB

7 чел.

Лекция 5

Ввод-вывод данных Основные виды работ с файлами любых типов. Основные понятия. Классификация файлов

В системах обработки больших объемов информации данные хранятся не в ОП, а во внешней памяти (ВП), на внешних запоминающих устройствах, например на жестком магнитном диске (ЖМД). Внешняя память по объему значительно превышает ОП.

На внешних носителях данные хранятся в виде физических файлов. Под физическим файлом понимается именованная область ВП на МД для хранения данных или логическое устройство - источник или приемник информации. Любой файл имеет 3 характерных особенности:

  1.  файл или устройство имеет имя;
  2.  файл содержит компоненты (элементы, записи) одного типа;
  3.  размер  (длина)  создаваемого  файла  не  оговаривается  и  ограничивается
    только емкостью доступной памяти или устройства.

Для работы с файлом в общем случае надо объявить переменную файлового типа, связать ее с физическим файлом, открыть, обработать и закрыть. В программе объявляется переменная файлового типа (логический файл). Связь логического файла с физическим файлом устанавливается динамически, т. е. в процессе выполнения программы, с помощью процедуры Assign. Это позволяет посредством одного логического файла обработать ряд физических файлов того же типа, подключая логический файл поочередно к различным физическим файлам процедурой Assign. Схематично это представлено на рис. 1.

Файлы часто используют в задачах автоматизированных систем управления, в информационно-поисковых системах, при накоплении и обработке статистических данных о результатах каких-либо испытаний реальных объектов. Создание и обработка данных, содержащихся в файлах, производится с помощью процедур обмена данными между ОП и МД: Read и Write. Процедура Read копирует данные из ВП или внешнего устройства в область ОП, выделенную переменным. Процедура Write копирует данные из области ОП, выделенной заданным переменным, на МД или внешнее устройство (например, на экран или принтер). Обработка, т. е. изменение значений каких-либо данных (переменных), может производиться только в ОП. Внешняя память на МД предназначена только для хранения данных. Для изменения данных, расположенных на МД, они должны быть введены (скопированы) в ОП с помо щью процедуры Read, скорректированы, а затем возвращены на МД процедурой Write.

Рис.1

Схема подключения различных физических файлов к одной файловой переменной с помошью Assign

В Паскале можно использовать 3 типа файлов:

текстовые (объявляются словом TEXT);

типизированные (объявляются словами FILE of);

нетипизированные (бестиповые, объявляются словом FILE).

Нетипизированные файлы отличаются тем, что для них не указывается тип компонентов файла. Эти файлы используют для высокоскоростного копирования файлов из ВП в ОП и обратно.

Объявление файлов

Объявление файлов можно производить в разделе TYPE или VAR. Объявление текстовых файлов производится с помощью слова TEXT; тип TEXT - стандартный. Пример объявления текстовых файлов:

VAR  Fl,   F2   :   TEXT;

где     Fl, F2 - файловые переменные, имена логических файлов.

При объявлении типизированных файлов определяется тип компонентов файла. Форма объявления типизированных файлов в разделе VAR:

VAR список-имен-файлов : FILE OF тип-компонентов ;

Пример объявления типизированных файлов дан в листинге 1. Файл STUD в примере имеет компоненты типа STR, а файл FLR - типа Real; STUD и FLR - имена файловых переменных.

Листинг 1. Объявление типизированного файла.

TYPE  STR = RECORD { определение типа компонентов файла }

FIO : string[20] ;

NZ  : byte ;

NG  : string[6]   END;

VAR STUD : FILE OF STR ; { объявление файла STUD }

FLR : FILE OF Real; {     "      файла FLR  }

Или:

TYPE   STR = RECORD

FIO : string[20] ;

NZ  : byte ;

NG  : string[6]   END;

FL = FILE OF STR ;    {определение типа файла }
VAR   STUD : FL ;      {
объявление файла STUD }

FLR : FILE OF Real;    {     "      файла FLR  }

В программах на Паскале 2 текстовых файла объявлены по умолчанию: INPUT - для ввода данных и OUTPUT - для вывода данных. Если в программе не используются INPUT для ввода данных с клавиатуры и файл OUTPUT для вывода данных на экран, файловые переменные INPUT и OUTPUT можно связать с любыми файлами на МД с помощью процедуры Assign.

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

Доступ к файлам

Связь файловых переменных с физическими файлами. Процедура Assign

Любой программе на Паскале по умолчанию доступны текстовые файлы INPUT и OUTPUT, определенные по умолчанию. Все остальные файлы и логические устройства становятся доступными программе только после выполнения процедуры Assign - связывания файловой переменной (логического файла) с именем физического файла или устройства.

Форма вызова процедуры Assign:

Assign   (   F,   FF   )    ;

где     F - имя файловой переменной;

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

Если FF задано в виде пустой строки (отмена связи с файлом), то файловая переменная связывается с терминалом: с клавиатурой или с экраном.

Например:

Assign   (   F,    ' '   )   ;

где     F - имя переменной типа текстового файла.

Примеры связи логических файлов с физическими:

Assign ( F, 'LR1.DAT' ); Assign (INPUT, 'LR.DAT'); Assign (OUTPUT, 'LR.RES'};

Процедура AssignCrt модуля Crt связывает текстовый файл с устройством Crt (терминалом). Формат обращения к процедуре AssignCrt:

AssignCrt   (   файловая-переменная   );

где     файловая-переменная - имя переменной типа текстового файла.

Установка связи файла с клавиатурой или с экраном зависит от того, как будет открыт этот файл:

для ввода данных с клавиатуры - процедурой RESET или

для вывода данных на экран - процедурой REWRITE.

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

Листинг 2. Переключение текстовых файлов программы на работу с экраном или с клавиатурой.

Uses   Crt; VAR  Fl,   F2,    F3   :   TEXT;     А,   В,   С   :   BYTE;

BEGIN Assign   (Fl   ,'');   Assign   ( F2,    'CON'   );   AssignCrt   ( F3   );

Rewrite  (Fl); Rewrite (F2); Rewrite (F3); {открыть для вывода на экран   }

Write   ( Fl,   A   );   Write   ( F2,   В   );   Write   ( F3,   С   );

Close   (Fl ) ;   Close   (F2) ;   Close   (F3) ; { -   закрыть   файлы   }

Reset   (Fl);  Reset  ( F2);  Reset   (F3);   {-  открыть  для  ввода  данных}
Read   (Fl,   A );   Read   (F2,   
В );   Read   (F3,   С ); {с  клавиатуры   }

Close   ( Fl );  Close   (F2 );  Close  ( Fl ); {   -  закрыть   файлы   }

END.

Имена файлов

В программе объявляется или принимается по умолчанию (INPUT и OUTPUT) имя логического файла, которое используется при обращении к процедурам и функциям работы с файлом. Для обработки данных физических файлов, расположенных на МД, имя логического файла должно быть связано с именем физического файла с помощью процедуры ASSIGN.

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

оно может содержать до 8 разрешенных символов: латинских букв, цифр
и символов: !,#,$,%,&, ', (, ), _;

имя может начинаться с любого разрешенного символа;

за именем может следовать точка и расширение - последовательность от
одного до трех разрешенных символов.

Перед именем файла может быть путь к файлу - имя МД и (или) имя текущего каталога и имена каталогов вышестоящего уровня. Имя МД - это одна из латинских букв от А до Z, после которой ставится двоеточие. Имена А и В обычно относятся к накопителям на гибких дисках. Остальные имена от С до Z - к ЖМД. Эти имена могут относиться к одному или нескольким логическим дискам, созданным в ПК, например программой FDISK. За именем МД можно указать имя каталога, содержащего файл. Если после имени МД, перед именем файла, стоит \ - обратная косая черта, то путь к файлу начинается с корневого каталога; например F: \ означает, что используется корневой каталог. Если в имени физического файла нет черты или указано только имя файла, без имени МД и пути, то производится поиск физического файла в текущем каталоге, установленном в системе. За именем корневого каталога может следовать одно или несколько имен каталогов нижнего уровня. Перед каждым из них должна быть \ - обратная косая черта. Последним в перечне пути будет имя файла. Максимальная длина имени вместе с путем 79 символов.

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

VAR FRZ :  FILE OF STRING; { файловая переменная }

CONST NAME : STRING = 'F:\DIR\SUBDIR\rezl.txt; {путь к файлу }
... ASSIGN
( FRZ, NAME ); {связь с файлом, имя которого в NAME }
...   
NAME := 'F:\rez2.txt1; { Файл - в корневом каталоге }

ASSIGN ( FRZ, NAME ); {связь с файлом, имя которого в NAME }

где     F - имя МД;

DIR - имя каталога;

SUBDIR - имя подкаталога;

rezl.txt, rez2.txt - имена физических файлов.

В приведенном примере используется типизированная константа NAME. Сначала она получает значение в разделе CONST, а затем это значение изменяется в тексте программы с помощью оператора присваивания.

Логические устройства

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

Таблица 1.  Список логических имен устройств ПК

Имена устройств 

Назначение устройств 

CON 

Консоль: клавиатура или экран монитора 

PRN 

Логическое имя принтера 

LPT1, LPT2, LPT3 

Логические имена принтеров 

AUX 

Имя коммутационного канала, который обычно используется для связи с другими компьютерами 

NUL 

Логическое имя "пустого" устройства 

Для консоли Паскаль устанавливает различие между клавиатурой и экраном по направлению передачи данных: чтение (ввод) возможно только с клавиатуры, а запись (вывод) данных - только на экран. Устройство CON можно назначить любому текстовому файлу программы. А направление передачи данных определить с помощью процедур Reset или Rewrite, подключая файл к экрану или к клавиатуре, как это показано в листинге 2.

Для устройства NUL операторы ввода-вывода игнорируются.

Имена логических устройств PRN, LPT1 и LPT3 можно использовать только для обращения к устройствам и нельзя использовать, например, для обращения к файлу на МД.

Если к ПК подключено несколько принтеров, доступ к ним осуществляется по их логическим именам LPT1, LPT2 и LPT3. Имена LPT1 и PRN - синонимы. Поэтому назначение выводному текстовому файлу устройства LPT1 или PRN эквивалентно:

Assign ( F1, 'PRN' ) ; Assign ( F2, 'LPT1' ) ;

Средствами DOS можно переназначить имя PRN на любое другое выводное устройство.

Стандартный библиотечный модуль PRINTER, входящий в библиотеку Turbo.TPL, объявляет имя файловой переменной LST и связывает его с логическим устройством LPT1. Это дает возможность использовать в программе файл LST для печати результатов работы программы. Например:

PROGRAM PR;

USES PRINTER;

BEGIN     WRITELN ( LST, ' ПРИВЕТ! ' );

END.

Все операции по связыванию файла LST с принтером и открытие файла LST выполняет модуль PRINTER.

Открытие и закрытие файлов

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

Reset ( файловая-переменная );

Rewrite ( файловая-переменная );

Append ( файловая-переменная );

где    файловая-переменная - это переменная, связанная с физическим файлом или логическим устройством с помощью Assign.

При выполнении процедуры Reset дисковый файл или логическое устройство подготавливается к чтению данных. Внутренняя переменная-указатель, связанная с этим файлом, указывает на начало файла, т. е. на его компонент с номером 0.

При попытке открыть процедурой Reset несуществующий файл или инициировать чтение из логического выводного устройства (например, из PRN) возникает ошибка.

Паскаль допускает и чтение (Read) и запись (write) в ранее созданные типизированные файлы, открытые с помощью процедуры Reset. Это позволяет корректировать и дополнять созданные типизированные файлы.

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

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

Если текстовый файл был открыт с помощью процедур Reset, Rewrite или Append и не закрыт, то с помощью тех же процедур он может быть открыт повторно (он будет закрыт и вновь открыт). Но лучше закрывать файл с помощью процедуры Close. Повторное открытие с помощью Rewrite стирает старый файл и открывает его для создания.

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

Процедуры и функции для работы с файлами любых типов

С файлами любых типов можно использовать процедуры Assign, открытия и закрытия файлов и процедуры ввода-вывода данных. Кроме того, с файлами любых типов можно использовать следующие процедуры и функции стандартного модуля System: Eof, Erase, ReName, lOResult, ChDir (изменить каталог), MkDir (создать каталог), RmDir (переименовать каталог).

Форма обращения к функции EOF:

EOF   (файловая-переменная);

Например: WHILE  NOT  EOF   (FILE1)    ...

Функция EOF возвращает значение TRUE, если указатель файла находится за последним элементом файла, и значение FALSE в противном случае. Файловая переменная может относиться к файлу любого типа. Если параметр функции (и круглые скобки) опущен, то используется стандартная файловая переменная INPUT.

Форма обращения к процедуре Erase:

Erase   (файловая-переменная);

Процедура Erase стирает физический файл, связанный в этот момент с этой файловой переменной. Файл должен быть закрыт. Например, если файл F связан с помощью процедуры Assign с физическим файлом fl.rez, то после выполнения процедуры Erase (F); физический файл fl.rez будет стерт (удален).

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

Форма обращения к процедуре ReName:

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

где     новое-имя-файла - выражение типа string.

Например, если файл F присоединен к физическому файлу с именем fl.rez, то после выполнения процедуры ReName (F, 'f2.rez'); физический файл fl.rez получит имя f2.rez.

Процедуры работы с файлом возвращают код ошибки, который можно получить с помощью функции IOResult. Она возвращает целое значение, представляющее собой код ошибки неуспешно выполненной процедуры для работы с файлом или нуль в случае ее успешного выполнения. Использовать значение функции IOResult можно .только при отключенных средствах контроля успешности выполнения процедур работы с файлами со стороны системы. Для отключения контроля со стороны системы используют директиву компилятора I: директива I- отключает контроль системы, а I+ - подключает его. После однократного использования функции IOResult ее значение теряется, т. е. использовать значение IOResult можно только один раз. Если значение IOResult надо использовать несколько раз, то его надо переслать в другую переменную типа Word или другого целого типа.

Чтобы предотвратить аварийное завершение программы при неуспешном выполнении любой процедуры работы с файлом, можно программно контролировать ошибки ввода-вывода с помощью функции IOResult. Для этого надо временно отключить контроль ошибок ввода-вывода средствами системы (директивой I-). При этом после выполнения процедуры работы с файлом значение IOResult можно проанализировать и по результатам анализа определить дальнейшие программные действия. Например:

VAR F:FILE OF CHAR;

...

ASSIGN (F,'FILE.DAT');

{$I-} { - отключение средств контроля системы }

RESET (F); { - открытие файла F }

{$I+} { - подключение средств контроля системы }

IF IORESULT <> О THEN ... {- файл не открыт, не

                            существует }

ELSE ... {- файл открыт, существует }

Массивы файлов

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

Пример объявления массива файлов:

CONST KF = 10 ; { - количество файлов в массиве }

TYPE FL = FILE OF REAL;        { - тип компонент файла } VAR MFL:ARRAY[1..KF] OF FL ; {- массив файлов типа 'FL'}

Массивы файлов можно использовать для ускорения поиска данных в больших файлах. Например, в типизированных файлах телефонного справочника, кадровых сведений. Для этого все данные файла надо упорядочить по определенному признаку и разместить их в файлах - элементах массива файлов по частям. Например, каждый файл из массива файлов может содержать сведения об абонентах одной АТС (автоматизированной телефонной станции). При этом номер элемента в массиве файлов должен быть функцией от номера АТС; например, он может быть равен трем первым цифрам семизначного номера телефона.

Фрагмент программы с использованием массива файлов для телефонного справочника дан в листинге 3. В примере номера файлов всех АТС в массиве файлов F пронумерованы начиная с номера 100: от 100 до 100 + COLATS. Имена физических файлов можно формировать из номера АТС, т. е. из первых трех цифр номера телефона. В примере имена физических файлов изменяются от 100. DAT до 100+COLATS .DAT. Поиск сведений об абоненте с заданным номером телефона производится только в файле с номером АТС, заданным в требуемом номере телефона. Для этого надо открыть для поиска только один файл этой АТС.

В листинге 3 используется STR - встроенная функция, которая формирует строку IMF из I - целого значения, номера АТС.

Листинг  3. Использование массива файлов.

CONST  COLATS =10;     { - количество АТС }

TYPE   STRUC  =  RECORD { - тип записей файла }

           NOM : INTEGER; { - номер телефона }

           FIO : STRING [20] { - Ф.И.О. абонента }

      END;

      FL  =  FILE  OF  STRUC; { - тип файла }
VAR ST:STRUC;

    F:ARRAY [100..COLATS+100] OF FL;{- массив файлов}

  IMF:STRING[3];          { - имя, номер файла }

FOR  I := 100  TO  COLATS + 100  DO BEGIN

 STR(I,IMF); ASSIGN(F[I],IMF+'.DAT'); {- связь файлов}

            REWRITE ( F[I]);      { открытие I-файла }
. . .
{ Запись в I - файл: }

WRITE (F[I], ST );         ... CLOSE (F[I]);

RESET (F[I]); ... READ(F[I],ST); {- чтение из 1-файла }
CLOSE (F[I]);  . . . END
;

Способы печати результатов работы программы

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

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

Визуально контролировать промежуточные и конечные результаты отладки можно путем вывода их на экран или в текстовый файл. Для оперативного просмотра и анализа результатов работы программы на экране можно выполнять ее трассировку (построчно или до контрольной точки). Можно использовать ряд способов для организации процесса предварительного анализа результатов. Рассмотрим некоторые способы организации просмотра и печати результатов выполнения программы:

  1.  вывод результатов на экран, а после отладки программы вывод   результатов из программы на печать во время выполнения программы (средствами
    Паскаля);
  2.  вывод результатов на экран, после отладки вывод результатов в текстовый
    файл, а из файла - на печать средствами
    DOS;
  3.  вывод результатов только в текстовый файл, а после отладки и анализа
    полученных результатов печать из файла средствами
    DOS;
  4.  вывод данных на экран: формирование экрана с результатами в том виде
    (меню, ответ пользователя), в котором они должны быть на печати; оста
    нов программы в требуемой точке, печать содержимого экрана (командой
    Shift+Print Screen) и продолжение выполнения программы.

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

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

Write   (список-данных);

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

1) с принтером с помощью Assign   (Output,   'PRN');;

2) с файлом на МД; например: Assign   (Output,   'F:\REZ.DAT' ); .

Если в качестве файла результатов надо использовать текстовый файл пользователя, то для вывода результатов на экран во время отладки ему надо назначить в качестве физического пустой файл ( ' ' ). Например:

Assign (FL,''); Rewrite(FL);

Вызов процедуры вывода данных в файл будет в виде:

Write (FL,список-данных);

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

Assign(FL,'LR.RES');

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

CONST  FNAME = '';{ - для вывода результатов на экран}
CONST  FNAME  =  'LR.RES'; { - для вывода в файл }

CONST  FNAME  =  'PRN' ; { - для вывода на печать }

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

Assign ( FL, FNAME ) ; Rewrite ( FL ) ;

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

Этот же прием можно использовать и при работе со стандартными файлами Input и Output. Например:

Assign ( Input, FINAME );    Reset   ( Input  );

Assign ( Output, FNAME );    Rewrite ( Output );

При этом операторы ввода (Read) и вывода (Write) не будут содержать имя файловой переменной.

Для прогона программы с выводом результатов только на печать можно использовать имя файла (имя файловой переменной) LST.

Использование файловой переменной LST требует применения стандартного библиотечного модуля Printer и имени LST в качестве файловой переменной.

Например:

PROGRAM  PR;

  USES  PRINTER;         ...

     WRITE (LST,список-данных);

Все операции по связыванию LST с принтером и открытие файла LST выполняет модуль PRINTER. Изменение имени файловой переменной с имени выводного файла (для отладки) на имя LST во всех обращениях к процедуре Write (для печати результатов) трудоемко, если в программе используется ряд вызовов процедуры Write.

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

Например, если на экран выдается запрос пользователю в виде меню, пользователь набирает с клавиатуры ответ, который будет введен в область ОП программы процедурой Read только после нажатия клавиши Enter. Чтобы отпечатать с экрана запрос и ответ пользователя, надо после набора ответа сначала отпечатать содержимое экрана, а потом нажать Enter. Печать содержимого экрана производится командой Shift+Print Screen.

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

Основные понятия

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

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

В конце каждой строки текстового файла ставится специальный признак EOLN (от англ. End Of Line - конец строки), а в конце всего файла - признак EOF (от англ. End Of File - конец файла).

При создании текстового файла с клавиатуры с помощью текстового редактора признак EOLN вводится при нажатии клавиши Enter. Признак EOF -конца файла - можно сформировать с клавиатуры с помощью команды Ctrl+Z. Автоматически он формируется при запоминании текстового файла по команде Save из среды Паскаля. При создании текстового файла с помощью операторов программы признак конца строки (записи) формируется процедурой Writeln, а признак конца файла формируется при выполнении процедуры Close.

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

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

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

Ввод данных из текстового файла

Процедуры Read и Readln

Процедуры Read и Readln обеспечивают ввод (копирование) чисел, символов и строк в ОП переменных, определенных в списке данных оператора. Ввод данных можно производить из текстового файла, созданного с помощью текстового редактора, или с клавиатуры.

Форма обращения к процедуре Read:

Read   (файловая-переменная,   список-данных   );

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

Read   (список-данных);

- для ввода данных из стандартного файла Input;

где файловая-переменная - имя текстового файла, переменная, которая должна быть типа TEXT и связана с файлом или логическим устройством с помощью Assign;

список-данных - последовательность имен переменных, разделенных запятыми: скалярных, элементов массива или элементов записи.

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

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

Процедура Readln идентична процедуре Read. За исключением того, что после считывания значения в последнюю переменную списка данных процедуры Readln происходит переход на следующую строку файла (экрана), т. е. оставшаяся часть строки до EOLN пропускается. Так что следующая процедура Read или Readln начнет ввод данных с первого символа следующей строки. Например:

Read (Fid,А,В,С); Read(С,D,Е); Readln(I,G);

Процедура Readln может быть без параметров. Например:

Readln (FID) ; - для файла FID; Readln;   - для файла INPUT.

При использовании процедуры Readln (FID); производится переход в начало следующей строки файла FID, т. е. пропуск всех символов текущей строки, вплоть до EOLN. Вызов процедуры в виде 'Readln;' приводит к приостановке выполнения программы до нажатия клавиши Enter. Это можно использовать, например, для просмотра очередных значений, выведенных на экран, а после просмотра нажать Enter.

Ввод символьных и строковых значений

При вводе значения переменной типа CHAR очередной символ считывается из файла и присваивается переменной.

При вводе из файла значений переменных типа String [n] считываются очередные n символов и помещаются в строку символов; количество считанных символов равно n, если не встретились символы EOLN или EOF. Если они встретились, то в считанную строку вводится столько символов, сколько их оказалось до появления EOLN или EOF; сами символы EOLN и EOF во введенную строку не помещаются. Попытка с помощью Read считывать из файла значение строки после достижения EOLN или EOF возвращает в качестве считанных значений "пустое" значение (пустую строку). Для перехода на новую строку после чтения очередной строки надо использовать процедуру Readln.

При использовании процедуры Read для ввода данных с клавиатуры символ или символьная строка, занесенные на экран, запоминаются в буфере, содержимое которого передается программе только после нажатия клавиши Enter. Если вводимая строка больше переменной, в которую вводится значение, то в качестве значения из буфера вводятся только символы, вместившиеся в переменную, т. е. вводится левая часть строки: столько символов, сколько объявлено, - остальные символы теряются. Если при нажатии клавиши Enter было набрано символов меньше, чем объявлено, то вводится столько символов, сколько их расположено до курсора; но если в строке последние набранные символы - пробелы, то вводится значение до пробела. Чтобы ввести и пробелы, расположенные правее последнего вводимого символа, надо после пробелов набрать еще один символ, отличный от пробела. Например, с помощью следующего оператора Readln можно ввести различные значения, примеры которых даны в табл.2:

VAR  ST   :   STRING[8];

...   READLN (ST);

Таблица 3.2.  Примеры набранных и введенных значений строк

На экране 

Введется 

Пояснение 

ABCDEFIJKL*_ 

'ABCDEFIJ' 

Вместилось только 8 символов 

ABCDE 

'ABCDE' 

До очередного пробела 

ABCD DF  К*_ 

'ABCD DF ', 

Так как после пробелов стоит К 

где    _ - положение курсора перед нажатием клавиши Enter.

Ввод числовых значений

Процедура Read выполняет ввод числовых значений по следующим правилам:

  1.  пропускаются  все  ведущие  (предшествующие  числу)  пробелы,  признаки
    табуляции и признаки конца строк (
    EOLN); поэтому при вводе из файла
    ряда числовых значений, расположенных в нескольких строках, процедура
    Readln не требуется, можно использовать Read; если при пропуске ведущих пробелов встретится символ EOF, переменная получит значение 0;
  2.  выделяется значение очередного числа: от первого символа, отличного от
    пробела, до очередного пробела или признака
    EOLN или EOF;
  3.  выделенная  подстрока  контролируется  на  правильность арифметической
    константы;
  4.  полученное значение преобразуется в форму хранения числа, после чего
    копируется в область ОП переменной.

Если выделенное значение ошибочно (например, делается попытка ввести букву О вместо цифры 0), возникает ошибка ввода-вывода и выдается сообщение; например:

106   Invalid  numeric   format- ошибочен числовой формат,   т.  е.   ошибочно  числовое   значение.

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

Если из одной строки текстового файла или с экрана вводятся последовательно число, а после него символ или строка, то очередной пробел - ограничитель числа справа является первым вводимым символом следующей за ним строки. Он будет первым, "лишним" символом строкового значения. Чтобы избавиться от этого символа, надо ввести его в "ненужную" символьную переменную. Пример ввода данных с пропуском "лишнего" пробела:

TYPE  STR = RECORD         { - тип записи }

NZ : BYTE;

FIO : STRING[13];

RS : REAL
END;

VAR  ST : STR; { - переменная типа записи }

В  : CHAR; { - переменная для пробела }

F  : TEXT; . . .

READLN (F, NZ, В, FIO, RS ); . . .

В файле F может быть, например:

90123 Иванов И.И.  190.25  <— эти значения вводятся

NZ  В  FIO        RS      <— в эти переменные.

В ненужную переменную В будет введен пробел, ограничивающий число для переменной NZ. Если после строкового значения вводится число, оно может располагаться начиная с первой позиции после строкового значения, без пробелов после строкового значения, но справа число должно быть ограничено пробелом, символом EOLN или EOF.

Ввод данных с клавиатуры

При вводе данных с клавиатуры с помощью операторов Read символы, по мере нажатия клавиш, помещаются в специальный строковый буфер. Максимальная длина буфера ввода при работе с клавиатурой составляет 127 символов. Буферизация позволяет редактирование вводимой строки до нажатия клавиши Enter. Сам символ 'Enter' в буфер не помещается. При нажатии клавиш осуществляется их отображение на экран ПК (эхо-контроль символов). Из буфера в программу строка передается только после нажатия клавиши Enter.

В Паскале есть возможность ввести в ОП программы любой символ, в том числе 'Enter', сразу после нажатия на соответствующую клавишу без эхо-повтора, т. е. без вывода его на экран, с помощью функции ReadKey стандартного модуля CRT.

После ввода данных с клавиатуры процедурой Read или Readln клавиша Enter устанавливает курсор в начало следующей строки; при этом предыдущие строки перемещаются на одну строку вверх, а бывшая верхняя строка экрана становится невидимой (уходит с экрана).

Из одной программы одновременно можно использовать несколько файловых переменных для ввода данных с клавиатуры, т. е. к клавиатуре можно подключить несколько файлов программы: например, файл Input и файл F программы. Для этого F - файловой переменной программы надо назначить экран с помощью Assign и открыть его для чтения:

Assign (F,'');   Reset(F);

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

Read   (А, В, С ) ; - для ввода из файла INPUT;

Read   (F, D, Е ) ; - для ввода из файла F; D, Е - переменные.


 

А также другие работы, которые могут Вас заинтересовать

37708. Глобальна культура сучасного світу 197.5 KB
  Одне за другим виникали поняття індустріального, постіндустріального, інформаційного суспільств, що с доказом прискореного загального розвитку, і водночас песимістичні прогнози щодо глобальних викликів: екологічного
37710. БЛОК МИКРОПРОГРАММНОГО УПРАВЛЕНИЯ. РАБОТА С ОПЕРАТИВНОЙ ПАМЯТЬЮ 208 KB
  Изучение структуры и функций блока микропрограммного управления БМУ, составление и отладка микропрограмм обработки данных, записанных в ОП, с использованием циклов и подпрограмм.
37711. ВИМІРЮВАННЯ КОЕФІЦІЄНТА НЕЛІНІЙНИХ СПОТВОРЕНЬ 74.5 KB
  МЕТА РОБОТИ вивчити методи вимірювання коефіцієнта нелінійних спотворень; набуття навичок роботи з сучасним вимірювачем нелінійних спотворень. Причиною виникнення нелінійних спотворень у радіоелектронних колах є нелінійність вольтамперних характеристик діодів транзисторів мікросхем ламп а також нелінійні залежності в магнітних або п'єзоелектричних елементах. Прилади для вимірювання коефіцієнта гармонік називають вимірниками нелінійних спотворень.
37713. Ознайомлення з інструментальним середовищем Lazarus 306.24 KB
  Ознайомитись із середовищем програмування Lazarus. Написати програму яка забезпечує обчислення радіуса вписаного в трикутник кола за його сторонами.
37714. Протокол SMTP 805.5 KB
  Щоб доставити повідомлення до адресата необхідно переслати його поштовому серверу домену в якому знаходиться адресат. Сервер відповідає на кожну команду рядком що містить код відповіді і текстове повідомлення відокремлене пропуском. У результаті цього спам став практично нерозв'язною проблемою так як було неможливо визначити хто насправді є відправником повідомлення фактично можна відправити лист від імені будьякої людини. DT CRLF Вказує на початок повідомлення.
37715. Двуфакторний аналіз 51.84 KB
  Суму квадратів всіх дослідів 18 4. суму квадратів сум по стовпцях поділену на число дослідів в стовпцю 19 5. суму квадратів сум по стрічках поділену на число дослідів в стрічці 20 6. суму квадратів для стовпця SS=SS2SS4; 22 8.
37716. Оператори роботи з рядками. Обробка одновимірних масивів та рядків. Статичні одновимірні масиви 675.08 KB
  Статичні одновимірні масиви. Оператори роботи з рядками. Обробка одновимірних масивів та рядків. Мета: навчитись проводити обробку одновимірних масивів та рядків мовою програмування С.