Опубликован: 15.11.2010 | Доступ: свободный | Студентов: 745 / 44 | Оценка: 4.00 / 5.00 | Длительность: 17:30:00
Специальности: Программист
Лекция 9:

Ввод-вывод с использованием WinAPI

Аннотация: На этой лекции Вы познакомитесь с файловыми операциями ввода-вывода с использованием API Windows, а также научитесь программировать "каркас" приложения Windows по предложенным автором шаблонам. Это поможет Вам впоследствии легко создавать простейшие программы Windows.

9.1. Файловые операции ввода-вывода с использованием WinAPI

9.1.1. Особенности файловых операций в Microsoft Windows

Файловые операции в операционной системе Microsoft Windows отличаются от файловых операций MS-DOS следующим:

  1. Заявлена переносимость всех файловых операций в операционных системах MS Windows на последующие версии. Это значит, что если строго следовать рекомендациям Microsoft Windows в описании её файловых функций, программа будет "эффективно компилироваться" как для платформы Win16, так и для платформы Win32 и Win64;
  2. Указанные ниже функции позволяют создавать текстовые файлы размером как до 64 Кбайт, так и до 2 Гбайт (напомню, что в MS-DOS максимальный размер текстового файла - 64 Кбайт);
  3. Имена файлов теперь могут писаться в кодировке ANSI с использованием "длинных имён" файлов. В MS-DOS возможно именовать файлы только в кодировке OEM с "короткими" именами файлов и каталогов;
  4. Содержимое файла, созданного средствами Windows, сразу и целиком читается в оперативную память компьютера, и уже потом анализируются другими функциями (например, sscanf). В MS-DOS Вы могли вводить и выводить файлы последовательно по строкам, по формату и по записям (используя функции fges, getc, fscanf и др.). Используемый в Windows способ чтения-записи является более "безопасным" для обработчика данных и операционной системы;
  5. Следствие вышесказанного. В операционной системе Microsoft Windows нужно открывать файл, осуществлять все операции чтения записи и закрывать файл в пределах обработчика одного сообщения из очереди сообщений Windows. В MS-DOS Вы могли вначале программы открыть файл, где-то в теле программы осуществить операции ввода-вывода, и закрыть файлы в конце программы. В Windows этот способ не работает - программа в ней выполняется не в том порядке, в котором записаны действия, а в том порядке, в каком поступают программе системные вызовы. Вследствие этого, по "логике программы", закрытие файла может произойти прежде, чем операция записи-чтения из файла. Естественно, произойдёт "отказ системы" со всеми вытекающими неприятными последствиями;
  6. Функции открытия файлов возвращают операционной системе намного больше информации, чем "обычные" функции открытия файлов MS-DOS. При этом принимать решение, использовать или нет эту расширенную информацию, может сам программист;
  7. "Стандартными средствами открытия файлов" в Microsoft Windows невозможно открытие файлов для добавления информации в конец файла.… Наверное, Вы поняли почему. Если нет - отвечаю: при чтении всего файла в буфер в конец файла можно записать любую информацию, с тем чтобы затем её сбросить на диск под тем же именем, и дополнительного режима открытия файлов не требуется;
  8. Помимо функций файлового ввода-вывода Microsoft Windows Вы также можете использовать аналогичные функции ввода-вывода MS-DOS, с указанными Выше ограничениями. Но учтите, что функциями ввода-вывода MS-DOS (всё равно, являются ли они консольными, потоковыми или другими), нельзя выводить текст на экран, принтер, COM порт, а также вводить данные с клавиатуры;

Примечание: операции потокового вывода на экран и ввода с клавиатуры можно также осуществить и в Windows, указав опцию в IDE при создании проекта "консольное приложение Windows". Этот вопрос Вы можете изучить самостоятельно [38].

9.1.2. Функции создания и закрытия файлов методами Win API

Для создания, открытия и закрытия файлов Windows API использует следующие функции:

ФУНКЦИЯ OpenFile
СИНТАКСИС: HFILE WINAPI OpenFile( lpszFileName, lpOpenStruct, fuMode)

