Не очень силен в асме, и в поиске ничего такого нет. Как реализовать? Нужно считать из файла три слова разделенные пробелом или переводом на новую. Всунуть их в три переменные. код на апи: CreateFile ReadFile CloseFile
pikador Ну считай весь файл целиком в буфер (GetFileSize+ReadFile). Потом найди в буфере первый символ-разделитель (strchr или for или еще что-нибудь), всё что до него - первое слово. Запомни позицию разделителя. Найди конец этого разделителя (чтобы несколько подряд пробелов считались как один), и начиная с этой позиции ищи следующий разделитель. Опять же, всё, что между двумя группами разделителей - одно слово. Можно пойти другим путем. Считывать по одной букве и обрабатывать, тогда всё вообще элементарно.
примерно так. Код (Text): PSTR words[3], *current; words[0] = data; current = &words[1]; for (i = 0; data[i]; i++) if ((data[i] == '\n') || (data[i] == ' ')){ *current = &data[i+1]; current++; data[i] = 0; }
maxdiver он же написал разделенные пробелом, а не пробелами :P а про \r\n, это смотря как читать из файла.
n0name Раз на асме, то значит, CreateFile'ом. А он сохраняет \r\n. Так что немного изменить придётся, нужно предусмотреть и случай \n, и случай \r\n
maxdiver не обязательно рассматривать отдельно случай. наткнулись на \n, смотрим предыдущий символ, если \r то зануляем его. перед *current = &data[i+1]; ставим if (data[i-1] == '\r') data[i-1] = 0;
топикстартер не сказал чей файл он парсит, если своя программа то не проще ли использовать ini файлы и функции для работы с ними ?
Ммм... Свои, подскажи пример работы с ини файлами. ( сам бы методом тыка нашел -- правую руку сломал =) а кодить надо )
ммм.... Почему не записывает в файл? Код (Text): lpAppName DB "lpAppName",0 lpKeyName DB "lpKeyName",0 lpString DB "lpString",0 lpFileName DB "pcs.dat",0 . .. ... ........................................................ ... .. . push OFFSET lpFileName push offset lpString push OFFSET lpKeyName push OFFSET lpAppName call WritePrivateProfileStringA@16
Попробуй так. Код (Text): invoke GetPrivateProfileString,ADDR lpCFGName,ADDR lpKeyBaud,\ ADDR szBaud9600,ADDR TEMPBUF,sizeof TEMPBUF, ADDR CurDir invoke atodw,ADDR TEMPBUF mov SC_.SC_BAUD,eax
pikador вот приблизительный код как это нужно делать Код (Text): .IF ($invoke(GetModuleFileName, hinst, ebx, SIZEOF sBuffer)) @loop: .IF BYTE PTR [ebx+eax-1] != '.' dec eax jnz @loop jmp @bad_exit .ENDIF mov DWORD PTR [ebx+eax], 'ini' invoke WritePrivateProfileString, NULL, NULL, NULL, ebx mov esi, OFFSET Buf invoke GetPrivateProfileString, $CTA0("Options"), $CTA0("NoWarning"),\ $CTA0(), esi, SIZEOF Buf, ebx .IF eax != 0 .IF BYTE PTR [esi] == '1' inc fNoWarning .ENDIF .ENDIF invoke GetPrivateProfileString, $CTA0("Options"), $CTA0("Parameters"),\ $CTA0(), esi, SIZEOF Buf, ebx .IF eax == 0 invoke WritePrivateProfileString, $CTA0("Options"), $CTA0("Parameters"),\ $CTA0("1000001"), ebx invoke GetPrivateProfileString, $CTA0("Options"), $CTA0("Parameters"),\ $CTA0(), esi, SIZEOF Buf, ebx test eax, eax jz @bad_exit