Парсинг файла настроек

Тема в разделе "WASM.BEGINNERS", создана пользователем pikador, 8 июн 2007.

  1. pikador

    pikador New Member

    Публикаций:
    0
    Регистрация:
    2 апр 2007
    Сообщения:
    101
    Не очень силен в асме, и в поиске ничего такого нет. Как реализовать?
    Нужно считать из файла три слова разделенные пробелом или переводом на новую.
    Всунуть их в три переменные.
    код на апи: CreateFile ReadFile CloseFile
     
  2. Asterix

    Asterix New Member

    Публикаций:
    0
    Регистрация:
    25 фев 2003
    Сообщения:
    3.576
    CloseFile нет такой API
     
  3. maxdiver

    maxdiver Max

    Публикаций:
    0
    Регистрация:
    18 июл 2006
    Сообщения:
    308
    Адрес:
    Саратов
    pikador
    Ну считай весь файл целиком в буфер (GetFileSize+ReadFile).
    Потом найди в буфере первый символ-разделитель (strchr или for или еще что-нибудь), всё что до него - первое слово.
    Запомни позицию разделителя. Найди конец этого разделителя (чтобы несколько подряд пробелов считались как один), и начиная с этой позиции ищи следующий разделитель. Опять же, всё, что между двумя группами разделителей - одно слово.

    Можно пойти другим путем. Считывать по одной букве и обрабатывать, тогда всё вообще элементарно.
     
  4. n0name

    n0name New Member

    Публикаций:
    0
    Регистрация:
    5 июн 2004
    Сообщения:
    4.336
    Адрес:
    Russia
    примерно так.
    Код (Text):
    1. PSTR words[3], *current;
    2.  
    3. words[0] = data;
    4. current = &words[1];
    5. for (i = 0; data[i]; i++)
    6.   if ((data[i] == '\n') || (data[i] == ' ')){
    7.     *current = &data[i+1];
    8.     current++;
    9.     data[i] = 0;
    10.   }
     
  5. Freeman

    Freeman New Member

    Публикаций:
    0
    Регистрация:
    10 фев 2005
    Сообщения:
    1.385
    Адрес:
    Ukraine
    статья про регулярные выражения есть на сайте :)
     
  6. MSoft

    MSoft New Member

    Публикаций:
    0
    Регистрация:
    16 дек 2006
    Сообщения:
    2.854
    n0name
    раздел-то про ассемблер :)
     
  7. n0name

    n0name New Member

    Публикаций:
    0
    Регистрация:
    5 июн 2004
    Сообщения:
    4.336
    Адрес:
    Russia
    MSoft
    не важно :P
    главное алгоритм ;)
     
  8. maxdiver

    maxdiver Max

    Публикаций:
    0
    Регистрация:
    18 июл 2006
    Сообщения:
    308
    Адрес:
    Саратов
    n0name
    А если там будет два подряд пробела? Или вместо \n будет \r\n?
     
  9. n0name

    n0name New Member

    Публикаций:
    0
    Регистрация:
    5 июн 2004
    Сообщения:
    4.336
    Адрес:
    Russia
    maxdiver
    он же написал разделенные пробелом, а не пробелами :P
    а про \r\n, это смотря как читать из файла.
     
  10. maxdiver

    maxdiver Max

    Публикаций:
    0
    Регистрация:
    18 июл 2006
    Сообщения:
    308
    Адрес:
    Саратов
    n0name
    Раз на асме, то значит, CreateFile'ом. А он сохраняет \r\n. Так что немного изменить придётся, нужно предусмотреть и случай \n, и случай \r\n ;)
     
  11. n0name

    n0name New Member

    Публикаций:
    0
    Регистрация:
    5 июн 2004
    Сообщения:
    4.336
    Адрес:
    Russia
    maxdiver
    не обязательно рассматривать отдельно случай.
    наткнулись на \n, смотрим предыдущий символ, если \r то зануляем его.
    перед
    *current = &data[i+1];
    ставим
    if (data[i-1] == '\r')
    data[i-1] = 0;
     
  12. Asterix

    Asterix New Member

    Публикаций:
    0
    Регистрация:
    25 фев 2003
    Сообщения:
    3.576
    топикстартер не сказал чей файл он парсит, если своя программа то
    не проще ли использовать ini файлы и функции для работы с ними ?
     
  13. pikador

    pikador New Member

    Публикаций:
    0
    Регистрация:
    2 апр 2007
    Сообщения:
    101
    Ммм... Свои, подскажи пример работы с ини файлами.
    ( сам бы методом тыка нашел -- правую руку сломал =) а кодить надо )
     
  14. RamMerLabs

    RamMerLabs Well-Known Member

    Публикаций:
    0
    Регистрация:
    11 сен 2006
    Сообщения:
    1.426
    а поиск уже запретили?

    WritePrivateProfileString
    GetPrivateProfileInt
    GetPrivateProfileString
     
  15. pikador

    pikador New Member

    Публикаций:
    0
    Регистрация:
    2 апр 2007
    Сообщения:
    101
    ммм.... Почему не записывает в файл?

    Код (Text):
    1.   lpAppName  DB "lpAppName",0
    2.   lpKeyName  DB "lpKeyName",0
    3.   lpString   DB "lpString",0
    4.   lpFileName DB "pcs.dat",0
    5. . .. ... ........................................................ ... .. .
    6.             push OFFSET lpFileName
    7.             push offset lpString
    8.             push OFFSET lpKeyName
    9.             push OFFSET lpAppName
    10.             call WritePrivateProfileStringA@16
     
  16. Asterix

    Asterix New Member

    Публикаций:
    0
    Регистрация:
    25 фев 2003
    Сообщения:
    3.576
    может и записывает, но вы не можете найти файла, лучше указывать полный путь к файлу
     
  17. pikador

    pikador New Member

    Публикаций:
    0
    Регистрация:
    2 апр 2007
    Сообщения:
    101
    так и есть, спс
     
  18. S_Alex

    S_Alex Alex

    Публикаций:
    0
    Регистрация:
    27 авг 2004
    Сообщения:
    561
    Адрес:
    Ukraine
    Попробуй так.
    Код (Text):
    1.     invoke  GetPrivateProfileString,ADDR lpCFGName,ADDR lpKeyBaud,\
    2.             ADDR szBaud9600,ADDR TEMPBUF,sizeof TEMPBUF, ADDR CurDir
    3.     invoke  atodw,ADDR TEMPBUF
    4.     mov     SC_.SC_BAUD,eax
     
  19. Asterix

    Asterix New Member

    Публикаций:
    0
    Регистрация:
    25 фев 2003
    Сообщения:
    3.576
    pikador
    вот приблизительный код как это нужно делать
    Код (Text):
    1. .IF ($invoke(GetModuleFileName, hinst, ebx, SIZEOF sBuffer))
    2. @loop:
    3.         .IF BYTE PTR [ebx+eax-1] != '.'
    4.            dec eax
    5.            jnz @loop
    6.            jmp @bad_exit
    7.         .ENDIF
    8.         mov DWORD PTR [ebx+eax], 'ini'
    9.                 invoke WritePrivateProfileString, NULL, NULL, NULL, ebx
    10.                 mov esi, OFFSET Buf
    11.                 invoke GetPrivateProfileString, $CTA0("Options"), $CTA0("NoWarning"),\
    12.                                                 $CTA0(), esi, SIZEOF Buf, ebx
    13.                 .IF eax != 0
    14.                    .IF BYTE PTR [esi] == '1'
    15.                       inc fNoWarning
    16.                    .ENDIF
    17.                 .ENDIF
    18.                 invoke GetPrivateProfileString, $CTA0("Options"), $CTA0("Parameters"),\
    19.                                                 $CTA0(), esi, SIZEOF Buf, ebx
    20.                 .IF eax == 0
    21.                    invoke WritePrivateProfileString, $CTA0("Options"), $CTA0("Parameters"),\
    22.                                                      $CTA0("1000001"), ebx
    23.                    invoke GetPrivateProfileString, $CTA0("Options"), $CTA0("Parameters"),\
    24.                                                    $CTA0(), esi, SIZEOF Buf, ebx
    25.                    test eax, eax
    26.                    jz @bad_exit