crossplatform.ru

Здравствуйте, гость ( Вход | Регистрация )

2 страниц V   1 2 >  
Ответить в данную темуНачать новую тему
Klabush
  опции профиля:
сообщение 14.1.2008, 13:38
Сообщение #1


Новичок


Группа: Новичок
Сообщений: 8
Регистрация: 10.10.2007
Пользователь №: 7

Спасибо сказали: 0 раз(а)




Репутация:   0  


Обычно из инишки данные читаются как-то так:

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
  опции профиля:
сообщение 14.1.2008, 13:45
Сообщение #2


Участник
**

Группа: Участник
Сообщений: 127
Регистрация: 27.12.2007
Из: Moscow
Пользователь №: 56

Спасибо сказали: 0 раз(а)




Репутация:   0  


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

1. Писать в ini Path=c:\\test\\77.txt
2. Парсить ini руками.
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
Klabush
  опции профиля:
сообщение 14.1.2008, 14:01
Сообщение #3


Новичок


Группа: Новичок
Сообщений: 8
Регистрация: 10.10.2007
Пользователь №: 7

Спасибо сказали: 0 раз(а)




Репутация:   0  


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


Очень умно, ага. ;)
И, главное, удобно и понятно будет использовать такую программу (особенно "не посвящённым" в волшебное таинство С++). :angry:

Сообщение отредактировал Klabush - 14.1.2008, 14:03
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
archimed7592
  опции профиля:
сообщение 14.1.2008, 14:14
Сообщение #4


Участник
**

Группа: Участник
Сообщений: 127
Регистрация: 27.12.2007
Из: Moscow
Пользователь №: 56

Спасибо сказали: 0 раз(а)




Репутация:   0  


Ну, не посвящённым в таинства С++ админам не составляет труда писать reg файлы(реестр), а так дело твоё - можешь выбрать ручной парсинг. Кстати, в случае xml-настроек тоже нужно "экранировать" некоторые символы. Да и вообще, ini устарел :).
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
ViGOur
  опции профиля:
сообщение 14.1.2008, 14:18
Сообщение #5


Мастер
******

Группа: Модератор
Сообщений: 3296
Регистрация: 9.10.2007
Из: Москва
Пользователь №: 4

Спасибо сказали: 231 раз(а)




Репутация:   40  


Цитата(archimed7592 @ 14.1.2008, 14:14) *
Ну, не посвящённым в таинства С++ админам не составляет труда писать reg файлы(реестр),
Угу, особенно под *nix! :)
Неее, походу должно быть другое решение, просто как вариант можно использовать обратные слэши:
Цитата
[Common]
Path=c:/test/77.txt
Но те кто не посвящен в таинства могут по привычке вбить и обычные виндовые, а потом будут гадать или программера доставать: "почему не работает!". :)

Сообщение отредактировал ViGOur - 14.1.2008, 14:19
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
kuler
  опции профиля:
сообщение 10.11.2008, 11:24
Сообщение #6


Танцор диско
***

Группа: Участник
Сообщений: 441
Регистрация: 11.9.2008
Из: Москва
Пользователь №: 289

Спасибо сказали: 6 раз(а)




Репутация:   -1  


а у меня проблема наоборот, нужно сохранить ключ abc/def, а он делает ветку abc а в ней ключ def. Символ подавления \ не срабатывает
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
Litkevich Yuriy
  опции профиля:
сообщение 10.11.2008, 14:06
Сообщение #7


разработчик РЭА
*******

Группа: Сомодератор
Сообщений: 9669
Регистрация: 9.1.2008
Из: Тюмень
Пользователь №: 64

Спасибо сказали: 807 раз(а)




Репутация:   94  


kuler, код приведи, как ты это делаешь
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
kuler
  опции профиля:
сообщение 10.11.2008, 14:15
Сообщение #8


Танцор диско
***

Группа: Участник
Сообщений: 441
Регистрация: 11.9.2008
Из: Москва
Пользователь №: 289

Спасибо сказали: 6 раз(а)




Репутация:   -1  