LPCSTR lpszFileName - путь к файлу (в виде дальнего указателя на строку в кодировке ANSI, заканчивающуюся двоичным нулём);

OFSTRUCT FAR* lpOpenStruct - адрес структуры OFSTRUCT, заполняемой при первом открытии файла;

UINT fuMode - режим работы и атрибуты файла;

НАЗНАЧЕНИЕ: Открывает файл и связывает с ним дескриптор файла;
ОПИСАНИЕ: Функция предназначена для создания, открытия, повторного открытия и удаления файлов. В имени файла допускается указывать символы шаблона, такие как "*" и "?". Параметр fuMode используется для определения действий, выполняемых функцией OpenFile, а также задаёт атрибуты файла. Когда функция OpenFile вызывается в первый раз для открытия файла, она заполняет структуру OFSTRUCT, описанную в приложении №1 (смотри пункт 9.4 данной лекции);
ВОЗВРАЩАЕМОЕ ЗНАЧЕНИЕ: Функция возвращает идентификатор файла, который можно (и нужно) использовать во всех последующих операциях с файлом, или -1 при ошибке;
ПЕРЕНОСИМОСТЬ: Версии MS Windows 3.0 и старше;

ФУНКЦИЯ _lopen
СИНТАКСИС: HFILE WINAPI _lopen( LPCSTR lpszFileName, int fuOpenMode)

LPCSTR lpszFileName - путь к файлу (в виде дальнего указателя на строку в кодировке ANSI, заканчивающуюся двоичным нулём);

int fnOpenMode - параметр определяет режим, в котором открывается файл;

НАЗНАЧЕНИЕ: Открывает файл и связывает с ним дескриптор файла (упрощённая версия);
ОПИСАНИЕ: Функция предназначена для открытия, повторного открытия файлов. В имени файла допускается указывать символы шаблона, такие как "*" и "?". Параметр fuMode используется для определения действий, выполняемых функцией _lopen ;
ВОЗВРАЩАЕМОЕ ЗНАЧЕНИЕ: Функция возвращает идентификатор файла, который можно (и нужно) использовать во всех последующих операциях с файлом, или HFILE_ERROR при ошибке;
ПЕРЕНОСИМОСТЬ: Версии MS Windows 3.0 и старше;

ФУНКЦИЯ _lclose
СИНТАКСИС: HFILE WINAPI _lclose( hf )

HFILE hf - дескриптор закрываемого файла;

НАЗНАЧЕНИЕ: Закрывает файл, связанный с соответствующим дескриптором;
ОПИСАНИЕ: Закрывает файл с дескриптором hf ;
ВОЗВРАЩАЕМОЕ ЗНАЧЕНИЕ: Если файл закрыт успешно, _lclose возвращает нулевое значение. При ошибке возвращается значение: HFILE_ERROR ;
ПЕРЕНОСИМОСТЬ: Версии MS Windows 3.0 и старше;

ФУНКЦИЯ _lcreat
СИНТАКСИС: HFILE _lcreat( lpszFileName, fuAttribute)

LPCSTR lpszFileName - путь к файлу (в виде дальнего указателя на строку в кодировке ANSI, заканчивающуюся двоичным нулём);

int fuAttribute - переменная позволяет определить атрибуты создаваемого файла;

НАЗНАЧЕНИЕ: Создаёт файл средствами Win API;
ОПИСАНИЕ: Это более простая, чем OpenFile, функция для создания новых файлов. Имя файла не должно содержать метасимволов шаблона. Если указанный первым параметром файл не существует, функция _lcreat создаёт его и открывает для записи, возвращая его дескриптор файла. Если файл существует, он обрезается до нулевой длины, и затем открывается для чтения и записи;
ВОЗВРАЩАЕМОЕ ЗНАЧЕНИЕ: Идентификатор созданного файла;
ПЕРЕНОСИМОСТЬ: Версии MS Windows 3.0 и старше;

