Здраствуйте. Цель: получить файл размером 600000 байт. Программа должна спрашивать имя файла. программа: .386 .model flat, stdcall option casemap:none include \masm32\include\windows.inc include \masm32\include\user32.inc include \masm32\include\kernel32.inc includelib \masm32\lib\user32.lib includelib \masm32\lib\kernel32.lib BSIZE equ 128 .data fName db ? msg db "a" fHandle dd ? cWritten dd ? cRead dd ? stdin dd ? .code start: invoke GetStdHandle, STD_INPUT_HANDLE mov stdin, eax invoke ReadConsole, stdin, ADDR fName, BSIZE, ADDR cRead, NULL invoke CreateFile, ADDR fName, GENERIC_WRITE,0,NULL,CREATE_ALWAYS,FILE_ATTRIBUTE_ARCHIVE,0 mov fHandle, eax mov edx,1 mov ecx,600000 nxt: push ecx push edx invoke WriteFile, fHandle, ADDR msg, sizeof msg, ADDR cWritten, NULL pop edx inc edx pop ecx loop nxt invoke CloseHandle, fHandle invoke ExitProcess,0 end start Файл не создается По-моему функция CreateFile не знает какой длинны переменная fName (это мои домыслы). Объясните, если не трудно, в чем дело и где ошибка. Спасибо.
allexUnder lpFileName Points to a null-terminated string that specifies the name of the object 1) Надо отвести под fName не один байт, а "скоко нужно" 2) ReadConsole по-моему не ставит нолик в конце считанного текста, т.ч. поставь сам В доках написано, что ReadConsole вообще может и в Unicode читать ... 3) цикл на 600000 записей будет много времени выполнятся. Если содержимое неважно, то просто переведи указатель в файле на 599999 (SetFilePointer) и запиши один байт. Если нужно заполнить, то уж не байтами конечно пиши.
allexUnder Размер буфера должен быть равен максимальной длине имени. Нолик ты должен поставить сам в конце имени, если ReadConsole его не ставит. Не исключен вариант Unicode, тогда длина буфера в 2 раза больше и нужно будет еще конвертировать. А вообще с "кавалерийскими" замашками лучше программированием не заниматься - прочти для начала что-нибудь и разбери пару готовых исходников.