Страница 1 из 1

Апострофы (" или ') в INI-файлах

Добавлено: 26 Ноябрь 2015, 19:09
morkovin
C10, C6.2 ABC
Если сохранять в INI-файле строку, в которой первый или последний символ (") или (') (двойная или одинарная кавычка ), то при восстановлении эти символы отбрасываются. Приходится перед сохранением программно их удваивать. Задолбало уже. Какой такой "глубокий" смысл в этом отбрасывнии?

З.Ы.Если эти символы НЕ в начальной или конечной позиции, то всё нормально.

Апострофы (" или ') в INI-файлах

Добавлено: 27 Ноябрь 2015, 5:15
Admin
Немного не так.
Убираются кавычки (одинарные и двойные) только если они были в начале и в конце записываемой строки.
И если в начале и конце был одинаковый вид кавычек. см. пример.
Убираются они при чтении из INI файла.

Код: Выделить всё

PROGRAM
  MAP
  END

string STRING(10),DIM(10)
result STRING(100)

  CODE
  string[1] = '''строка'
  string[2] = '"строка'
  string[3] = 'строка'''
  string[4] = 'строка"'
  string[5] = '''строка'''
  string[6] = '"строка"'
  string[7] = '''строка"'
  string[8] = '"строка'''
  LOOP W# = 1 TO MAXIMUM(string,1)
    PUTINI('setup', 'string'&W#, string[W#], '.\test.ini')
    result = CLIP(result)&'|'&CLIP(GETINI('setup', 'string'&W#, , '.\test.ini'))
  END
  MESSAGE(result)
Файл test.ini

Код: Выделить всё

[setup]
string1='строка
string2="строка
string3=строка'
string4=строка"
string5='строка'
string6="строка"
string7='строка"
string8="строка'
string9=
string10=
Результат:
2015-11-27 12-15-31.png
2015-11-27 12-15-31.png (8.58 КБ) 3159 просмотров

Апострофы (" или ') в INI-файлах

Добавлено: 27 Ноябрь 2015, 5:34
Admin
Вот вам пример простого кодирования строки:

Код: Выделить всё

            PROGRAM
            MAP
              Str2Val(STRING Text),STRING
              Val2Str(STRING Text),STRING
            END

string STRING(10),DIM(10)
result STRING(100)

  CODE
  string[1] = '''строка'
  string[2] = '"строка'
  string[3] = 'строка'''
  string[4] = 'строка"'
  string[5] = '''строка'''
  string[6] = '"строка"'
  string[7] = '''строка"'
  string[8] = '"строка'''
  LOOP W# = 1 TO MAXIMUM(string,1)
    PUTINI('setup', 'string'&W#, Str2Val(string[W#]), '.\test.ini')
    result = CLIP(result)&'|'&CLIP(Val2Str(GETINI('setup', 'string'&W#, , '.\test.ini')))
  END
  MESSAGE(result)


Str2Val         PROCEDURE(STRING Text)
Res             &STRING
  CODE
  Res &= NEW STRING(LEN(CLIP(Text))*3)
  LOOP W# = 1 TO LEN(CLIP(Text))
    Res = CLIP(Res) & FORMAT(VAL(Text[W#]),@N03)
  END
  RETURN Res

Val2Str         PROCEDURE(STRING Text)
Res             &CSTRING
  CODE
  Res &= NEW CSTRING(LEN(CLIP(Text))/3+1)
  LOOP W# = 1 TO LEN(CLIP(Text)) BY 3
    Res = Res & CHR(Text[W#:W#+2])
  END
  RETURN Res
Храниться в INI будет так:

Код: Выделить всё

[setup]
string1=039241242240238234224
string2=034241242240238234224
string3=241242240238234224039
string4=241242240238234224034
string5=039241242240238234224039
string6=034241242240238234224034
string7=039241242240238234224034
string8=034241242240238234224039
string9=
string10=
При желании текст в INI даже редактировать можно.
Для каких нибудь строк в которых есть вероятность кавычек в начале и конце вполне подойдет.
2015-11-27 12-33-52.png
2015-11-27 12-33-52.png (7.26 КБ) 3158 просмотров

Апострофы (" или ') в INI-файлах

Добавлено: 27 Ноябрь 2015, 9:11
morkovin
Храниться в INI будет так
Круто!
ИМХО, у меня попроще - см. аттач (темпл. и процедура)

p.s. Переменные, указанные в шаблоне, д.б. удалены из стандартного списка Preserve

Апострофы (" или ') в INI-файлах

Добавлено: 27 Ноябрь 2015, 12:32
Admin
Шаблончик страшненький.
Генерит избыточный код.
На 10 переменных к примеру, сделает 36 дублированных (избыточных) строк кода.

Апострофы (" или ') в INI-файлах

Добавлено: 27 Ноябрь 2015, 12:33
Дед Пахом
LOOP W# = 1 TO MAXIMUM(string,1)
PUTINI('setup', 'string'&W#, Str2Val(string[W#]), '.\test.ini')
result = CLIP(result)&'|'&CLIP(Val2Str(GETINI('setup', 'string'&W#, , '.\test.ini')))
END
А память, выделенную в Str2Val и Val2Str, кто будет освобождать?

Апострофы (" или ') в INI-файлах

Добавлено: 27 Ноябрь 2015, 12:38
Admin
Дед Пахом писал(а): А память, выделенную в Str2Val и Val2Str, кто будет освобождать?
х.з. кто будет. На коленке функции накропал.
Что то затрудняюсь.
Как вы освободите память после RETURN :)
Если нельзя - сделать фиксированные переменные заведомо большего размера и все.

Апострофы (" или ') в INI-файлах

Добавлено: 27 Ноябрь 2015, 13:00
Дед Пахом
Admin писал(а): Res &= NEW STRING(LEN(CLIP(Text))*3)
Вот так можно объявить в StrToVal, в ValToStr аналогично:

Код: Выделить всё

Res   STRING(LEN(CLIP(Text))*3)
А возвращать CLIP(Res)

Апострофы (" или ') в INI-файлах

Добавлено: 27 Ноябрь 2015, 14:46
Admin
Дед Пахом писал(а): Вот так можно объявить в StrToVal, в ValToStr
А если все таки хочу динамически, как!?

Апострофы (" или ') в INI-файлах

Добавлено: 27 Ноябрь 2015, 16:58
Дед Пахом
Тогда тип возвращаемого значения надо объявить *STRING, и делать DISPOSE() в вызывающем коде. Или IDynStr, или класс с деструктором.

Апострофы (" или ') в INI-файлах

Добавлено: 28 Ноябрь 2015, 5:52
Admin
Дед Пахом писал(а): или класс с деструктором
OK
Что бы тут были корректные примеры, выложу...

Код: Выделить всё

            PROGRAM
            MAP
              Str2Val(STRING Text),STRING
              Val2Str(STRING Text),STRING
            END

string STRING(10),DIM(10)
result STRING(100)                           

dstrc       CLASS,TYPE
Str           &CSTRING
Init          PROCEDURE(LONG sSize) 
Destruct      PROCEDURE
            END

  CODE
  string[1] = '''строка'
  string[2] = '"строка'
  string[3] = 'строка'''
  string[4] = 'строка"'
  string[5] = '''строка'''
  string[6] = '"строка"'
  string[7] = '''строка"'
  string[8] = '"строка'''
  LOOP W# = 1 TO MAXIMUM(string,1)
    PUTINI('setup', 'string'&W#, Str2Val(string[W#]), '.\test.ini')
    result = CLIP(result)&'|'&CLIP(Val2Str(GETINI('setup', 'string'&W#, , '.\test.ini')))
  END
  MESSAGE(result)


Str2Val         PROCEDURE(STRING Text)
Res             dstrc
  CODE
  Res.Init(LEN(CLIP(Text))*3+1)
  LOOP W# = 1 TO LEN(CLIP(Text))
    Res.Str = Res.Str & FORMAT(VAL(Text[W#]),@N03)
  END
  RETURN Res.Str

Val2Str         PROCEDURE(STRING Text)
Res             dstrc
  CODE
  Res.Init(LEN(CLIP(Text))/3+1)
  LOOP W# = 1 TO LEN(CLIP(Text)) BY 3
    Res.Str = Res.Str & CHR(Text[W#:W#+2])
  END
  RETURN Res.Str
  
dstrc.Init      PROCEDURE(LONG sSize) 
  CODE
  SELF.Str &= NEW CSTRING(sSize)

dstrc.Destruct  PROCEDURE
  CODE
  IF ~SELF.Str &= NULL
    DISPOSE(SELF.Str)
  END