Заглавная страница Избранные статьи Случайная статья Познавательные статьи Новые добавления Обратная связь FAQ Написать работу КАТЕГОРИИ: АрхеологияБиология Генетика География Информатика История Логика Маркетинг Математика Менеджмент Механика Педагогика Религия Социология Технологии Физика Философия Финансы Химия Экология ТОП 10 на сайте Приготовление дезинфицирующих растворов различной концентрацииТехника нижней прямой подачи мяча. Франко-прусская война (причины и последствия) Организация работы процедурного кабинета Смысловое и механическое запоминание, их место и роль в усвоении знаний Коммуникативные барьеры и пути их преодоления Обработка изделий медицинского назначения многократного применения Образцы текста публицистического стиля Четыре типа изменения баланса Задачи с ответами для Всероссийской олимпиады по праву Мы поможем в написании ваших работ! ЗНАЕТЕ ЛИ ВЫ?
Влияние общества на человека
Приготовление дезинфицирующих растворов различной концентрации Практические работы по географии для 6 класса Организация работы процедурного кабинета Изменения в неживой природе осенью Уборка процедурного кабинета Сольфеджио. Все правила по сольфеджио Балочные системы. Определение реакций опор и моментов защемления |
Работа с файлами в системе WindowsСодержание книги
Поиск на нашем сайте
Создание и открытие файла производится функцией HANDLE WINAPI CreateFile( __in LPCTSTR lpFileName, __in DWORD dwDesiredAccess, __in DWORD dwShareMode, __in_opt LPSECURITY_ATTRIBUTES lpSecurityAttributes, __in DWORD dwCreationDisposition, __in DWORD dwFlagsAndAttributes, __in_opt HANDLE hTemplateFile); lpFileName – указатель на ASCII-строку с именем (путем) открываемого или создаваемого файла; dwDesiredAccess – тип доступа к файлу: GENERIC_READ = 80000000b - доступ для чтения; GENERIC_WRITE = 40000000b - доступ для записи; GENERIC_READ+GENERIC_WRITE = 0C0000000h - доступ для чтения-записи; dwShareMode – режим разделения файлов между разными процессами, может принимать значения: 0 — монополизация доступа к файлу; FILE_SHARE_READ=00000001h — другие процессы могут открыть файл, но только для чтения, запись в файл монополизирована процессом, открывшим файл; FILE_SHARE_WRITE=00000002h — другие процессы могут открыть файл, но только для записи, чтение в файл монополизировано процессом, открывшим файл; FILE_SHARE_READ+FILE_SHARE_WRITE=00000003h — другие процессы могут открывать файл для чтения-записи; lpSecurityAttributes – указатель на структуру SecurityAttributes (файл winbase.h), определяющую защиту связанного с файлом объекта ядра; при отсутствии защиты заносится NULL; dwCreationDisposition – действия для случаев, когда файл существует или не существует, данный параметр может принимать значения: CREATE_NEW=1 — создать новый файл, если файл не существует; если файл существует, то функция завершается формированием ошибки; CREATE_ALWAYS=2 — создать новый файл, если файл не существует; если он существует, то заместить новым; OPEN_EXISTING=3 — открыть файл, если он существует; если файл не существует, то формируется ошибка; OPEN_ALWAYS=4 — открыть файл при его существовании и создать его если файла нет; TRUNCATE_EXISTING=5 — открыть файл с усечением его до нулевой длины; если файл не существует, то формируется ошибка; dwFlagsAndAttributes – флаги и атрибуты; этот параметр используется для задания характеристик создаваемого файла: FILE_ATTRIBUTE_READ0NLY=00000001h – файл только для чтения; FILE_ATTRIBUTE_HIDDEN=00000002h – скрытый файл; FILE_ATTRIBUTE_SYSTEM=00000004h – системный файл; FILE_ATTRIBUTE_DIRECTORY=00000010h – каталог; FILE_ATTRIBUTE_ARCHIVE=00000020h – архивный файл; FILE_ATTRIBUTE_N0RMAL=00000080h – обычный файл для чтения-записи (этот атрибут нельзя комбинировать с другими); FILE_ATTRIBUTE_TEMPORARY=00000100h – создается временный файл FILE_FLAG_WRITE_THR0UGH=80000000h – не использовать промежуточное кэширование при записи на диск, а все изменения записывать прямо на диск; FILE_FLAG_NO_BUFFERING=20000000h – не использовать средства буферизации операционной системы; FILE_FLAG_RANDOM_ACCESS=10000000h – прямой доступ к файлу (установка этого флага или флага FILE_FLAG_SEQUENTIAL_SCAN=08000000h – последовательный доступ к файлу; FILE_FLAG_DELETE_ON_CLOSE=04000000h – удалить файл после его закрытия; FILE_FLAG_OVERLAPPED=40000000h – асинхронный доступ к файлу (синхронность означает то, что программа, вызвавшая функцию для доступа к файлу, приостанавливается до тех пор, пока не закончит работу функция ввода-вывода); hTemplateFile – при создании нового файла значением данного параметра является дескриптор другого существующего и предварительно открытого файла, а новый файл создается с теми же значениями атрибутов и флагов, что и у файла, дескриптор которого указан в параметре. При удачном завершении функция возвращает в регистре ЕАХ дескриптор нового файла. В случае неудачи функция возвращает в регистре ЕАХ значение NULL.
Закрытие файла производится функцией BOOL WINAPI CloseHandle(__in HANDLE hObject); hObject – дескриптор, полученный при открытии файла функцией CreateFile. При удачном завершении функция возвращает ненулевое значение в регистре ЕАХ. В случае неудачи функция возвращает в регистре ЕАХ значение NULL. Удаление файла производится функцией BOOL WINAPI DeleteFile(__in LPCTSTR lpFileName); lpFileName – указатель на ASCIIZ-строку с именем (путем) удаляемого файла. Перед удалением файл необходимо закрыть, хотя в некоторых версиях Windows это не является обязательным. При удачном завершении функция возвращает ненулевое значение в регистре ЕАХ. В случае неудачи функция возвращает в регистре ЕАХ значение NULL. Установка текущей файловой позиции Доступ к содержимому файла может быть произвольным (прямым) и последовательным. Обычно, функции ввода-вывода работают с файловым указателем. Но необходимо иметь в виду, что файловый указатель связан только с описателем файла. Его значение равно текущему номеру позиции в файле, с которой будет производиться чтение-запись данных при очередном вызове функции ввода-вывода. В первый момент после открытия значение указателя равно 0, то есть он указывает на начало файла. Функции, производящие чтение-запись в файле, меняют значение файлового указателя на количество прочитаных или записаных байт. При необходимости, а при организации прямого доступа к файлу без этого не обойтись, значение файлового указателя можно изменять с помощью функции DWORD WINAPI SetFilePointer( __in HANDLE hFile, __in LONG lDistanceToMove, __inout_opt PLONG lpDistanceToMoveHigh, __in DWORD dwMoveMethod); hFile – дескриптор файла, в котором производится позиционирование указателя позиции (дескриптор был получен функцией CreateFile); lDistanceToMove – расстояние в байтах, на которое необходимо переместить указатель; это число может трактоваться как знаковое и беззнаковое — его отрицательное значение соответствует случаю, когда указатель требуется перемещать к началу файла; lpDistanceToMoveHigh – используется при необходимости создания 64-битового знакового значения указателя позиции как значение старших 32 битов указателя; dwMoveMethod – определяет трактовку параметров lDistanceToMove и lpDistanceToMoveHigh. FILE_BEGIN=0 — указатель позиции – значение без знака, заданное содержимым полей 2 и 3; FILE_CURRENT=1 — текущее значение указателя позиции складывается со знаковым значением, заданным в полях 2 и 3; FILE_END=2 — значение, определяемое содержимым полей 2 и 3, должно представлять собой отрицательное значение, и смещение в файле вычисляется как сумма, в которой первое слагаемое определяется полями 2 и 3, а второе является размером файла. Получение размера файла осуществляет функция DWORD WINAPI GetFileSize( __in HANDLE hFile, __out_opt LPDWORD lpFileSizeHigh); hFile – дескриптор файла, размер которого будет получен; lpFileSizeHigh – указатель на старшее двойное слово, если размер памяти занимает больше 32 бит, если не требуется, данный аргумент равен нулю. Функция возвращает младшее двойное слово размера файла в регистре EAX. В случае ошибки функция возвращает константу INVALID_FILE_SIZE = 0xFFFFFFFF. Чтение данных из файла осуществляется функцией BOOL WINAPI ReadFile( __in HANDLE hFile, __out LPVOID lpBuffer, __in DWORD nNumberOfBytesToRead, __out_opt LPDWORD lpNumberOfBytesRead, __inout_opt LPOVERLAPPED lpOverlapped); Запись в файл осуществляется функцией BOOL WINAPI WriteFile( __in HANDLE hFile, __in LPCVOID lpBuffer, __in DWORD nNumberOfBytesToWrite, __out_opt LPDWORD lpNumberOfBytesWritten, __inout_opt LPOVERLAPPED lpOverlapped); hFile – дескриптор файла, с которым производится операция чтения-записи; lpBuffer – указатель на буфер, с которым производится операция чтения-записи; nNumberOfBytesToWrite – число байт данных для чтения-записи; lpNumberOfBytesWritten – указатель на буфер, в который записывается число действительно считанных или записанных байт данных; lpOverlapped – указатель на структуру, используемую в процессе асинхронного ввода-вывода (для синхронного режима NULL). При удачном завершении функция возвращает ненулевое значение в регистре ЕАХ. В случае неудачи функция возвращает в регистре ЕАХ значение NULL. Пример программы: считать строку файла и продублировать его в тот же файл со следующей строки, дополнительно выводя на консоль. .486 .model flat,STDCALL ; описания констант Windows STD_INPUT_HANDLE equ -10 STD_OUTPUT_HANDLE equ -11 STD_ERROR_HANDLE equ -12
FILE_SHARE_READ equ 1h FILE_SHARE_WRITE equ 2h FILE_ATTRIBUTE_READONLY equ 1h FILE_ATTRIBUTE_HIDDEN equ 2h FILE_ATTRIBUTE_SYSTEM equ 4h FILE_ATTRIBUTE_DIRECTORY equ 10h FILE_ATTRIBUTE_ARCHIVE equ 20h FILE_ATTRIBUTE_NORMAL equ 80h FILE_ATTRIBUTE_TEMPORARY equ 100h FILE_ATTRIBUTE_COMPRESSED equ 80
FILE_BEGIN equ 0 FILE_CURRENT equ 1 FILE_END equ 2
CREATE_NEW equ 1 CREATE_ALWAYS equ 2 OPEN_EXISTING equ 3 OPEN_ALWAYS equ 4 TRUNCATE_EXISTING equ 5
GENERIC_READ equ 80000000h GENERIC_WRITE equ 40000000h GENERIC_EXECUTE equ 20000000h GENERIC_ALL equ 10000000h
include C:\masm32\include\kernel32.inc
.data file db "myfile.txt",0 hFile dd 0 TitleText db 'Работа с файлами',0 dOut dd 0;дескриптор вывода консоли NumWri dd 0;действительное количество символов buf db 300 dup(?) n db 13,10 ; перевод строки
.code start proc INVOKE GetStdHandle, STD_OUTPUT_HANDLE mov dOut,eax;dOut-дескриптор вывода консоли INVOKE CreateFile,;открываем файл offset file, GENERIC_READ or GENERIC_WRITE, 0, 0, ;защита файла не требуется OPEN_ALWAYS, 0, ;атрибуты 0 mov hFile,eax;дескриптор файла
INVOKE ReadFile,; чтение строки из файла hFile, offset buf, 300, offset NumWri, 0
INVOKE WriteConsole,; Вывод в консоль dOut, offset buf, NumWri, offset NumWri, 0
push NumWri ; сохраняем в стек количество считаных байт INVOKE WriteFile,; перевод строки hFile, offset n, 2, offset NumWri, 0 pop NumWri INVOKE WriteFile,; дублирование в файл строки hFile, offset buf, NumWri, offset NumWri, 0 INVOKE CloseHandle, hFile; закрытие файла INVOKE ExitProcess, 0 start endp end start Вывод чисел в консоль Сложность вывода чисел состоит в том, что для восприятия человеком число в консоли должно состоять из последовательности символов цифр, а в реальности число – это некоторый эквивалент такой последовательности, представленный с разрядной сетке вычислительной машины. Именно с таким числом производятся вычисления, но для отображения результатов вычислений необходимо перевести число в символьную строку. ASCII-код символа ‘0’ равен 30h. Коды остальных символов цифр располагаются по возрастанию. Следовательно, чтобы получить ASCII-код цифры нужно к ней добавить ASCII-код ‘0’. Для целых чисел программа вывода была рассмотрена в примере «Подсчет количества символов в строке»: IntToStr proc Number:DWORD, Str1:DWORD MOV EAX, Number MOV EDI,Str1 MOV ECX, 0 CMP EAX,0 JGE @I1 MOV DL, '-' MOV [EDI],DL INC EDI NOT EAX INC EAX @I1: MOV EBX, 10 MOV EDX, 0 IDIV EBX PUSH EDX INC ECX CMP EAX,0 JG @I1 @I2: POP EDX ADD DL, 30h MOV [EDI],DL INC EDI LOOP @I2 MOV DL,0 MOV [EDI], DL INC EDI MOV EAX, EDI SUB EAX, Str1 ret IntToStr endp В результате получим в строке Str1 число (положительное или отрицательное) в символьном представлении, оканчивающееся ‘\0’–символом. Для вывода вещественного числа вначале выведем функцией IntToStr его целую часть. После этого в выводимую строку поместим символ ‘.’ и вычтем целую часть из исходного числа. Для преобразования к символам строки дробной части умножим ее на коэффициент требуемой точности 10n и вновь сохраним целую часть полученного числа. Для преобразования в символьную строку снова вызовем функцию IntToStr, но указатель передадим не на начало строки, а на следующий символ строки (регистр edi). .586 .model flat, stdcall include console.inc .data consoleInHandle DD? consoleOutHandle DD? a DD -974.600007 str1 DB 20 dup(?)
Numi dd? ; целая часть числа tol dd 10000; точность corr dd 0.00001; коррекция «лукавого знака» cw dw? ; управление округлением .code FloatToStr proc Num:DWORD, strr:DWORD fstcw cw or cw, 0C00h fldcw cw mov edi, strr mov ecx, 20 @F0: mov byte ptr [edi],0 inc edi loop @F0 mov edi, strr fld Num fadd corr fldz fcomip ST, ST(1) jb @F1 mov byte ptr [edi],'-' inc edi @F1: fsub corr fabs fadd corr fist Numi INVOKE IntToStr, Numi, edi dec edi mov bl,'.' mov [edi],bl inc edi fild Numi fsubrp fabs fimul tol fistp Numi push tol push corr mov corr, 10 @F2: mov edx,0; определение количества нулей после точки mov eax, tol idiv corr mov tol, eax cmp Numi, eax jge @F3 mov byte ptr [edi],'0' inc edi cmp tol, 1 jg @F2 cmp Numi, 0 je @F4 @F3: INVOKE IntToStr, Numi, edi @F4: pop corr pop tol ret FloatToStr endp
start proc INVOKE GetStdHandle, STD_INPUT_HANDLE MOV consoleInHandle,EAX INVOKE GetStdHandle, STD_OUTPUT_HANDLE MOV consoleOutHandle,EAX INVOKE FloatToStr, a, offset str1 INVOKE PrintStr, offset str1, consoleOutHandle INVOKE ReadSymbol, consoleInHandle, consoleOutHandle, 1 INVOKE ExitProcess, 0 start endp end start
|
||||
Последнее изменение этой страницы: 2020-12-09; просмотров: 180; Нарушение авторского права страницы; Мы поможем в написании вашей работы! infopedia.su Все материалы представленные на сайте исключительно с целью ознакомления читателями и не преследуют коммерческих целей или нарушение авторских прав. Обратная связь - 13.59.82.60 (0.008 с.) |