Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > С/С++: Кроссплатформенное программирование, Qt/Gtk+/wxWidgets > [Qt] QSettings::registerFormat("ext", rf, wf);


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

Автор: andrew_121 24.3.2008, 15:14
Кто нибудь, отзовитесь..............

Автор: andrew_121 24.3.2008, 15:47
Ну, хоть кто-нибудь .......

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

Автор: andrew_121 24.3.2008, 16:25
Вот что приведенно в доках:
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 - ах нечего !!!!

Автор: SABROG 24.3.2008, 18:23
Цитата(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. Т.е. следить за указателями не нужно.

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

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

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

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

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

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

Автор: andrew_121 24.3.2008, 19:13
Цитата

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

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

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

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

Автор: SABROG 24.3.2008, 20:25
Цитата(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'у в параметре.

Автор: andrew_121 24.3.2008, 21:04
Сделал, но УВЫ...
Код

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);

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

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


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

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

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

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

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

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

Автор: andrew_121 24.3.2008, 21:58
SABROG:
Цитата

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


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


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

Автор: SABROG 24.3.2008, 22:09
Цитата(andrew_121 @  24.3.2008,  21:43 Найти цитируемый пост)
функторы даже не вызываются 


А че рассмешил то ? Я вот об этом и говорю.

Файлик на чтение точно есть в "user's home directory" ? Что пишет в консоли ?

Похоже на допрос, как будто это нам нужно. Вот это действительно смешно  smile 

Автор: archimed7592 24.3.2008, 23:03
Цитата(andrew_121 @  24.3.2008,  21:58 Найти цитируемый пост)
archimed7592, а чЁ у меня предупреждений аЖ 10% ась ...? 

Там есть поле "причина" - весьма информативное поле.

andrew_121, если хотите помощи, то стоит немного сбавить гонор. В частности, у не первый год программирующего человека сабжевого вопроса даже не возникло бы.

P.S. andrew_121, где надо форматированием не пользуетесь, где не надо - пользуетесь. Выглядит немного нелепо.

Автор: JackYF 24.3.2008, 23:18

 ! 
JackYF
andrew_121, тема про Qt, а не про предупреждения юзеров. Разборки в соответствующий раздел.

Автор: Любитель 25.3.2008, 14:54
1. Где функция записи?
2. Формат зарегился нормально? registerFormat не вернула InvalidFormat?

Добавлено через 1 минуту и 37 секунд
PS Зачем кстати QSettigns динамически создавать. Тем более без парента...

Добавлено через 2 минуты и 37 секунд
Ах да - с чего ты решил, что функция тут же должна вызваться? Вполне возможно, что это просходит при первом чтении чего-либо.

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)