Ввод-вывод с использованием WinAPI
9.1. Файловые операции ввода-вывода с использованием WinAPI
9.1.1. Особенности файловых операций в Microsoft Windows
Файловые операции в операционной системе Microsoft Windows отличаются от файловых операций MS-DOS следующим:
- Заявлена переносимость всех файловых операций в операционных системах MS Windows на последующие версии. Это значит, что если строго следовать рекомендациям Microsoft Windows в описании её файловых функций, программа будет "эффективно компилироваться" как для платформы Win16, так и для платформы Win32 и Win64;
- Указанные ниже функции позволяют создавать текстовые файлы размером как до 64 Кбайт, так и до 2 Гбайт (напомню, что в MS-DOS максимальный размер текстового файла - 64 Кбайт);
- Имена файлов теперь могут писаться в кодировке ANSI с использованием "длинных имён" файлов. В MS-DOS возможно именовать файлы только в кодировке OEM с "короткими" именами файлов и каталогов;
- Содержимое файла, созданного средствами Windows, сразу и целиком читается в оперативную память компьютера, и уже потом анализируются другими функциями (например, sscanf). В MS-DOS Вы могли вводить и выводить файлы последовательно по строкам, по формату и по записям (используя функции fges, getc, fscanf и др.). Используемый в Windows способ чтения-записи является более "безопасным" для обработчика данных и операционной системы;
- Следствие вышесказанного. В операционной системе Microsoft Windows нужно открывать файл, осуществлять все операции чтения записи и закрывать файл в пределах обработчика одного сообщения из очереди сообщений Windows. В MS-DOS Вы могли вначале программы открыть файл, где-то в теле программы осуществить операции ввода-вывода, и закрыть файлы в конце программы. В Windows этот способ не работает - программа в ней выполняется не в том порядке, в котором записаны действия, а в том порядке, в каком поступают программе системные вызовы. Вследствие этого, по "логике программы", закрытие файла может произойти прежде, чем операция записи-чтения из файла. Естественно, произойдёт "отказ системы" со всеми вытекающими неприятными последствиями;
- Функции открытия файлов возвращают операционной системе намного больше информации, чем "обычные" функции открытия файлов MS-DOS. При этом принимать решение, использовать или нет эту расширенную информацию, может сам программист;
- "Стандартными средствами открытия файлов" в Microsoft Windows невозможно открытие файлов для добавления информации в конец файла.… Наверное, Вы поняли почему. Если нет - отвечаю: при чтении всего файла в буфер в конец файла можно записать любую информацию, с тем чтобы затем её сбросить на диск под тем же именем, и дополнительного режима открытия файлов не требуется;
- Помимо функций файлового ввода-вывода Microsoft Windows Вы также можете использовать аналогичные функции ввода-вывода MS-DOS, с указанными Выше ограничениями. Но учтите, что функциями ввода-вывода MS-DOS (всё равно, являются ли они консольными, потоковыми или другими), нельзя выводить текст на экран, принтер, COM порт, а также вводить данные с клавиатуры;
Примечание: операции потокового вывода на экран и ввода с клавиатуры можно также осуществить и в Windows, указав опцию в IDE при создании проекта "консольное приложение Windows". Этот вопрос Вы можете изучить самостоятельно [38].
9.1.2. Функции создания и закрытия файлов методами Win API
Для создания, открытия и закрытия файлов Windows API использует следующие функции:
ФУНКЦИЯ | _lclose |
СИНТАКСИС: |
HFILE WINAPI _lclose( hf ) HFILE hf - дескриптор закрываемого файла; |
НАЗНАЧЕНИЕ: | Закрывает файл, связанный с соответствующим дескриптором; |
ОПИСАНИЕ: | Закрывает файл с дескриптором hf ; |
ВОЗВРАЩАЕМОЕ ЗНАЧЕНИЕ: | Если файл закрыт успешно, _lclose возвращает нулевое значение. При ошибке возвращается значение: HFILE_ERROR ; |
ПЕРЕНОСИМОСТЬ: | Версии MS Windows 3.0 и старше; |
Отличие функции OpenFile от функции _lopen заключается в поддержке ей расширенной информации о файле, передаваемой структуре OFSTRUCT, и в большем числе поддерживаемых флагов команды. Информацию о флагах функций OpenFile, _lcreate и _lopen смотри в таблице 9.1. Описание функций смотри в приложении №I к данной лекции (пункт 9.4).