· Начало · Статистика · WASM.RU · Noir.Ru ·

 WASM Phorum (Оффлайн - 24.11.2003) —› WASM.WIN32 —› Работа с файлами

. 1 . 2 . >>

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


Дата: Окт 27, 2003 10:43:09

Подскажите пожалуйста, как в MASM'е открываеться файл для чтение, записи и как из одного файла считывать и записывать в другой файл.
Заранее спасибо.


Дата: Окт 27, 2003 11:52:09

Gromozeka
Смотри CreateFile, ReadFile, WriteFile, CloseHandle на msdn и 12 урок из Туториалы Iczelion'а by Iczelion


Дата: Окт 27, 2003 19:58:20 · Поправил: Gromozeka

Подскажите что надо иправить, что-бы данная программа считывала из файла данные и выводила их на экран.
.386
.model flat, stdcall
option casemap :none ; case sensitive

include c:\masm32\include\windows.inc
include c:\masm32\include\kernel32.inc
includelib c:\masm32\lib\kernel32.lib
include \masm32\include\user32.inc
include \masm32\include\comdlg32.inc
includelib \masm32\lib\user32.lib
includelib \masm32\lib\kernel32.lib
includelib \masm32\lib\comdlg32.lib

.const
IDM_OPEN equ 1
IDM_SAVE equ 2
IDM_EXIT equ 3
MAXSIZE equ 260
MEMSIZE equ 65535

.data
FileName db "c:\masm32\bin\first.txt",0
Generic_Read dw ?
File_Share_Write DW ?
File_Atribute_ReadOnly dw ?
Msg1 db "Type something > "
Msg2 db "Data of file > "
ConsoleTitle db 'Input & Output',0
buffer db MAXSIZE dup(0)


.DATA?
hInstance HINSTANCE ?
CommandLine LPSTR ?
hwndEdit HWND ?
hFile HANDLE ?
hMemory HANDLE ?
pMemory DWORD ?
SizeReadWrite DWORD ?

.code

Main proc
LOCAL InputBuffer[128] :BYTE ;буффер для ввода
LOCAL hOutPut :DWORD ;хэндл для вывода
LOCAL hInput :DWORD ;хэндл для ввода
LOCAL lpszBuffer :DWORD ;адрес буфера
LOCAL nRead :DWORD ;прочитано байт
LOCAL nWriten :DWORD ;напечатано байт
LOCAL hStdIn :DWORD

invoke SetConsoleTitle, addr ConsoleTitle

invoke GetStdHandle, STD_OUTPUT_HANDLE
mov hOutPut, eax

invoke GetStdHandle, STD_INPUT_HANDLE
mov hInput, eax

invoke CreateFile, ADDR buffer,GENERIC_READ ,
FILE_SHARE_READ ,
NULL,OPEN_EXISTING,FILE_ATTRIBUTE_READONLY,
NULL
mov hFile, eax
invoke GlobalAlloc,GMEM_MOVEABLE or GMEM_ZEROINIT,MEMSIZE
mov hMemory,eax

invoke ReadFile,hFile,pMemory,MEMSIZE-1,ADDR SizeReadWrite,NULL
;MOV hFile,eax
;Mov hOutPut,eax
invoke WriteConsole, hOutPut, addr Msg2, 15, addr nWriten, NULL

invoke WriteConsole, hOutPut, addr hMemory, nRead, addr nWriten, NULL

invoke Sleep, 3000d

invoke ExitProcess,0
Main endp


end Main


Дата: Окт 28, 2003 01:59:23

Gromozeka
Править здесь много ;)
Лучше возьми этот исходник, там уже все нормально.

Кстати, для кода существует специальный тег "Код". Его использование хоть и не обязательное, но все же желательное, т.к. с ним исходник более читабельный.

_263696037__Source.zip


Дата: Окт 28, 2003 11:24:42

Sk. Inc.
А как теперь зделать так что бы можно было из файла считывать построчно и записывать в файл.


Дата: Окт 28, 2003 12:50:01

