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

Clarion, Clarion 7

Модератор: Дед Пахом

Правила форума
При написании вопроса или обсуждении проблемы, не забывайте указывать версию Clarion который Вы используете.
А так же пользуйтесь спец. тегами при вставке исходников!!!
Ответить
Аватара пользователя
morkovin
Ветеран
Сообщения: 935
Зарегистрирован: 20 Июль 2005, 14:53
Откуда: Volgograd, Russia
Благодарил (а): 9 раз
Поблагодарили: 4 раза
Контактная информация:

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

Сообщение morkovin »

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

З.Ы.Если эти символы НЕ в начальной или конечной позиции, то всё нормально.
WBR, morkovin
Аватара пользователя
Admin
Администратор
Сообщения: 4010
Зарегистрирован: 05 Июль 2005, 15:59
Откуда: Хабаровск
Благодарил (а): 53 раза
Поблагодарили: 33 раза
Контактная информация:

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

Сообщение 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 КБ) 3117 просмотров
Рай совершает ошибки ничуть не реже чем ад. Просто у него хорошая пресса
Аватара пользователя
Admin
Администратор
Сообщения: 4010
Зарегистрирован: 05 Июль 2005, 15:59
Откуда: Хабаровск
Благодарил (а): 53 раза
Поблагодарили: 33 раза
Контактная информация:

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

Сообщение 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 КБ) 3116 просмотров
Рай совершает ошибки ничуть не реже чем ад. Просто у него хорошая пресса
Аватара пользователя
morkovin
Ветеран
Сообщения: 935
Зарегистрирован: 20 Июль 2005, 14:53
Откуда: Volgograd, Russia
Благодарил (а): 9 раз
Поблагодарили: 4 раза
Контактная информация:

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

Сообщение morkovin »

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

p.s. Переменные, указанные в шаблоне, д.б. удалены из стандартного списка Preserve
Вложения
IniQuote.zip
(1.65 КБ) 87 скачиваний
WBR, morkovin
Аватара пользователя
Admin
Администратор
Сообщения: 4010
Зарегистрирован: 05 Июль 2005, 15:59
Откуда: Хабаровск
Благодарил (а): 53 раза
Поблагодарили: 33 раза
Контактная информация:

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

Сообщение Admin »

Шаблончик страшненький.
Генерит избыточный код.
На 10 переменных к примеру, сделает 36 дублированных (избыточных) строк кода.
Рай совершает ошибки ничуть не реже чем ад. Просто у него хорошая пресса
Аватара пользователя
Дед Пахом
Старичок
Сообщения: 3289
Зарегистрирован: 07 Июль 2005, 16:51
Откуда: Москва, Россия
Благодарил (а): 15 раз
Поблагодарили: 49 раз
Контактная информация:

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

Сообщение Дед Пахом »

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, кто будет освобождать?
С уважением, ДП
Аватара пользователя
Admin
Администратор
Сообщения: 4010
Зарегистрирован: 05 Июль 2005, 15:59
Откуда: Хабаровск
Благодарил (а): 53 раза
Поблагодарили: 33 раза
Контактная информация:

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

Сообщение Admin »

Дед Пахом писал(а): А память, выделенную в Str2Val и Val2Str, кто будет освобождать?
х.з. кто будет. На коленке функции накропал.
Что то затрудняюсь.
Как вы освободите память после RETURN :)
Если нельзя - сделать фиксированные переменные заведомо большего размера и все.
Рай совершает ошибки ничуть не реже чем ад. Просто у него хорошая пресса
Аватара пользователя
Дед Пахом
Старичок
Сообщения: 3289
Зарегистрирован: 07 Июль 2005, 16:51
Откуда: Москва, Россия
Благодарил (а): 15 раз
Поблагодарили: 49 раз
Контактная информация:

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

Сообщение Дед Пахом »

Admin писал(а): Res &= NEW STRING(LEN(CLIP(Text))*3)
Вот так можно объявить в StrToVal, в ValToStr аналогично:

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

Res   STRING(LEN(CLIP(Text))*3)
А возвращать CLIP(Res)
С уважением, ДП
Аватара пользователя
Admin
Администратор
Сообщения: 4010
Зарегистрирован: 05 Июль 2005, 15:59
Откуда: Хабаровск
Благодарил (а): 53 раза
Поблагодарили: 33 раза
Контактная информация:

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

Сообщение Admin »

Дед Пахом писал(а): Вот так можно объявить в StrToVal, в ValToStr
А если все таки хочу динамически, как!?
Рай совершает ошибки ничуть не реже чем ад. Просто у него хорошая пресса
Аватара пользователя
Дед Пахом
Старичок
Сообщения: 3289
Зарегистрирован: 07 Июль 2005, 16:51
Откуда: Москва, Россия
Благодарил (а): 15 раз
Поблагодарили: 49 раз
Контактная информация:

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

Сообщение Дед Пахом »

Тогда тип возвращаемого значения надо объявить *STRING, и делать DISPOSE() в вызывающем коде. Или IDynStr, или класс с деструктором.
С уважением, ДП
Аватара пользователя
Admin
Администратор
Сообщения: 4010
Зарегистрирован: 05 Июль 2005, 15:59
Откуда: Хабаровск
Благодарил (а): 53 раза
Поблагодарили: 33 раза
Контактная информация:

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

Сообщение 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  
Рай совершает ошибки ничуть не реже чем ад. Просто у него хорошая пресса
Ответить