Методы хранения данных / настроек приложения без реестра? - PullRequest
1 голос
/ 25 ноября 2010

Мне нужны некоторые методы хранения и получения данных из файла (в приложении WIN32 api c ++, а не в MFC или .NET)

например. сохранение x, y, ширины и высоты окна при его закрытии и загрузка данных при открытии окна.

Я пробовал файлы .ini с функциями - WritePrivateProfileString и ReadPrivateProfileString / Int, но в MSDN написано

"Эта функция предоставляется только для совместимости с 16-разрядными приложениями для Windows. Приложения должны хранить информацию об инициализации в реестре."

и когда я попытался на 64-битной машине с Windows7 прочитать INI-файл, я получил синий экран! (в режиме отладки с Visual Studio) O.O

Я заметил, что большинство других приложений используют XML для хранения данных, но я понятия не имею, как читать / записывать XML-данные в C ++. Существуют ли какие-либо библиотеки или функции Windows, которые позволят мне использовать XML-данные?

Любые другие предложения тоже будут хороши, спасибо.

Ответы [ 9 ]

3 голосов
/ 25 ноября 2010

В файлах .ini нет ничего плохого, единственная проблема с ними - где их записать. CIniFile из CodeProject - достаточно хороший класс. Файл INI должен быть помещен в %APPDATA%/<Name Of Your Application> (или %LOCALAPPDATA%\<Same Name Here>, как описано ниже).

РЕДАКТИРОВАТЬ: если мы говорим о семействе операционных систем Windows начиная с Windows 2000 и более поздних версий, то функция SHGetFolderPath - это переносимый способ получения пользовательской папки, в которой должны храниться файлы конфигурации приложения. Для хранения данных в папке romaing используйте CSIDL_APPDATA с SHGetFolderPath. Для сохранения данных в локальной папке используйте CSIDL_LOCAL_APPDATA.

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

Windows Vista и более поздние имеют расширенную функцию SHGetKnownFolderPath со своим собственным набором констант, но если вы ищете совместимость, придерживайтесь прежнего SHGetFolderPath.

2 голосов
/ 25 ноября 2010

TinyXML - это популярный и простой парсер XML для C ++.

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

Довольно просто написать свои собственные функции для чтения / записи файла в INI или аналогичном формате. Формат полностью зависит от вас, до тех пор, пока он легко понятен людям. Некоторые возможности:

; Comment
# Comment
Key = Value (standard INI format)
Key Value
Key: Value
1 голос
/ 25 ноября 2010

Вы можете использовать для этого Boost.PropertyTree .

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

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

Библиотека использует RapidXML для внутреннего использования , но скрывает синтаксический анализ и кодировкуподробности, которые позволят вам сэкономить некоторое время на реализацию (все библиотеки XML имеют свои особенности), но при этом позволяют использовать XML в качестве представления данных на диске.

0 голосов
/ 20 января 2016

Libconfig - лучшее решение в C ++, насколько я пытался. Работает мультиплатформенная с минимальным кодированием. Вы должны попробовать это!

0 голосов
/ 25 ноября 2010

Оооо, Боже мой? Вы когда-нибудь задумывались о прямолинейном решении, а не думали о фреймворке Super-Duper-all-can-do?

К сожалению ...

Вы хотите сохранить два числа между перезапусками ???

Сохранить: открыть файл, написать эти два числа, закрыть файл:

std::ifstream out(file_name);
out << x << ' ' << y;
out.close();

Загрузка: откройте файл, прочитайте эти два числа, закройте файл:

std::ifstream in(file_name);
if(!in) return error...
in >> x >> y;
if(!in) return error...
in.close();
0 голосов
/ 25 ноября 2010

Хотя INI-файлы могут быть не лучшим форматом, я думаю, что вы можете спокойно игнорировать предупреждение, которое MSDN ставит для WritePrivateProfileString и ReadPrivateProfileString.

Эти две функции НИКОГДА не исчезают. Это сломало бы ТЫСЯЧИ приложений.

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

Возможно, я ошибаюсь, но было бы очень непохоже, чтобы Microsoft сломала так много существующих приложений, как это, без веских причин. (Не то чтобы они иногда не нарушали обратную совместимость, но это привело бы к огромным проблемам с нулевой выгодой.)

0 голосов
/ 25 ноября 2010

pugixml - еще одна хорошая (и хорошо документированная) библиотека XML-анализатора. И если вам нравится переносимость, XML - лучший вариант.

0 голосов
/ 25 ноября 2010

libxml2 . Я видел довольно много мест, где он используется. Простота в использовании и множество примеров, с которых можно начать, а не обширная библиотека как таковая. И в Си, возьми его куда хочешь.

0 голосов
/ 25 ноября 2010

Давай, просто сохрани нужные данные в текстовом файле.Вы также можете написать тонкий API-интерфейс для этой функции.В чем проблема?

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