QSettings settings("Unit", "Subunit");
settings.setValue("af\/vb", "xxx");
хотел бы чтоб был ключ af/vb со значением xxx
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
Litkevich Yuriy
  опции профиля:
сообщение 10.11.2008, 14:39
Сообщение #9


разработчик РЭА
*******

Группа: Сомодератор
Сообщений: 9669
Регистрация: 9.1.2008
Из: Тюмень
Пользователь №: 64

Спасибо сказали: 807 раз(а)




Репутация:   94  


судя по примерам в описании класса 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
  опции профиля:
сообщение 10.11.2008, 14:55
Сообщение #10


Профессионал
*****

Группа: Участник
Сообщений: 2003
Регистрация: 4.2.2008
Из: S-Petersburg
Пользователь №: 84

Спасибо сказали: 70 раз(а)




Репутация:   17  


Цитата(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
  опции профиля:
сообщение 10.11.2008, 15:13
Сообщение #11


Танцор диско
***

Группа: Участник
Сообщений: 441
Регистрация: 11.9.2008
Из: Москва
Пользователь №: 289

Спасибо сказали: 6 раз(а)




Репутация:   -1  


AD,
это из хелпа
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
AD
  опции профиля:
сообщение 10.11.2008, 17:24
Сообщение #12


Профессионал
*****

Группа: Участник
Сообщений: 2003
Регистрация: 4.2.2008
Из: S-Petersburg
Пользователь №: 84

Спасибо сказали: 70 раз(а)




Репутация:   17  


Цитата(kuler @ 10.11.2008, 15:13) *
AD,
это из хелпа

Какая разница? Какова вероятность, что выдаст значение 1024, 58 или 0??? :)))
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
kuler
  опции профиля:
сообщение 10.11.2008, 17:27
Сообщение #13


Танцор диско
***

Группа: Участник
Сообщений: 441
Регистрация: 11.9.2008
Из: Москва
Пользователь №: 289

Спасибо сказали: 6 раз(а)




Репутация:   -1  


выдает 58, тк такое значение есть, выдает 1024 тк animal/zebra нет, выдает 0, тк не установлено значение по умолчанию (до этого было 1024)
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
Litkevich Yuriy
  опции профиля:
сообщение 10.11.2008, 18:07
Сообщение #14


разработчик РЭА
*******

Группа: Сомодератор
Сообщений: 9669
Регистрация: 9.1.2008
Из: Тюмень
Пользователь №: 64

Спасибо сказали: 807 раз(а)




Репутация:   94  


Цитата(AD @ 10.11.2008, 20:24) *
Какая разница? Какова вероятность, что выдаст значение 1024, 58 или 0??? ))
ты бы хоть асистент открыл что ли :(
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
AD
  опции профиля:
сообщение 10.11.2008, 18:37
Сообщение #15


Профессионал
*****

Группа: Участник
Сообщений: 2003
Регистрация: 4.2.2008
Из: S-Petersburg
Пользователь №: 84

Спасибо сказали: 70 раз(а)




Репутация:   17  


Цитата(Litkevich Yuriy @ 10.11.2008, 18:07) *
ты бы хоть асистент открыл что ли

Сорри. Виноват.... Да я реестром пользуюсь, при этом, можно сказать, активно - просто не заметил что в первой строчке кода строка отличается от двух других - показалось, что во всех 3 строках ключ одинаковый. Бывает.... виноват.

Сообщение отредактировал AD - 10.11.2008, 18:38
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
molchanoviv
  опции профиля:
сообщение 30.12.2009, 17:38
Сообщение #16


Старейший участник
****

Группа: Сомодератор
Сообщений: 597
Регистрация: 18.7.2008
Из: Саратов
Пользователь №: 238

Спасибо сказали: 41 раз(а)




Репутация:   5  


Подниму старую тему. Может кому-то понадобится. чтобы не писать свой парсер 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();
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение

2 страниц V   1 2 >
Быстрый ответОтветить в данную темуНачать новую тему
Теги
Нет тегов для показа


1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0


RSS Рейтинг@Mail.ru Текстовая версия Сейчас: 7.5.2025, 9:59