Страница 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 (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 (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 аналогично:
А возвращать 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