Архитектура Аудит Военная наука Иностранные языки Медицина Металлургия Метрология
Образование Политология Производство Психология Стандартизация Технологии


Буферный обмен информацией в языках программирования.



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

1. супервизор обращается к необходимому устройству и опрашивает его готовность.

2. опрашивается состояние устройства и ищется на нем необходимый файл.

3. в куче выделяется буфер для обмена информацией (в MS-Dos и Windows величина буфера равна 512 байт).

Если ОС многозадачная, то для процесса обмена выделяется поток обмена. Необходимо помнить, что потоки обмена различаются в зависимости от условий: типа процессора, типа операционной системы. Поток обмена информацией для MS-DOS всегда один или несколько непересекающихся. Для Win9x несколько пересекающихся, но не выполняющихся одновременно. Для Windows моложе Win9х несколько пересекающихся, в том числе и выполняющиеся одновременно.

4. Распределяется внутри программы файловая переменная.

5. Происходит процесс обмена информацией по алгоритму для чтения:

Информация вводится в буфер.

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

6. После окончания процесса обмена информацией файл закрывается, и буфер в зависимости от языка программирования может быть освобожден (в Си автоматически, в Pascal’e не автоматически).

В Config.sys пользователь должен определить количество одновременно открытых файлов: files = <n> , n=10 по умолчанию; количество буферов: buffers=<n>, n=10 по умолчанию; количество потоков, работающих одновременно: fbsd=<n>, n=1 по умолчанию (необходимо указывать только для MS-DOS или если используем приложения MS-DOS под Win9x).

Для работы Turbo Pascal достаточно стандартных установок. Для транслятора Delphi рекомендуется >20 файлов и буферов, особенно если используем работу с базами данных.

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

тип файла скорость
Текстовый 3
Типизированный 2
Нетипизированный 1

 

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

Таблица 1.

Файловая обработка

Задача

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

Типизированный файл

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

Тип данного с которым работает файл

Любой ординарный тип

Любой тип

Любой тип

Объявление в разделе переменных

F:Text

F:file of <type>

F:file

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

Assign(F, ”name”), AssignFile(F, ”name”) в Делфи

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

Reset(F)

Reset(F,<k>)

<k>-типа word, размер минимального кол-ва информации считываемой из файла

Открыть новый файл для записи Rewrite(F)

Rewrite(F)

Rewrite(F,<k>)

Изменение файла Append(F) (только в конец файла)

Reset(F)

Reset(F,<k>)

Чтение Read(F,<параметр>); ReadLn(F, <параметр>). Фактическое чтение осуществление только после выполнения ReadLn.

Read(F,<тип>);

Чтение осуществляется в процессе появления оператора.

BlockRead (F:file;var Pole; kol:word [; fact:word] );

F-файловая переменная, Pole-область памяти куда происходит считывание информации, kol-количество одновременно считываемых записей информации (общая длинна считываемой информации в байтах равна k*kol). В процессе чтения после конца файла не возникает ошибки приводящей к снятию программы, для успешной работы надо следить за процессом чтения информации.

Запись Write(F,<параметр>) Writeln (F,<параметр>)

write(F,<тип>);

BlockWrite (F, pole, kol [, fact]).

Ситуации, возникающие после чтения / записи

Ситуация конца файла

Eof(F:text):boolean

Eof(F:file of <type>):boolean

Eof(F:file):Boolean

Ситуация конца строки

Eoln(F:text):Boolean

Нет

нет

Позиционирование по файлу

Невозможно

Seek(F:file of <type>;n:longint)

Seek(F:file;n:longint)

Адреса записей

Нет

начиняя с 0

начиная с 0

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

Close(F:text)

Close(F:file of <type>)

Close(F:file)

Действия по директивам компилятора по обработке ошибок ввода-вывода

{$I+}-передает управление ошибками операционной системе

{$I-}- передает управление ошибками программисту

Действует на все операции

Действует на все операции

