Поиск:

Ответ в темуСоздание новой темы Создание опроса
> [Qt] QSettings::registerFormat("ext", rf, wf); Что должны выполнять "rf" и "wf" ??? 
:(
    Опции темы
andrew_121
Дата 24.3.2008, 13:41 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Кодофей
****


Профиль
Группа: Завсегдатай
Сообщений: 3448
Регистрация: 3.1.2008

Репутация: 11
Всего: 33



Доброго времени суток.
Подскажите, каким образом ф-ции "rf" и "wf" должны читать файл в Settings::registerFormat("ext", rf, wf), и как декодировать-энкодировать данные для чтения-записи. Т.е. то что они читают-пишут понятно, данные декодирую-энкодирую я, но как их записывать
чтоб потом прочитать ??? Непонятно....
Их что-ли как-то склеивать-расклеивать нужно, записывать размер блока для последующего чтения ???
Примного благодарен.


Это сообщение отредактировал(а) andrew_121 - 24.3.2008, 13:43


--------------------
Удалил аккаунт. Прощайте!
PM MAIL   Вверх
andrew_121
Дата 24.3.2008, 15:14 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Кодофей
****


Профиль
Группа: Завсегдатай
Сообщений: 3448
Регистрация: 3.1.2008

Репутация: 11
Всего: 33



Кто нибудь, отзовитесь..............


--------------------
Удалил аккаунт. Прощайте!
PM MAIL   Вверх
andrew_121
Дата 24.3.2008, 15:47 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Кодофей
****


Профиль
Группа: Завсегдатай
Сообщений: 3448
Регистрация: 3.1.2008

Репутация: 11
Всего: 33



Ну, хоть кто-нибудь .......


--------------------
Удалил аккаунт. Прощайте!
PM MAIL   Вверх
JackYF
Дата 24.3.2008, 16:10 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


полуавантюрист
****


Профиль
Группа: Участник
Сообщений: 5814
Регистрация: 28.8.2004
Где: страна тысячи озё р

Репутация: 7
Всего: 162



andrew_121, не паникуй. Раз не отвечают, значит, не сталкивались. Неужели в документации нет примера или пояснения?


--------------------
Пожаловаться на меня как модератора можно здесь.
PM MAIL Jabber   Вверх
andrew_121
Дата 24.3.2008, 16:25 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Кодофей
****


Профиль
Группа: Завсегдатай
Сообщений: 3448
Регистрация: 3.1.2008

Репутация: 11
Всего: 33



Вот что приведенно в доках:
Format QSettings::registerFormat ( const QString & extension, ReadFunc readFunc, WriteFunc writeFunc, Qt::CaseSensitivity caseSensitivity = Qt::CaseSensitive )   [static]
Registers a custom storage format. On success, returns a special Format value that can then be passed to the QSettings constuctor. On failure, returns InvalidFormat.
The extension is the file extension associated to the format (without the '.').
The readFunc and writeFunc parameters are pointers to functions that read and write a set of (key, value) pairs. The QIODevice parameter to the read and write functions is always opened in binary mode (i.e., without the QIODevice::Text flag).
The caseSensitivity parameter specifies whether keys are case sensitive or not. This makes a difference when looking up values using QSettings. The default is case sensitive.
By default, if you use one of the constructors that work in terms of an organization name and an application name, the file system locations used are the same as for IniFormat. Use setPath() to specify other locations.
Example:
Код

 bool readXmlFile(QIODevice &device, QSettings::SettingsMap &map);
 bool writeXmlFile(QIODevice &device, const QSettings::SettingsMap &map);

 int main(int argc, char *argv[])
 {
     const QSettings::Format XmlFormat =
             QSettings::registerFormat("xml", readXmlFile, writeXmlFile);

     QSettings settings(XmlFormat, QSettings::UserSettings, "MySoft",
                        "Star Runner");

     ...
 }
Note: This function is thread-safe.

Как-бы не тупой, но.............
И в examples - ах нечего !!!!



--------------------
Удалил аккаунт. Прощайте!
PM MAIL   Вверх
SABROG
Дата 24.3.2008, 18:23 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Hacker
****


Профиль
Группа: Завсегдатай
Сообщений: 2481
Регистрация: 18.9.2006

Репутация: 81
Всего: 91



Цитата(andrew_121 @  24.3.2008,  13:41 Найти цитируемый пост)
но как их записывать
чтоб потом прочитать ??? Непонятно....


Вот типдефы этих функций:

Цитата

bool myWriteFunc(QIODevice &device, const QSettings::SettingsMap &map);
bool myReadFunc(QIODevice &device, QSettings::SettingsMap &map);


Вот определение SettingsMap:

Цитата

Typedef for QMap<QString, QVariant>.

По сути обычный массив Ключ=Значение (как в ini файлах)

Если я правильно понимаю логику, то при входе в myReadFunc у нас есть открытый файл с нашим расширением и указатель QIODevice для работы с этим файлом, т.е. мы сами читаем что надо. Если сравнить прототипы функций, то напрашивается мысль, что отсутствие const для map говорит о том, что мы должны сами заполнять его по переданной ссылки.

При входе в функцию myWriteFunc у нас есть заполенный map, это те данные, который мы должны записать имея указатель на открытый файл переданный как указатель на класс QIODevice.

Т.е. в любом случае мы ограничены интерфейсом "Ключ=Значение". А ключ уже может быть хоть индексом массива, хоть примари ключем базы данных.

Т.е. функции разовые, насколько я понял, 1 раз все считывается в map и 1 раз все махом сохраняется из map. Т.е. следить за указателями не нужно.

Это сообщение отредактировал(а) SABROG - 24.3.2008, 18:30


--------------------
Национальная группа Russian Federation на QtCentre.
PM MAIL   Вверх
andrew_121
Дата 24.3.2008, 18:34 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Кодофей
****


Профиль
Группа: Завсегдатай
Сообщений: 3448
Регистрация: 3.1.2008

Репутация: 11
Всего: 33



SABROG, Спасибо за помощь, то-что ф-циям передается "QIODevice &" и "QSettings::SettingsMap &", понятно,
а допустим, я хочу зашифровать ключ и значение каким-то алгоритмом, зашифровал, записал, хочу прочитать, И ОП-ЛЯ попал...
Какая позиция в файле у третьего ключа ??? Ааааа..........
Вот я о чем .........

Это сообщение отредактировал(а) andrew_121 - 24.3.2008, 18:39


--------------------
Удалил аккаунт. Прощайте!
PM MAIL   Вверх
SABROG
Дата 24.3.2008, 18:41 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Hacker
****


Профиль
Группа: Завсегдатай
Сообщений: 2481
Регистрация: 18.9.2006

Репутация: 81
Всего: 91



Обычно шифруют чем-то и расшифровывают тем же, заставь пользователя вводить логин и пароль и расшифровывай. Хоть третий ключ, хоть двадцатый. Зависит от структуры которую выбереш.

Ты же никакой информации не предоставляешь! Я могу сейчас заксорить файл какой-нибудь однобайтовым значением, который вобью с закрытыми глазами. Прога его зашифрует, а потом я приду на форум и спрошу че делать, заксорил файл, а чем разксоривать не знаю...

Функции вызываются один раз (я уверен в этом на 80%), поэтому тебе не нужно думать о том, что программа спросит тебя достать из файла ключ с номером 666, а ты будешь стоять на ключе 13. Твоя задача заполнить map один раз, от нуля до конца и забыть.

Вот еще что добавлю. Если собираешься держать ключи и значения в двоичном файле, то придется придумать свою структуру по которой сможешь определить смещение любого ключа в файле. Для этого в начале файла отводится хидер, под готорый отводится энное количество байт. В него пихается информация о количестве ключей. А чтобы не сканировать весь файл (если он несколько гигабайт) сразу после инфы о количестве ключей идут подрят такое же количество 4х байтовых смещений в файле, где каждое смещение равно адресу значения (или пары ключ=значение). Поэтому чтобы достучаться до любого параметра, достаточно считать такой хидер в массив и по индексу получать смещения в файле.

Понятно, если файл будет двоичным и не установить рамки в виде максимальной длинны ключа и значения, то информацию в таком файле надо будет стирать полностью и записывать из map'a заново всю структуру.

Это сообщение отредактировал(а) SABROG - 24.3.2008, 18:53


--------------------
Национальная группа Russian Federation на QtCentre.
PM MAIL   Вверх
andrew_121
Дата 24.3.2008, 19:13 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Кодофей
****


Профиль
Группа: Завсегдатай
Сообщений: 3448
Регистрация: 3.1.2008

Репутация: 11
Всего: 33



Цитата

Хоть третий ключ, хоть двадцатый.

А где он, третий ключ ???
Цитата

Функции вызываются один раз (я уверен в этом на 80%)

А мне кажется что это калбаки.



--------------------
Удалил аккаунт. Прощайте!
PM MAIL   Вверх
SABROG
Дата 24.3.2008, 20:25 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Hacker
****


Профиль
Группа: Завсегдатай
Сообщений: 2481
Регистрация: 18.9.2006

Репутация: 81
Всего: 91



Цитата(andrew_121 @  24.3.2008,  19:13 Найти цитируемый пост)
А где он, третий ключ ???

Сказал бы я где  smile 
Код

QSettings *pSettings = new блаблабла;
qDebug() << pSettings->value("третий ключег мну пожалста!"); // и Qt начинает "шуршать" свой заполненный QMap, который заполнял ты во время старта программы...


Цитата(andrew_121 @  24.3.2008,  19:13 Найти цитируемый пост)
А мне кажется что это калбаки.


Калбэки не будут пихать указатель на целый QMap, максимум - требование возвратить QVariant'ное value по QString'у в параметре.


--------------------
Национальная группа Russian Federation на QtCentre.
PM MAIL   Вверх
andrew_121
Дата 24.3.2008, 21:04 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Кодофей
****


Профиль
Группа: Завсегдатай
Сообщений: 3448
Регистрация: 3.1.2008

Репутация: 11
Всего: 33



Сделал, но УВЫ...
Код

bool read_e64_file(QIODevice &device, QSettings::SettingsMap &map) {
    EncBase64 dec;
    QByteArray key, val, dec_key, dec_val;
    int cnt = 0, key_size = 0, val_size = 0;
    QDataStream s(&device);
    /**/
    s >> cnt;
    for ( int idx = 0; idx < cnt; idx++ ) {
        s >> key_size >> val_size;
        key.resize(key_size+1);
        val.resize(val_size+1);
        s.readRawData( key.data(), key_size );
        s.readRawData( val.data(), val_size );
        /**/
        dec.decode( &dec_key, &key );
        dec.decode( &dec_val, &val );
        /**/
        map[dec_key] = dec_val;
    }
    return true;
}

Код

e64 = QSettings::registerFormat("e64", read_e64_file, write_e64_file );
set = new QSettings(e64, QSettings::UserScope, organization, application);

Функции даже не вызываются !

Это сообщение отредактировал(а) andrew_121 - 24.3.2008, 23:40


--------------------
Удалил аккаунт. Прощайте!
PM MAIL   Вверх
SABROG
Дата 24.3.2008, 21:26 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Hacker
****


Профиль
Группа: Завсегдатай
Сообщений: 2481
Регистрация: 18.9.2006

Репутация: 81
Всего: 91



Цитата(andrew_121 @  24.3.2008,  21:04 Найти цитируемый пост)
Сделал, но УВЫ...


Ты хочешь, чтобы тебе помогли разобраться или уже просто опустил руки ?

Ни ошибок, ни отчетов, ни того как должно работать, ничего. Непонятно вообще что искать, если неизвестна даже ошибка, одно слово "УВЫ".

[Ю]зер, [О]ператор
Ю - Алло, техподдержка ?
О - Да, что случилось ?
Ю - Я купил ваш компьютер, а он не работает! Хелп!
Ю - вы меня слышите ?
Ю - ну ответьте же что-нибудь!
Ю - кто-нибудь Ауууу...



--------------------
Национальная группа Russian Federation на QtCentre.
PM MAIL   Вверх
archimed7592
Дата 24.3.2008, 21:40 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Архимед
****


Профиль
Группа: Завсегдатай
Сообщений: 2531
Регистрация: 12.6.2004
Где: Moscow

Репутация: 11
Всего: 93



Цитата(andrew_121 @  24.3.2008,  21:04 Найти цитируемый пост)
Сделал, но УВЫ...

Думаю, начать стоит с корректной реализации ф-ции записи, а уж потом писать ф-цию чтения.
Корректная реализация - это как минимум та, которая позволяет потом однозначно трактовать записанные данные.


--------------------
If you have an apple and I have an apple and we exchange apples then you and I will still each have one apple. But if you have an idea and I have an idea and we exchange these ideas, then each of us will have two ideas.
© George Bernard Shaw
PM Jabber   Вверх
andrew_121
Дата 24.3.2008, 21:43 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Кодофей
****


Профиль
Группа: Завсегдатай
Сообщений: 3448
Регистрация: 3.1.2008

Репутация: 11
Всего: 33



Я не из ТАКИХ, не первый год кодирую.
Сделал все как пологаеться, но эти функторы даже не вызываются !!!


--------------------
Удалил аккаунт. Прощайте!
PM MAIL   Вверх
andrew_121
Дата 24.3.2008, 21:58 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Кодофей
****


Профиль
Группа: Завсегдатай
Сообщений: 3448
Регистрация: 3.1.2008

Репутация: 11
Всего: 33



SABROG:
Цитата

Ни ошибок, ни отчетов, ни того как должно работать, ничего. Непонятно вообще что искать, если неизвестна даже ошибка, одно слово "УВЫ".


Расмешил, хоть какая-то радость СеГоДнЯ !!!..........


Добавлено через 5 минут и 45 секунд
archimed7592, а чЁ у меня предупреждений аЖ 10% ась ...?


--------------------
Удалил аккаунт. Прощайте!
PM MAIL   Вверх
Ответ в темуСоздание новой темы Создание опроса
Правила форума "С/С++: Кроссплатформенное программирование, QT/Gtk+/wxWidgets"
JackYF
Любитель
  • В заголовке темы в квадратных скобках обозначьте используемую вами библиотеку, например: [QT],[GTK],[wx].
  • Если вопрос актуален только для некоторой версии библиотеки, либо, если вы пользуетесь не самой последней версией, укажите это. Например: [QT4], [GTK2].
  • Все начинающие изучать Qt - не забудьте зайти сюда.
  • Проставьте несколько ключевых слов темы, чтобы её можно было легче найти.
  • В вопросе укажите полную версию версию библиотеки, а также все дополнительные используемые программные пакеты.
  • Не забывайте пользоваться кнопкой "Код".
  • Телепатов на форуме нет! Задавайте чёткий, конкретный и полный вопрос. Указывайте полностью ошибки компилятора и компоновщика.
  • Новое сообщение должно иметь прямое отношение к тематике этого раздела. Флуд, флейм, оффтопик запрещены.
  • Категорически запрещается обсуждение вареза, "кряков", взлома программ и т.д.

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, JackYF, Любитель.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | С/С++: Кроссплатформенное программирование, Qt/Gtk+/wxWidgets | Следующая тема »


 




[ Время генерации скрипта: 0.0925 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.