Gromozeka
Что есть посторочно?
Признак конца строки 0Dh+0Ah или только 0Dh?
Читай кусок из файла память, если файл маленький, то весь сразу, и ищи свой "конец строки". Участки между концами пиши в файл.
Если использовать mmf, то еще проще.


Дата: Окт 28, 2003 14:08:02

А как теперь зделать так что бы можно было из файла считывать построчно и записывать в файл.

Дааа, влияние ЯВУ губительно сказывается %)

Файл -- это только Данные и ничего более


Дата: Окт 28, 2003 14:10:34

Gromozeka
Да, ещё вопрос.

А для чего это???
.const 
IDM_OPEN equ 1 
IDM_SAVE equ 2 
IDM_EXIT equ 3 
MAXSIZE equ 260 
MEMSIZE equ 65535 

Вы мне объёсните какая связь между EQU и .const!!!
Я уже 2 раз замечаю это непонятное явление.


Дата: Окт 28, 2003 14:19:41

Gromozeka
q_q вобщем-то прав, читать построчно нельзя, поэтому искать конец строки нужно будет самостоятельно. Хотя, возможно, есть какие-нибудь библиотеки (в С/С++, например) которые помогут тебе сделать это.

q_q
А что такое mmf?


Дата: Окт 28, 2003 14:29:27 · Поправил: Sk. Inc.

Edmond
1) Если ты про:
IDM_OPEN equ 1 
IDM_SAVE equ 2 
IDM_EXIT equ 3 
MAXSIZE equ 260 
MEMSIZE equ 65535
то там много и других ненужных объявлений. Видимо этот исходник является куском какой-то программы.
2) объёсните какая связь между EQU и .const!!!
Согласен, таким образом можно объявлять константы в любом месте исходника, но более читабельно будет поместить все константы в секцию констант, это же не ошибка :)


Дата: Окт 28, 2003 14:35:39

http://library.tu.edu.te.ua/libsearch/ftp.php?ch=%2FTechDoc%2FProgramm ing%2FwinAPI
Здесь лежат интересные книги, в том числе и по рабате с файлами :) rumiantsev.zip, если не ошибаюсь.


Дата: Окт 28, 2003 15:28:44

Sk. Inc.
предложил мне взять его программу так в моей много надо исправлять, я взял. И попытался ее переделать так, что бы она, для начала,считывала посимвольно до конца строки и выводила это все на экран и записывало в файл, но у меня ничего не получилось.Помогите пожалуйста!!!
.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
;--------------------------------------------------------------------- -----------
.const
;--------------------------------------------------------------------- -----------
MEMSIZE equ 2
;--------------------------------------------------------------------- -----------
.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
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
@@1: invoke ReadFile,hFile,hMemory,MEMSIZE-1,ADDR nRead,NULL
invoke WriteConsole,hOutPut,addr Msg2,15,addr nWriten,NULL
invoke WriteConsole,hOutPut,hMemory,nRead,addr nWriten,NULL
mov eax,hOutPut
cmp byte ptr [eax],0dh
jne @@1
invoke Sleep,2000d
invoke FreeConsole ; удаляем консоль
invoke ExitProcess,0
Main endp

end Main


Дата: Окт 28, 2003 16:28:21

Дык в строке 52 надо в eax грузить указатель на память, а не хэндл консоли "mov eax,hMemory" вместо "mov eax,hOutPut"


Дата: Окт 28, 2003 18:37:16

Sk. Inc.
Согласен, таким образом можно объявлять константы в любом месте исходника, но более читабельно будет поместить все константы в секцию констант, это же не ошибка :)

Нет, просто кое кто в одной статье написал, что связаны.. :/


Дата: Окт 28, 2003 19:44:58

Gromozeka
1. Кворум требует убрать ".const"
2. Читать файл посимвольно - признак ЯВУ :-)
3. Буфер лучше создавать через HeapAlloc:
   invoke GetProcessHeap
   invoke HeapAlloc,eax,0,MEMSIZE
   mov hMemory,eax
   ...
   invoke GetProcessHeap
   invoke HeapFree,eax,0,hMemory

. 1 . 2 . >>


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