Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: QSettings. Escape-последовательности в ini файлах
Форум на CrossPlatform.RU > Библиотеки > Qt > Qt Общие вопросы
Klabush
Обычно из инишки данные читаются как-то так:

QSettings Settings("Program.ini", QSettings::IniFormat);
Settings.beginGroup("Common");
QString Path = Settings.value("Path", "").toString();


Но если значение какого-либо ключа в ini файле будет содержать бэкслеш (\), то он воспримется как escape-последовательность.

То есть если у нас в инишке

[Common]
Path=c:\test\77.txt


то в программе мы получим значение Path

c:<символ табуляции>estM.txt


Как эту "фичу" обойти?
Хотелось бы получить строку как она есть.
archimed7592
Цитата(Klabush @ 14.1.2008, 13:38) *
Как эту "фичу" обойти?
Хотелось бы получить строку как она есть.

1. Писать в ini Path=c:\\test\\77.txt
2. Парсить ini руками.
Klabush
Цитата(archimed7592 @ 14.1.2008, 13:45) *
1. Писать в ini Path=c:\\test\\77.txt


Очень умно, ага. ;)
И, главное, удобно и понятно будет использовать такую программу (особенно "не посвящённым" в волшебное таинство С++). :angry:
archimed7592
Ну, не посвящённым в таинства С++ админам не составляет труда писать reg файлы(реестр), а так дело твоё - можешь выбрать ручной парсинг. Кстати, в случае xml-настроек тоже нужно "экранировать" некоторые символы. Да и вообще, ini устарел :).
ViGOur
Цитата(archimed7592 @ 14.1.2008, 14:14) *
Ну, не посвящённым в таинства С++ админам не составляет труда писать reg файлы(реестр),
Угу, особенно под *nix! :)
Неее, походу должно быть другое решение, просто как вариант можно использовать обратные слэши:
Цитата
[Common]
Path=c:/test/77.txt
Но те кто не посвящен в таинства могут по привычке вбить и обычные виндовые, а потом будут гадать или программера доставать: "почему не работает!". :)
kuler
а у меня проблема наоборот, нужно сохранить ключ abc/def, а он делает ветку abc а в ней ключ def. Символ подавления \ не срабатывает
Litkevich Yuriy
kuler, код приведи, как ты это делаешь
kuler
QSettings settings("Unit", "Subunit");
settings.setValue("af\/vb", "xxx");
хотел бы чтоб был ключ af/vb со значением xxx
Litkevich Yuriy
судя по примерам в описании класса QSettings, это возможно.
Ты какой формат используешь и на какой системе?

ага, я кажется понял. слэш всяко будет суб ключи создавать, но ты можешь и обращатся в той же манере к ним как и записывал:
 QSettings settings;
settings.setValue("animal/snake", 58);
settings.value("animal/snake", 1024).toInt();   // returns 58
settings.value("animal/zebra", 1024).toInt();   // returns 1024
settings.value("animal/zebra").toInt();         // returns 0
AD
Цитата(Litkevich Yuriy @ 10.11.2008, 14:39) *
 settings.value("animal/snake", 1024).toInt();   // returns 58
settings.value("animal/zebra", 1024).toInt();   // returns 1024
settings.value("animal/zebra").toInt();         // returns 0

Юра, поясни, пожалуйста, пример. То ли опечатка в примере, то ли я что-то не так понимаю?
kuler
AD,
это из хелпа
AD
Цитата(kuler @ 10.11.2008, 15:13) *
AD,
это из хелпа

Какая разница? Какова вероятность, что выдаст значение 1024, 58 или 0??? :)))
kuler
выдает 58, тк такое значение есть, выдает 1024 тк animal/zebra нет, выдает 0, тк не установлено значение по умолчанию (до этого было 1024)
Litkevich Yuriy
Цитата(AD @ 10.11.2008, 20:24) *
Какая разница? Какова вероятность, что выдаст значение 1024, 58 или 0??? ))
ты бы хоть асистент открыл что ли :(
AD
Цитата(Litkevich Yuriy @ 10.11.2008, 18:07) *
ты бы хоть асистент открыл что ли

Сорри. Виноват.... Да я реестром пользуюсь, при этом, можно сказать, активно - просто не заметил что в первой строчке кода строка отличается от двух других - показалось, что во всех 3 строках ключ одинаковый. Бывает.... виноват.
molchanoviv
Подниму старую тему. Может кому-то понадобится. чтобы не писать свой парсер INI-файлов я просто скоприовал файл, и заменил там \ на \\ прочел нужные пути, а затем просто удалил копию. Но этот костыль лучше применять только в случае если трогать чужую инишку нельзя.

        QFile data(path);
    QString line;
    if (data.open(QFile::ReadOnly))
    {
        data.copy("tmpfile");
        data.close();
    }
    QFile file("tmpfile");
    if (file.open(QFile::ReadWrite))
    {
        QTextStream in(&file);
        line = in.readAll();
        line.replace(QString("\\"), QString("\\\\"));
        in <<line;
        file.close();
    }
    QSettings workplace(file.fileName(), QSettings::IniFormat);
        //считываем нужные параметры
        file.remove();
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Форум IP.Board © 2001-2023 IPS, Inc.