· Начало · Отвђтить · Статистика · Поиск · FAQ · Правила · Установки · Язык · Выход · WASM.RU · Noir.Ru ·

 WASM Phorum —› WASM.WIN32 —› Работа с файлами

<< . 1 . 2 .

Посл.отвђт Сообщенiе


Дата: Окт 28, 2003 20:24:33 · Поправил: Gromozeka

Если я не буду читать посимвольно, тогда я не знаю когда сделать все остальное...Дело в том что в файле должны находиться действительные числа, с которыми мне прийдеться выполнять некоторые операции, приэтом эти данные должны массивом и память под массив должна выделяться динамически. В этих операциях мне прийдеться использовать сопроцессор. Поэтому я и использую посимвольное считывание. Если знаете как это сделать по другому- подскажите, буду весьма благодарен.


Дата: Окт 28, 2003 21:00:22

Gromozeka
В этих операциях мне прийдеться использовать сопроцессор.
Причём здесь сопроцессор?

Если знаете как это сделать по другому- подскажите, буду весьма благодарен.
Через MMF (Memory Mapped Files). У Iczelion'а есть пример.


Дата: Окт 28, 2003 23:37:42

Gromozeka
Мой исходник на самом деле твой, но исправленный и без лишних объявлений ;)
Вообще-то в коде нет ничего, что бы записывало данные в файл, там происходит только чтение и вывод на экран.
Чтобы читать данные из файла побайтно, измени функцию ReadFile на:
invoke ReadFile,hFile,hMemory,1,ADDR nRead,NULL 


Дата: Окт 29, 2003 08:56:42

Gromozeka
Дело в том что в файле должны находиться действительные числа
Файл текстовый или нет?

Sk. Inc.
А что такое mmf?
mmf уже расшифровал Quantum

более читабельно будет поместить все константы в секцию констант, это же не ошибка
При чем здесь читабельность?
Equates не имеют к сегменту .const ни какого отношения, обрабатываются они как элементарный поиск+замена на этапе компиляции (препроцессор в Си).


Дата: Окт 29, 2003 10:37:55 · Поправил: Gromozeka

Quantum
Сопроцессор мне надо использовать потом, в арифметических вычислениях.Построчно я считываю для того чтобы сформировать string который я потом при помощи функции StrTofloat смогу перевести в float.

q_q
файл текстовый.


Дата: Окт 29, 2003 10:56:57

Gromozeka
Файл большой?

Если я не буду читать посимвольно, тогда я не знаю когда сделать все остальное...
mmf позволяет читать не просто посимвольно, а обеспечивает произвольный доступ к любому символу в пределах файла, все файловые операции (чтение или перемещение указателя позиции в файле) берет на себя ОС.


Дата: Окт 29, 2003 11:12:41

q_q
файл произвольного размера( как преподователь захочет так и будет). А про mmf я просто еще не успел прочитать.


Дата: Окт 29, 2003 14:31:06 · Поправил: Gromozeka

Прога не завершает своей работы( консоль не закрываеться). Что в ней не так как надо?
.386
.model flat, stdcall
option casemap :none ; case sensitive
;--------------------------------------------------------------------- -----------
include c:\masm32\include\kernel32.inc
include c:\masm32\include\masm32.inc
include c:\masm32\include\windows.inc
includelib kernel32.lib
includelib masm32.lib
includelib user32.lib
;---------------------------------------------------------.data
;--------------------------------------------------------------------- -----------
FileName db "c:\test.txt",0
Msg2 db "Data of file > "
ConsoleTitle db 'Input & Output',0
;--------------------------------------------------------------------- -----------
.data?
;--------------------------------------------------------------------- -----------
hInstance HINSTANCE ?
CommandLine LPSTR ?
hwndEdit HWND ?
hFile HANDLE ?
hMemory HANDLE ?
pMemory DWORD ?
;--------------------------------------------------------------------- -----------
.code
filesize proc lpszFileName:DWORD

LOCAL wfd :WIN32_FIND_DATA

invoke FindFirstFile,lpszFileName,ADDR wfd
.if eax == INVALID_HANDLE_VALUE
mov eax, -1
jmp fsEnd
.endif

mov eax, wfd.nFileSizeLow
mov ebx,eax

fsEnd:

ret

filesize endp


