Апострофы (" или ') в INI-файлах
Модератор: Дед Пахом
Правила форума
При написании вопроса или обсуждении проблемы, не забывайте указывать версию Clarion который Вы используете.
А так же пользуйтесь спец. тегами при вставке исходников!!!
При написании вопроса или обсуждении проблемы, не забывайте указывать версию Clarion который Вы используете.
А так же пользуйтесь спец. тегами при вставке исходников!!!
- morkovin
- Ветеран
- Сообщения: 935
- Зарегистрирован: 20 Июль 2005, 14:53
- Откуда: Volgograd, Russia
- Благодарил (а): 9 раз
- Поблагодарили: 4 раза
- Контактная информация:
Апострофы (" или ') в INI-файлах
C10, C6.2 ABC
Если сохранять в INI-файле строку, в которой первый или последний символ (") или (') (двойная или одинарная кавычка ), то при восстановлении эти символы отбрасываются. Приходится перед сохранением программно их удваивать. Задолбало уже. Какой такой "глубокий" смысл в этом отбрасывнии?
З.Ы.Если эти символы НЕ в начальной или конечной позиции, то всё нормально.
Если сохранять в INI-файле строку, в которой первый или последний символ (") или (') (двойная или одинарная кавычка ), то при восстановлении эти символы отбрасываются. Приходится перед сохранением программно их удваивать. Задолбало уже. Какой такой "глубокий" смысл в этом отбрасывнии?
З.Ы.Если эти символы НЕ в начальной или конечной позиции, то всё нормально.
WBR, morkovin
- Admin
- Администратор
- Сообщения: 4010
- Зарегистрирован: 05 Июль 2005, 15:59
- Откуда: Хабаровск
- Благодарил (а): 53 раза
- Поблагодарили: 33 раза
- Контактная информация:
Апострофы (" или ') в INI-файлах
Немного не так.
Убираются кавычки (одинарные и двойные) только если они были в начале и в конце записываемой строки.
И если в начале и конце был одинаковый вид кавычек. см. пример.
Убираются они при чтении из INI файла.
Файл test.ini
Результат:
Убираются кавычки (одинарные и двойные) только если они были в начале и в конце записываемой строки.
И если в начале и конце был одинаковый вид кавычек. см. пример.
Убираются они при чтении из 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)
Код: Выделить всё
[setup]
string1='строка
string2="строка
string3=строка'
string4=строка"
string5='строка'
string6="строка"
string7='строка"
string8="строка'
string9=
string10=
Рай совершает ошибки ничуть не реже чем ад. Просто у него хорошая пресса
- Admin
- Администратор
- Сообщения: 4010
- Зарегистрирован: 05 Июль 2005, 15:59
- Откуда: Хабаровск
- Благодарил (а): 53 раза
- Поблагодарили: 33 раза
- Контактная информация:
Апострофы (" или ') в INI-файлах
Вот вам пример простого кодирования строки:
Храниться в INI будет так:
При желании текст в INI даже редактировать можно.
Для каких нибудь строк в которых есть вероятность кавычек в начале и конце вполне подойдет.
Код: Выделить всё
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
Код: Выделить всё
[setup]
string1=039241242240238234224
string2=034241242240238234224
string3=241242240238234224039
string4=241242240238234224034
string5=039241242240238234224039
string6=034241242240238234224034
string7=039241242240238234224034
string8=034241242240238234224039
string9=
string10=
Для каких нибудь строк в которых есть вероятность кавычек в начале и конце вполне подойдет.
Рай совершает ошибки ничуть не реже чем ад. Просто у него хорошая пресса
- morkovin
- Ветеран
- Сообщения: 935
- Зарегистрирован: 20 Июль 2005, 14:53
- Откуда: Volgograd, Russia
- Благодарил (а): 9 раз
- Поблагодарили: 4 раза
- Контактная информация:
Апострофы (" или ') в INI-файлах
Круто!Храниться в INI будет так
ИМХО, у меня попроще - см. аттач (темпл. и процедура)
p.s. Переменные, указанные в шаблоне, д.б. удалены из стандартного списка Preserve
- Вложения
-
- IniQuote.zip
- (1.65 КБ) 87 скачиваний
WBR, morkovin
- Admin
- Администратор
- Сообщения: 4010
- Зарегистрирован: 05 Июль 2005, 15:59
- Откуда: Хабаровск
- Благодарил (а): 53 раза
- Поблагодарили: 33 раза
- Контактная информация:
Апострофы (" или ') в INI-файлах
Шаблончик страшненький.
Генерит избыточный код.
На 10 переменных к примеру, сделает 36 дублированных (избыточных) строк кода.
Генерит избыточный код.
На 10 переменных к примеру, сделает 36 дублированных (избыточных) строк кода.
Рай совершает ошибки ничуть не реже чем ад. Просто у него хорошая пресса
- Дед Пахом
- Старичок
- Сообщения: 3289
- Зарегистрирован: 07 Июль 2005, 16:51
- Откуда: Москва, Россия
- Благодарил (а): 15 раз
- Поблагодарили: 49 раз
- Контактная информация:
Апострофы (" или ') в INI-файлах
А память, выделенную в Str2Val и Val2Str, кто будет освобождать?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
С уважением, ДП
- Admin
- Администратор
- Сообщения: 4010
- Зарегистрирован: 05 Июль 2005, 15:59
- Откуда: Хабаровск
- Благодарил (а): 53 раза
- Поблагодарили: 33 раза
- Контактная информация:
Апострофы (" или ') в INI-файлах
х.з. кто будет. На коленке функции накропал.
Что то затрудняюсь.
Как вы освободите память после RETURN

Если нельзя - сделать фиксированные переменные заведомо большего размера и все.
Рай совершает ошибки ничуть не реже чем ад. Просто у него хорошая пресса
- Дед Пахом
- Старичок
- Сообщения: 3289
- Зарегистрирован: 07 Июль 2005, 16:51
- Откуда: Москва, Россия
- Благодарил (а): 15 раз
- Поблагодарили: 49 раз
- Контактная информация:
Апострофы (" или ') в INI-файлах
Вот так можно объявить в StrToVal, в ValToStr аналогично:
Код: Выделить всё
Res STRING(LEN(CLIP(Text))*3)
С уважением, ДП
- Admin
- Администратор
- Сообщения: 4010
- Зарегистрирован: 05 Июль 2005, 15:59
- Откуда: Хабаровск
- Благодарил (а): 53 раза
- Поблагодарили: 33 раза
- Контактная информация:
Апострофы (" или ') в INI-файлах
А если все таки хочу динамически, как!?
Рай совершает ошибки ничуть не реже чем ад. Просто у него хорошая пресса
- Дед Пахом
- Старичок
- Сообщения: 3289
- Зарегистрирован: 07 Июль 2005, 16:51
- Откуда: Москва, Россия
- Благодарил (а): 15 раз
- Поблагодарили: 49 раз
- Контактная информация:
Апострофы (" или ') в INI-файлах
Тогда тип возвращаемого значения надо объявить *STRING, и делать DISPOSE() в вызывающем коде. Или IDynStr, или класс с деструктором.
С уважением, ДП
- Admin
- Администратор
- Сообщения: 4010
- Зарегистрирован: 05 Июль 2005, 15:59
- Откуда: Хабаровск
- Благодарил (а): 53 раза
- Поблагодарили: 33 раза
- Контактная информация:
Апострофы (" или ') в INI-файлах
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
Рай совершает ошибки ничуть не реже чем ад. Просто у него хорошая пресса