|
|
| Посл.отвђт | Сообщен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 Спасибо большое человеческое!!! Попробую переделать. |
|
Powered by miniBB 1.6 © 2001-2002
Время загрузки страницы (сек.): 0.074 |