Main proc
;--------------------------------------------------------------------- -----------
LOCAL hOutPut :DWORD ;хэндл для вывода
LOCAL nRead :DWORD ;прочитано байт
LOCAL nWriten :DWORD ;напечатано байт
;--------------------------------------------------------------------- -----------
invoke AllocConsole ; создаем консоль
invoke ClearScreen
invoke SetConsoleTitle,addr ConsoleTitle
invoke GetStdHandle,STD_OUTPUT_HANDLE
mov hOutPut,eax
invoke CreateFile,offset FileName,GENERIC_READ,NULL,NULL,OPEN_EXISTING,FILE_ATTRIBUTE_NORMAL,NU LL
mov hFile,eax
invoke GlobalAlloc,GMEM_ZEROINIT,MEMSIZE
mov hMemory,eax
invoke ReadFile,hFile,hMemory,1,ADDR nRead,NULL
invoke WriteConsole,hOutPut,addr Msg2,15,addr nWriten,NULL
invoke WriteConsole,hOutPut,hMemory,nRead,addr nWriten,NULL
@@1: invoke ReadFile,hFile,hMemory,1,ADDR nRead,NULL
nWriten,NULL
invoke WriteConsole,hOutPut,hMemory,nRead,addr nWriten,NULL
mov eax,hMemory
cmp eax,ebx
jne @@1
invoke Sleep,2000d
invoke FreeConsole ; удаляем консоль
invoke ExitProcess,0
ret
Main endp

invoke Sleep,2000d
invoke FreeConsole ; удаляем консоль
invoke ExitProcess,0

end Main
start:
invoke FileSize
invoke Main
endp


Дата: Окт 29, 2003 18:35:20

Gromozeka
А про mmf я просто еще не успел прочитать.
Настоятельно рекомендую почитать (в переводе лежит на сайте).

Вместо FindFirstFile для получения размера файла можно задействовать GetFileSize.

Опять этот .const ...

А консоль не закрывается потому что размер файла (в регистре EBX) сравнивается с адресом буфера (в регистре EAX) и получается бесконечный цикл.


Дата: Окт 30, 2003 01:21:21

q_q
При чем здесь читабельность?
Я пишу в RadASM'е, а он может сворачивать секции (кажется такое есть в VisualStudio.Net), поэтому мне удобнее записывать все константы в секцию констант, т.к. они тогда не мешаются, и всегда можно их без проблем найти.
Я имею в виду читабельность исходника, а не откомпилированного файла.


Дата: Окт 30, 2003 13:12:07

Quantum
а что надо, я уже все перепробывал что в голову пришло(соответсвенно моим познаниям в Masm'e и вообще в ассемблере).


Дата: Окт 30, 2003 19:01:27

Gromozeka
Следующий код читает строки произвольной длинны из файла, но токены (строки) разделены нулевым байтом вместо последовательности [13,10]. Я полагаю, что вы сможете переделать этот код для построчного парсинга, т.е. вместо поиска нуля чтоб программа искала разделитель [13,10].
.DATA?
hFile    dd ?
hMapping dd ?
hView    dd ?

.CODE
* * *
invoke CreateFile,OFFSET FileName,GENERIC_READ,\
       FILE_SHARE_READ,0,OPEN_EXISTING,\
       FILE_ATTRIBUTE_NORMAL,0
.IF eax != INVALID_HANDLE_VALUE
    mov hFile,eax
    invoke GetFileSize,eax,0
    push eax
    invoke CreateFileMapping,hFile,0,PAGE_READONLY,0,0,0
    mov hMapping,eax
    invoke MapViewOfFile,eax,FILE_MAP_READ,0,0,0
    pop ecx ; помещаем размер файла в ECX
    mov hView,eax
    xchg eax,edi
@parse:
    jecxz @end_parse
    xor eax,eax ; Ищем ноль (разделитель)
    mov esi,edi
    repnz scasb
    jnz @end_parse
    push ecx
    push edi
    ; Тут ESI указавает на строку
    ; Самое время вызвать "invoke Str2Float,ESI"
    pop edi
    pop ecx
    jmp @parse
@end_parse:
    invoke UnmapViewOfFile,hView
    invoke CloseHandle,hMapping
    invoke CloseHandle,hFile
.ENDIF


Дата: Окт 30, 2003 19:06:26

Спасибо большое человеческое!!!
Попробую переделать.

<< . 1 . 2 .


Powered by miniBB 1.6 © 2001-2002
Время загрузки страницы (сек.): 0.074