Ввод/вывод файлов. Создание и открытие файлов

Страницы работы

Содержание работы

Ввод/вывод файлов

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

Создание и открытие файлов

Для создания и открытия файлов всех типов служит единственная функция API Win32 — CreateFile. В приложении можно указать, будет ли выполняться чтение из файла, запись в файл или то и другое. Можно также указать, предусматривается ли совместное использование этого файла для чтения, записи либо для того и другого. В листинге 17.1 показан фрагмент кода, в котором открывается существующий файл или создается новый. После открытия файла его можно использовать для выполнения операций чтения и записи.

Листинг 17.1. Открытие и закрытие файла ______________________________

HANDLE       hFile;

//   Открыть/создать   файл .

hFile  =  CreateFile ( "FILE1.TXT",   GENERIC_READ   |   GENERIC_WRITE , FILE_SHARE_READ , NULL,   OPEN_ALWAYS,   FILE_ATTRIBUTE_NORMAL , NULL  ) ;

if   ( hFile   != INVALID_HANDLE_VALUE  ) {

// Выполнить действия с файлом. . .

// Закрыть файл.

CloseHandle (  hFile);

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

В приложении можно открывать дескрипторы файлов для ввода и вывода на консоль. Для ввода с консоли приложение передает вместо имени файла строку "CONINS", а для вывода на консоль — строку "CONOUTS". Эти имена позволяют получить дескрипторы ввода и вывода на консоль, даже если функция SetStdHandle перенаправила дескрипторы стандартного потока ввода/вывода. Дескрипторы стандартных потоков ввода информации, вывода информации и вывода сообщений об ошибках можно получить и установить с помощью функций GetStdHandle и SetStdHandle. Эти функции позволяют перенаправлять и использовать в приложении дескрипторы стандартных файлов.

Чтение и запись

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

В приложении фактические операции чтения и записи выполняются с применением функций ReadFile и WriteFile. Эти функции выполняют чтение или запись указанного числа байтов с места, обозначенного указателем файла, без форматирования данных. В листинге 17.2 показан фрагмент кода, в котором в результате последовательных вызовов функции WriteFile в файл записывается строка, а затем функция ReadFile считывает эту строку из файла.

Листинг 17.2. Чтение и запись файлов________________________________

См.    \local-sources\chapl7\tl7-01.txt

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

Система Windows разрешает открывать файл и выполнять в него запись сразу нескольким приложениям. При этом, если два приложения пишут в одно и то же место в файле одновременно, могут возникнуть проблемы. Чтобы этого не случилось, приложения должны блокировать область файла, в которую они собираются выполнять запись, с помощью функции LockFile. Блокировка части файла не позволяет другим процессам читать или писать в указанной области. Попытки чтения или записи в область, заблокированную процессом, всегда оканчиваются неудачей. После окончания записи в файл приложение должно разблокировать эту область файла с помощью функции UnlockFile. Все заблокированные области должны быть разблокированы перед закрытием файла.

Похожие материалы

Информация о работе