Предыдущий раздел ОПЕРАЦИИ С ФАЙЛАМИ Следующая глава

16.3. Операции чтения и записи

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

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

Каждому открытому файлу всегда соответствует только один указатель, несмотря на то, что файл может быть одновременно открыт в нескольких программах. (Однопрограммная система допускает одновременное нахождение в ОП нескольких программ, одни из которых находятся между собой в отношении «предок – потомок», а другие являются резидентными.) Наследование открытых файлов дочерней программой, а также наличие единых указателей файлов делают файлы удобным средством информационного обмена между родительской и дочерней программами в том случае, если объем передаваемой информации достаточно велик.

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

Следующие системные вызовы DOS выполняют установку указателя файла, а также используются для информационного обмена с ним: “int 21h” (функция 42h), “int 21h” (функция 3Fh) и “int 21h” (функция 40h).

int 21h (функция 42h) – установить указатель файла. Перед применением вызова программа помещает в регистр BX логический номер файла, а в регистр AL тип требуемого перемещения указателя файла:

0 – перемещение относительно начала файла;

1 – перемещение относительно текущего положения указателя;

2 – перемещение относительно конца файла.

Величина перемещения (в байтах) представляет собой число со знаком, которое программа должна поместить в пару регистров: CX (старшая часть величины перемещения) и DX (младшая часть).

При успешном завершении системного вызова в программу возвращается флаг FC=0, а в регистрах CX и DX возвращается новое значение указателя файла (число байтов от начала файла).

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

Этот вызов часто используется для определения длины файла: достаточно выполнить вызов с CX=0, DX=0, AL=2. Тогда в CX:DX будет возвращена длина файла в байтах.

int 21h (функция 3Fh) – выполнить чтение из файла. Чтение начинается с той позиции, на которую ранее был установлен указатель файла. Перед применением вызова программа помещает в регистр BX логический номер файла, в регистр CX – число байтов, читаемых из файла, а в регистры DS и DX соответственно адрес-сегмент и адрес-смещение начала прикладного буфера, в который должно быть выполнено чтение.

При успешном завершении системного вызова в программу возвращается флаг FC=0, а в регистре AX возвращается число фактически считанных байтов. Указатель файла установлен на первый несчитанный байт.

Примечание. Если в результате выполнения данного вызова число фактически считанных байтов (в AX) меньше, чем число заказанных байтов (в CX), то, следовательно, был достигнут конец файла.

int 21h (функция 40h) – выполнить запись в файл. Запись начинается с той позиции, на которую ранее был установлен указатель файла. Перед применением вызова программа помещает в регистр BX логический номер файла, в регистр CX – число байтов, записываемых в файл, а в регистры DS и DX соответственно адрес-сегмент и адрес-смещение прикладного буфера, содержимое которого должно быть записано в файл.

При успешном завершении системного вызова в программу возвращается флаг FC=0, а в регистре AX возвращается число фактически записанных байтов. Указатель файла установлен на байт, следующий за последним записанным байтом.

 


Предыдущий раздел В начало Следующая глава