- •Министерство образования и науки Российской Федерации
- •1. Стандартные диалоги
- •1.2. Работа с Common Dialogs
- •1.3. Стандартные диалоги открытия - сохранения файлов
- •1.3.1. Инициализация структуры перед вызовом диалога открытия или сохранения файла
- •1.3.2. Вызов диалога открытия файла
- •1.3.3. Вызов диалога сохранения файла
- •1.4. Стандартный диалог выбора цвета
- •1.4.1. Инициализация структуры перед вызовом диалога выбора цвета
- •2. Операции с файлами. Создание, открытие файлов. Запись - чтение данных из файлов.
- •2.1. Создание - открытие файла
- •2.2. Чтение из файла
- •2.3. Запись в файл
- •2.4. Перемещение указателя файла
- •3. Порядок выполнения работы
- •4. Контрольные вопросы
- •Приложение Файл cmdlg.Cpp
- •Файл cmdlg.Rc
- •Файл resource.H
2.2. Чтение из файла
Для чтения данных из файла используется функция ReadFile.
BOOL ReadFile(
HANDLE hFile, // дескриптор файла для чтения
LPVOID lpBuffer, // указатель на буфер для хранения данных
DWORD nNumberOfBytesToRead, // количество байт для чтения
LPDWORD lpNumberOfBytesRead, // указатель на количество фактически //считанных байтов
LPOVERLAPPED lpOverlapped // указатель на структуру данных
);
hFile -идентифицирует файл для чтения, должен быть открыт с доступом GENERIC_READ
lpBuffer - указатель на буфер для приема данных
nNumberOfBytesToRead - определяет количество байтов, которые необходимо прочитать из файла
lpNumberOfBytesRead – определяет, сколько прочитано байтов из файла
В случае если указатель lpOverlapped равен нулю, то nNumberOfBytesRead не может быть равным нулю.
lpOverlapped -указывает на структуру OVERLAPPED, которую здесь мы рассматривать не будем. Если hFile был создан с флагом FILE_FLAG_OVERLAPPED, указатель lpOverlapped не должен быть равен нулю.
Если hFile был открыт с флагом FILE_FLAG_OVERLAPPED и указатель lpOverlapped не равен NULL, операция чтения начинается со смещения указанного в структуре OVERLAPPED и может вернуть результат до завершения операции чтения. В этом случае об окончании операции чтения, сигнализирует событие в структуре OVERLAPPED.
Если hFile был открыт без флага FILE_FLAG_OVERLAPPED и указатель lpOverlapped равен NULL, операция чтения начинается со текущей позиции файл и не может вернуть результат до завершения операции чтения.
Если hFile был открыт без флага FILE_FLAG_OVERLAPPED и указатель lpOverlapped не равен NULL, операция чтения начинается со смещения указанного в структуре OVERLAPPED и не может вернуть результат до завершения операции чтения.
Возвращает ненулевой результат в случае успешного завершения.
Пример вызова:
ReadFile(hSrc, pBuffer, fsize, &read, NULL);
2.3. Запись в файл
Для записи в файл используется функция WriteFile, которая записывает данные в файл, начиная с позиции, определенной файловым указателем..
BOOL WriteFile(
HANDLE hFile, // дескриптор файла для записи
LPCVOID lpBuffer, // указатель на данные для записи
DWORD nNumberOfBytesToWrite, // количество байт для записи
LPDWORD lpNumberOfBytesWritten, // количество фактически записанных байтов
LPOVERLAPPED lpOverlapped // указатель на структуру OVERLAPPED
);
hFile – дескриптор файла для записи, должен быть открыт с доступом GENERIC_WRITE
lpBuffer – указывает на буфер, содержащий данные для записи
nNumberOfBytesToWrite- определяет количество байт для записи
lpNumberOfBytesWritten - указатель на количество фактически записанных байт
lpOverlapped- указатель на структуру OVERLAPPED
В случае успешного завершения возвращает ненулевое значение.
Пример вызова:
WriteFile(hDest, pBuffer, txt_length+1, &written, NULL);
2.4. Перемещение указателя файла
Для перемещения указателя по открытому файлу используется функция
DWORD SetFilePointer(
HANDLE hFile, // дескриптор файла
LONG lDistanceToMove, // смещение в байтах
PLONG lpDistanceToMoveHigh, // указатель на смещение в байтах
DWORD dwMoveMethod // точка отсчета
);
hFile – дескриптор файла
lDistanceToMove – 32 битное значение, количество байт, на которое необходимо сдвинуть указатель
lpDistanceToMoveHigh – если количество байт, на которое необходимо сдвинуть указатель файла превышает 32 бита, то данный параметр является указывает на старшее слово в 64 битном смещении, которое надо осуществить. NULL если смещение превышает 32 бита.
dwMoveMethod – точка отсчета, от которой необходимо отсчитывать смещение.
Таблица 2.1. Значения dwMoveMethod
-
Значение
Семантика
FILE_BEGIN
Точка отсчета - начало файла.
FILE_CURRENT
Точка отсчета – текущая позиция.
FILE_END
Точка отсчета – конец файла.
После работы с файлом его необходимо закрыть, для этого используется функция CloseHandle.
BOOL CloseHandle(
HANDLE hObject // дескриптор объекта для закрытия
);
hObject – определяет дескриптор объекта (файла)
Возвращает в случае успешного завершения ненулевое значение.
Пример вызова:
// закрытие файла
CloseHandle(hDest);
Далее в приложении приводится пример демонстрационной программы, использующей стандартные диалоги открытия - сохранения файла, в файле сохраняется текущий цвет прямоугольника, размеры которого совпадают с размером клиентской области окна. Цвет задается также с помощью стандартного диалога выбора цвета.