Функция ReadFile
Эта функция позволяет прочитать данные из файла, открытого в режиме для чтения. У функции ReadFile предусмотрен дополнительный асинхронный режим работы, при использовании которого программа может работать, не дожидаясь, пока завершится операция ввода. Прототип функции: ReadFile PROTO, Читать в буфер из файла handle: DWORD, Дескриптор файла pBuffer: PTR BYTE, Адрес буфера nBufsize: DWORD, Размер буфера или сколько байтов нужно прочитать pBytesRead: PTR DWORD, Адрес переменной, в которую записывается реальное количество прочитанных данных pOverlapped: PTR DWORD Адрес структуры типа OVERLAPPED, предназначенной для синхронизации операций ввода-вывода/ Первый параметр handle— это дескриптор файла, открытого с помощью функции CreateFile. Второй параметр pBuffer содержит адрес буфера, куда будут записываться данные. Параметр nBufsize определяет размер буфера или максимальное количество байтов, которое требуется прочитать из файла. Параметр pBytesRead содержит адрес 32-разрядной переменной, в которую записывается реальное количество прочитанных данных. Последний параметр pOverlapped необязательный. Он содержит адрес структурной переменной типа OVERLAPPED, которая используется для выполнения асинхронного чтения файла. Если используется обычная (синхронная) операция чтения файла, принятая по умолчанию, вместо адреса структуры подставьте вместо параметра pOverlapped нулевоезначение. Организацию чтения файла и вывода на экран (с использованием wsprintf - преобразования целых чисел в символы) рассмотрим на примере: (файл создан simple.txt создан в предыдущем примере и содержит четыре целых числа 3, 5, 7, 11). .586 Model flat, stdcall option casemap: none Includelib kernel32.lib Includelib kernel32.inc Includelib windows.inc Includelib user32.inc Includelib user32.lin NOFDIG equ 4 DSIZE equ 4 DIGSZ equ 10 BSIZE equ NOFDIG * DSIZE Data fname db “simple”, 0 fhandle dd? cwritten dd? fmt db “%d”, 0 stdout dd? cRead dd? buffer dd BSIZE dup (?) dig2sim db DIGSZ dup (?) Code start: Invoke GetStdHandle, STD_OUTPUT_HANDLE Mov stdout, eax invoke CreateFile, ADDR fname, \ GENERIC_READ, 0, NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, 0 Mov fhandle, eax Invoke ReadFile, fhandle, ADDR buffer, BSIZE, ADDR cread, NULL Mov ecx, NOFDIG Mov esi, 0 next: Push ecx invoke wsprintf, ADDR dig2sim, ADDRfmt, buffer[esi] invoke writeConsole, stdout, ADDR dig2sim, DIGSZ, \ ADDR cwritten, NULL Add esi, 4 Pop ecx Loop next Invoke CloseHandle, fhandle ExitProcess, 0
|