Действует на: Assign, Reset, Rewrite, Seek, Close.
               

 

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

2) При создании приложений в Delphi не рекомендуется работать с обычными файлами, лучше всего подключать объекты работы с БД по различным форматам.

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

 

3.1. Функции и команды по файловой обработке.

 

FileSize (f: file): longint – определить размер файла в байтах. Файл обязательно должен быть распределён. Действует на все типы файлов.

FilePоs (f: file): longint – определить позицию внутри файла. Файл должен быть распределён и открыт. Функция действует на типизированные и не типизированные файлы.

Rename (f: file; new. name: string); файловая строка, хранящая переменную, новое имя файла. Файл должен быть распределен, но не открыт. если на диске существует файл с новым именем, и управлением вводом выводом не передано ОС в процессе выполнения команды может произойти ошибка. Тип файла любой.

Erase (f: file)-уничтожить файл. Файл должен быть распределён, но не открыт.(!) После выполнения функций файловая переменная принимает значение “неопределенно” (const “nil”) если файла нет на носителе или атрибуты его не соответственно уничтожены (т.е. файл только для чтения) в процессе выполнения может возникнуть ошибка.

 

3.2. Пример обработки не типизированного файла.

 

Пример: Написать утилиту, копирующую один файл в другой.

При копировании проверяем следующие события: 1.Копируемого файла нет на диске; 2.На диске уже существует файл, в который мы копируем информацию. 3. Считаем: переписываем в файл до первого сбоя.

Запуск программы будем осуществлять с параметрами.

 

PROGRAMM MY_COPY;

Var

       kol, I, N, J : integer;

       ARR: array[1…512] of byte;

       F, F1: file;

Begin

         If ParamCaunt<2 then

               begin

                 Writeln(“В качестве параметров должны быть заданы 2 имени файла”);

      halt(1)

                end.

   {$I-}

    Assign(f ,ParamStr[1]);

    reset(f,1);

    {$I+}

         if IOResult <>0 then

              begin                   

                 writeln(“Oшибка при открытии ”+Param Str[1]);

                  halt(2);

              end;

      {$I-}

    Assign(f1 , ParamStr[2]);

     reset(f1,1);

      {$I+}

        if IOResult<>0 then Rewrite(f1,1)

                                 else

                                     begin

                                         writeln(“уже есть”+Param Str [2]);

                                          close (f); close(f1)

                                          halt(3);

                                      end;

          Repeat

              BlockRead(f, ARR, 512, I);

               Block rite(f1, ARR, I, N);

           Until (I <> N) OR (I<>512);

    Close(f);

     Close(f1);

            IF (I<> N) then

                  Begin

                     Writeln (“ Ошибка записи в” + Param Str[2]);

                     Halt(4);

                 end;

end.                                                    

 

Комментарий к программе:

Распределяем несколько целых переменных. Область ARR=512 байтам равна стандартному блоку ОС MSDOS, Windows 9x. Распределяем 2 файловые переменные как не типизированные файлы.

Проверяем, чтобы в программу передавалось не менее 2-х параметров. Итак, переменная ParamCount содержит количество параметров передаваемых в программу. Пред определенный массива ParamStr хранит в себе параметры передаваемые в программу. При этом начальный индекс массива=0 и в нулевом элементе массива хранится имя, выполняемого загрузочного модуля. При работе в ОС MSDOS количество параметров может быть произвольно, но общая их длина, включая разделяющие их пробелы, не должна превышать 128 символов с именем выполняемого модуля. Выдаем сообщение об ошибке и выходим с кодом завершения 1.


Поделиться:



Последнее изменение этой страницы: 2019-04-19; Просмотров: 209; Нарушение авторского права страницы


lektsia.com 2007 - 2024 год. Все материалы представленные на сайте исключительно с целью ознакомления читателями и не преследуют коммерческих целей или нарушение авторских прав! (0.04 с.)
Главная | Случайная страница | Обратная связь