Отличие функции OpenFile от функции _lopen заключается в поддержке ей расширенной информации о файле, передаваемой структуре OFSTRUCT, и в большем числе поддерживаемых флагов команды. Информацию о флагах функций OpenFile, _lcreate и _lopen смотри в таблице 9.1. Описание функций смотри в приложении №I к данной лекции (пункт 9.4).

Таблица 9.1. Флаги и режимы открытия файлов средствами WinAPI.
Константа Описание
ФУНКЦИЯ OpenFile
OF_READ Файл открывается только для чтения.
OF_WRITE Файл открывается только для записи.
OF_READWRITE Файл открывается для чтения и записи.
OF_SHARE_COMPAT Открытие файла в режиме совместимости. В этом режиме несколько приложений могут одновременно открыть файл, причём все эти приложения должны открывать файл в режиме совместимости.
OF_SHARE_EXCLUSIVE Файл открывается в монопольном режиме. Для всех других приложений доступ к этому файлу на чтение и запись запрещён.
OF_SHARE_DENY_WRITE После открытия файла к нему запрещается доступ со стороны других приложений на запись.
OF_SHARE_DENY_READ После открытия файла к нему запрещается доступ со стороны других приложений на чтение.
OF_SHARE_DENY_NONE Для открываемого файла не запрещается доступ к файлу ни на чтение, ни на запись.
OF_PARSE Если указан этот флаг, функция OpenFile не выполняет никаких других действий, кроме заполнения структуры OFSTRUCT.
OF_DELETE Уничтожение существующего файла.
OF_VERIFY Если указан этот флаг, то функция OpenFile сравнивает время и дату, записанную в структуре OFSTRUCT, со временем и датой изменений указанного файла. Если обнаружено несоответствие, функция OpenFile возвращает значение HFILE_ERROR.
OF_SEARCH Операционная система выполняет поиск файла в каталогах даже в том случае, когда текстовая строка, указанная параметром lpszFileName, содержит полный путь к файлу.
OF_PROMPT Если указан этот флаг, то в случае невозможности найти указанный файл Windows выдаёт диалоговую панель с предложением вставить в дисковод A: дискету с файлом. Это флаг используется очень редко.
OF_CANCEL Данный флаг указывается вместе с флагом OF_PROMPT. Если он указан, то в описанную выше диалоговую панель будет добавлена кнопка "Cancel" для отмены открытия файла. Приложение при этом получит код ошибки, соответствующий ненайденному файлу, а пользователь – возможность выйти из затруднительного положения, в которое он попадает при отсутствии дискеты с нужным файлом.
OF_CREATE выполняется создание нового файла. Если указанный файл существует, то он обрезается до нулевой длины.
OF_EXIST При указании этого флага функция OpenFile вначале открывает файл, а потом сразу же его закрывает. Эта операция может быть использована для того, чтобы убедиться в существовании указанного файла на диске.
OF_REOPEN Этот флаг используется при повторном открытии файла на основе информации, хранящейся в структуре OFSTRUCT.
ФУНКЦИЯ _lopen
OF_READ Файл открывается только для чтения.
OF_WRITE Файл открывается только для записи.
OF_READWRITE Файл открывается для чтения и записи.
OF_SHARE_COMPAT Открытие файла в режиме совместимости. В этом режиме несколько приложений могут одновременно открыть файл, причём все эти приложения должны открывать файл в режиме совместимости.
OF_SHARE_EXCLUSIVE Файл открывается в монопольном режиме. Для всех других приложений доступ к этому файлу на чтение и запись запрещён.
OF_SHARE_DENY_WRITE После открытия файла к нему запрещается доступ со стороны других приложений на запись.
OF_SHARE_DENY_READ После открытия файла к нему запрещается доступ со стороны других приложений на чтение.
OF_SHARE_DENY_NONE Для открываемого файла не запрещается доступ к файлу ни на чтение, ни на запись.
ФУНКЦИЯ _lcreat
0 Нормальный файл, для которого разрешено выполнение операций чтения и записи
1 Этот файл можно открыть только для чтения
2 Скрытый файл
3 Системный файл